import com.jiajia.common_object.*;
import com.jiajia.core.JiaJiaOCR;
import org.apache.commons.lang3.tuple.Pair;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.util.ArrayList;
import java.util.List;
import static com.jiajia.common_object.PdfConvert.convertPdfToImages;
public class JiaJiaOCR2Demo {
public static void main(String... args) {
String imgPath = "test.jpg";
}
public static void generalOCRTest(String imgPath) {
JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
List<Pair<Text, Box>> result = jiaJiaOCR.recognizeGeneralText(imgPath);
System.out.println("通用 OCR 结果:" + result);
}
public static void handwrittingOCRTest(String imgPath) {
JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
List<Pair<Text, Box>> result = jiaJiaOCR.recognizeHandwrittenText(imgPath);
System.out.println("手写 OCR 结果:" + result);
}
public static void layoutDetTest(String imgPath) {
JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
List<Layout> layoutList = jiaJiaOCR.detectLayout(imgPath);
Mat img = Imgcodecs.imread(imgPath);
drawLayoutPredictions(img, layoutList);
Imgcodecs.imwrite("layout_result.jpg", img);
System.out.println("版面检测结果已保存:" + layoutList);
}
public static void tableDetTest(String imgPath) {
JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
List<DetectionResult> tableList = jiaJiaOCR.detectTables(imgPath);
Mat img = Imgcodecs.imread(imgPath);
Mat resultMat = drawTableResults(img, tableList);
Imgcodecs.imwrite("table_detect_result.jpg", resultMat);
System.out.println("表格检测区域:" + tableList);
}
public static void tableRecTest(String imgPath) {
JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
List<Pair<Text, Box>> ocrResult = jiaJiaOCR.recognizeGeneralText(imgPath);
TableResult tableResult = jiaJiaOCR.recognizeTableFromOCR(imgPath, ocrResult);
System.out.println("表格识别 HTML 结果:" + tableResult.getHtmlContent());
}
public static void tableDetRecTest(String imgPath) {
JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
List<TableResult> tableResults = jiaJiaOCR.recognizeTables(imgPath);
for (TableResult table : tableResults) {
System.out.println("表格 HTML:" + table.getHtmlContent());
System.out.println("表格坐标:" + table.getBox());
}
}
public static void textLineDetText(String imgPath) {
JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
Boxes textLines = jiaJiaOCR.detectTextLines(imgPath);
Mat img = Imgcodecs.imread(imgPath);
drawTextLinePredictions(img, textLines);
Imgcodecs.imwrite("textline_result.jpg", img);
System.out.println("文本行检测结果:" + textLines);
}
public static void pdfOCR() throws IOException, OrtException {
String pdfPath = "How_To.pdf";
String pdfOutputDir = "pdf_image";
JiaJiaOCR jiaJiaOCR = JiaJiaOCR.builder();
List<String> pdfPathList = convertPdfToImages(pdfPath, pdfOutputDir);
for (String pdfImgPath : pdfPathList) {
List<Pair<Text, Box>> pairList = jiaJiaOCR.recognizeGeneralText(pdfImgPath);
System.out.println(pairList);
}
}
public static void drawLayoutPredictions(Mat img, List<Layout> detLayout) {
for (Layout layout : detLayout) {
int[] bbox = layout.getBbox();
Imgproc.rectangle(img, new Point(bbox[0], bbox[1]), new Point(bbox[2], bbox[3]), new Scalar(0, 0, 255), 2);
String label = layout.getLabel();
Imgproc.putText(img, label, new Point(bbox[0] + 5, bbox[1] - 10), Imgproc.FONT_HERSHEY_SIMPLEX, 0.7, new Scalar(0, 255, 0), 2);
}
}
public static Mat drawTableResults(Mat image, List<DetectionResult> results) {
Mat resultImg = image.clone();
for (DetectionResult result : results) {
String label = "表格:" + String.format("%.2f", result.getConfidence());
Imgproc.putText(resultImg, label, new Point(result.getRect().x, result.getRect().y - 10), Imgproc.FONT_HERSHEY_SIMPLEX, 1.0, new Scalar(0, 0, 255), 2);
Imgproc.rectangle(resultImg, new Point(result.getRect().x, result.getRect().y), new Point(result.getRect().x + result.getRect().width, result.getRect().y + result.getRect().height), new Scalar(0, 0, 255), 2);
}
return resultImg;
}
public static void drawTextLinePredictions(Mat img, Boxes detBoxes) {
List<Box> boxList = detBoxes.getBoxes();
for (Box box : boxList) {
double[] pos = box.getLinePosition();
Point[] points = new Point[4];
points[0] = new Point(pos[0], pos[1]);
points[1] = new Point(pos[2], pos[3]);
points[2] = new Point(pos[4], pos[5]);
points[3] = new Point(pos[6], pos[7]);
MatOfPoint polygon = new MatOfPoint(points);
List<MatOfPoint> polygons = new ArrayList<>();
polygons.add(polygon);
Imgproc.polylines(img, polygons, true, new Scalar(0, 0, 255), 1);
}
}
}