Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit c85e57c

Browse files
author
litongjava
committedApr 28, 2024
change to use rapid-ocr-java
1 parent 08f3535 commit c85e57c

File tree

29 files changed

+152
-2264
lines changed

29 files changed

+152
-2264
lines changed
 

‎app.properties‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#Thu Nov 23 02:43:23 HST 2023
1+
#Sun Apr 28 04:53:24 HST 2024
22
recName=ch_PP-OCRv3_rec_infer
33
model=model
44
keysName=ppocr_keys_v1.txt

‎pom.xml‎

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.luooqi</groupId>
88
<artifactId>tools-ocr</artifactId>
9-
<version>2.2.9</version>
9+
<version>2.3.0</version>
1010

1111
<properties>
1212
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -57,41 +57,17 @@
5757
<version>${logback.version}</version>
5858
</dependency>
5959

60-
<!-- 服务器端推理引擎 -->
60+
<!--rapidocr-->
6161
<dependency>
62-
<groupId>ai.djl</groupId>
63-
<artifactId>api</artifactId>
64-
<version>${djl.version}</version>
65-
</dependency>
66-
<dependency>
67-
<groupId>ai.djl</groupId>
68-
<artifactId>basicdataset</artifactId>
69-
<version>${djl.version}</version>
70-
</dependency>
71-
<dependency>
72-
<groupId>ai.djl</groupId>
73-
<artifactId>model-zoo</artifactId>
74-
<version>${djl.version}</version>
75-
</dependency>
76-
77-
<!-- ONNX 无NDArray ,需要借用pytorch-->
78-
<dependency>
79-
<groupId>ai.djl.pytorch</groupId>
80-
<artifactId>pytorch-engine</artifactId>
81-
<version>${djl.version}</version>
82-
<scope>runtime</scope>
83-
</dependency>
84-
<!-- ONNX -->
85-
<dependency>
86-
<groupId>ai.djl.onnxruntime</groupId>
87-
<artifactId>onnxruntime-engine</artifactId>
88-
<version>${djl.version}</version>
62+
<groupId>io.github.mymonstercat</groupId>
63+
<artifactId>rapidocr</artifactId>
64+
<version>0.0.7</version>
8965
</dependency>
9066

9167
<dependency>
92-
<groupId>ai.djl.opencv</groupId>
93-
<artifactId>opencv</artifactId>
94-
<version>${djl.version}</version>
68+
<groupId>io.github.mymonstercat</groupId>
69+
<artifactId>rapidocr-onnx-platform</artifactId>
70+
<version>0.0.7</version>
9571
</dependency>
9672

9773
<dependency>

‎src/main/java/com/benjaminwan/ocrlibrary/OcrEngine.java‎

Lines changed: 0 additions & 120 deletions
This file was deleted.

‎src/main/java/com/benjaminwan/ocrlibrary/OcrFailed.java‎

Lines changed: 0 additions & 9 deletions
This file was deleted.

‎src/main/java/com/benjaminwan/ocrlibrary/OcrOutput.java‎

Lines changed: 0 additions & 5 deletions
This file was deleted.

‎src/main/java/com/benjaminwan/ocrlibrary/OcrResult.java‎

Lines changed: 0 additions & 54 deletions
This file was deleted.

‎src/main/java/com/benjaminwan/ocrlibrary/OcrStop.java‎

Lines changed: 0 additions & 9 deletions
This file was deleted.

‎src/main/java/com/benjaminwan/ocrlibrary/Point.java‎

Lines changed: 0 additions & 51 deletions
This file was deleted.

‎src/main/java/com/benjaminwan/ocrlibrary/TextBlock.java‎

Lines changed: 0 additions & 79 deletions
This file was deleted.

‎src/main/java/com/litongjava/djl/paddle/ocr/v4/OcrV4DetExample.java‎

Lines changed: 0 additions & 51 deletions
This file was deleted.

‎src/main/java/com/litongjava/djl/paddle/ocr/v4/OcrV4RecExample.java‎

Lines changed: 0 additions & 131 deletions
This file was deleted.

‎src/main/java/com/litongjava/djl/paddle/ocr/v4/common/ImageUtils.java‎

Lines changed: 0 additions & 241 deletions
This file was deleted.

‎src/main/java/com/litongjava/djl/paddle/ocr/v4/common/RotatedBox.java‎

Lines changed: 0 additions & 47 deletions
This file was deleted.

‎src/main/java/com/litongjava/djl/paddle/ocr/v4/common/RotatedBoxCompX.java‎

Lines changed: 0 additions & 46 deletions
This file was deleted.

‎src/main/java/com/litongjava/djl/paddle/ocr/v4/detection/OCRDetectionTranslator.java‎

Lines changed: 0 additions & 525 deletions
This file was deleted.

‎src/main/java/com/litongjava/djl/paddle/ocr/v4/detection/OcrV4Detection.java‎

Lines changed: 0 additions & 36 deletions
This file was deleted.

‎src/main/java/com/litongjava/djl/paddle/ocr/v4/opencv/NDArrayUtils.java‎

Lines changed: 0 additions & 236 deletions
This file was deleted.

‎src/main/java/com/litongjava/djl/paddle/ocr/v4/opencv/OpenCVUtils.java‎

Lines changed: 0 additions & 60 deletions
This file was deleted.

‎src/main/java/com/litongjava/djl/paddle/ocr/v4/recognition/OcrV4Recognition.java‎

Lines changed: 0 additions & 154 deletions
This file was deleted.

‎src/main/java/com/litongjava/djl/paddle/ocr/v4/recognition/PpWordRecTranslator.java‎

Lines changed: 0 additions & 121 deletions
This file was deleted.

‎src/main/java/com/luooqi/ocr/controller/ProcessController.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.luooqi.ocr.controller;
22

33
import com.luooqi.ocr.utils.CommUtils;
4+
45
import javafx.geometry.Insets;
56
import javafx.geometry.Pos;
67
import javafx.scene.Scene;
Lines changed: 13 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,114 +1,34 @@
11
package com.luooqi.ocr.local;
22

3-
import ai.djl.MalformedModelException;
4-
import ai.djl.inference.Predictor;
5-
import ai.djl.modality.cv.Image;
6-
import ai.djl.ndarray.NDList;
7-
import ai.djl.ndarray.NDManager;
8-
import ai.djl.opencv.OpenCVImageFactory;
9-
import ai.djl.repository.zoo.ModelNotFoundException;
10-
import ai.djl.repository.zoo.ModelZoo;
11-
import ai.djl.repository.zoo.ZooModel;
12-
import com.litongjava.djl.paddle.ocr.v4.common.RotatedBox;
13-
import com.litongjava.djl.paddle.ocr.v4.common.RotatedBoxCompX;
14-
import com.litongjava.djl.paddle.ocr.v4.detection.OcrV4Detection;
15-
import com.litongjava.djl.paddle.ocr.v4.recognition.OcrV4Recognition;
16-
173
import java.io.File;
18-
import java.io.IOException;
19-
import java.nio.file.Path;
20-
import java.util.ArrayList;
21-
import java.util.Collections;
22-
import java.util.List;
4+
5+
import com.benjaminwan.ocrlibrary.OcrResult;
6+
7+
import io.github.mymonstercat.Model;
8+
import io.github.mymonstercat.ocr.InferenceEngine;
239

2410
/**
2511
* Created by litonglinux@qq.com on 11/23/2023_2:09 AM
2612
*/
2713
public enum PaddlePaddleOCRV4 {
2814
INSTANCE;
29-
private static OcrV4Detection detection;
30-
private static OcrV4Recognition recognition;
31-
private static Predictor<Image, NDList> detector;
32-
private static Predictor<Image, String> recognizer;
33-
private static NDManager manager;
34-
35-
PaddlePaddleOCRV4() {
36-
}
37-
38-
39-
//noting not to do.but init
40-
public static void init() throws ModelNotFoundException, MalformedModelException, IOException {
41-
detection = new OcrV4Detection();
42-
recognition = new OcrV4Recognition();
43-
ZooModel detectionModel = null;
44-
ZooModel recognitionModel = null;
4515

46-
detectionModel = ModelZoo.loadModel(detection.chDetCriteria());
47-
recognitionModel = ModelZoo.loadModel(recognition.chRecCriteria());
16+
static InferenceEngine engine = null;
4817

49-
detector = detectionModel.newPredictor();
50-
51-
recognizer = recognitionModel.newPredictor();
52-
manager = NDManager.newBaseManager();
18+
PaddlePaddleOCRV4() {
5319

5420
}
5521

56-
public String ocr(File imageFile) throws Exception {
57-
Path path = imageFile.toPath();
58-
Image image = OpenCVImageFactory.getInstance().fromFile(path);
59-
return ocr(image);
22+
// noting not to do.but init
23+
public static void init() {
24+
engine = InferenceEngine.getInstance(Model.ONNX_PPOCR_V4_SERVER);
6025
}
6126

62-
public String ocr(Image image) throws Exception {
63-
List<RotatedBox> detections = recognition.predict(manager, image, detector, recognizer);
64-
if (detections == null) {
65-
return null;
66-
}
67-
68-
List<RotatedBox> initList = new ArrayList<>();
69-
for (RotatedBox result : detections) {
70-
// put low Y value at the head of the queue.
71-
initList.add(result);
72-
}
73-
Collections.sort(initList);
74-
75-
List<ArrayList<RotatedBoxCompX>> lines = new ArrayList<>();
76-
List<RotatedBoxCompX> line = new ArrayList<>();
77-
RotatedBoxCompX firstBox = new RotatedBoxCompX(initList.get(0).getBox(), initList.get(0).getText());
78-
line.add(firstBox);
79-
lines.add((ArrayList) line);
80-
for (int i = 1; i < initList.size(); i++) {
81-
RotatedBoxCompX tmpBox = new RotatedBoxCompX(initList.get(i).getBox(), initList.get(i).getText());
82-
float y1 = firstBox.getBox().toFloatArray()[1];
83-
float y2 = tmpBox.getBox().toFloatArray()[1];
84-
float dis = Math.abs(y2 - y1);
85-
if (dis < 20) { // 认为是同 1 行 - Considered to be in the same line
86-
line.add(tmpBox);
87-
} else { // 换行 - Line break
88-
firstBox = tmpBox;
89-
Collections.sort(line);
90-
line = new ArrayList<>();
91-
line.add(firstBox);
92-
lines.add((ArrayList) line);
93-
}
94-
}
95-
96-
97-
StringBuffer fullText = new StringBuffer();
98-
for (int i = 0; i < lines.size(); i++) {
99-
for (int j = 0; j < lines.get(i).size(); j++) {
100-
String text = lines.get(i).get(j).getText();
101-
if (text.trim().equals(""))
102-
continue;
103-
fullText.append(text + " ");
104-
}
105-
fullText.append('\n');
106-
}
107-
return fullText.toString();
27+
public OcrResult ocr(File imageFile) {
28+
return engine.runOcr(imageFile.getAbsolutePath());
10829
}
10930

11031
public void close() {
111-
detector.close();
112-
recognizer.close();
32+
11333
}
11434
}

‎src/main/java/com/luooqi/ocr/snap/ScreenCapture.java‎

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11

22
package com.luooqi.ocr.snap;
33

4-
import cn.hutool.core.swing.ScreenUtil;
5-
import cn.hutool.log.StaticLog;
4+
import java.awt.AWTException;
5+
import java.awt.Rectangle;
6+
import java.awt.Robot;
7+
import java.awt.image.BufferedImage;
8+
69
import com.luooqi.ocr.model.CaptureInfo;
710
import com.luooqi.ocr.utils.CommUtils;
811
import com.luooqi.ocr.windows.MainForm;
12+
13+
import cn.hutool.core.swing.ScreenUtil;
14+
import cn.hutool.log.StaticLog;
915
import javafx.animation.AnimationTimer;
1016
import javafx.application.Platform;
1117
import javafx.embed.swing.SwingFXUtils;
@@ -17,15 +23,18 @@
1723
import javafx.scene.input.KeyCode;
1824
import javafx.scene.input.KeyEvent;
1925
import javafx.scene.input.MouseButton;
20-
import javafx.scene.layout.*;
26+
import javafx.scene.layout.Background;
27+
import javafx.scene.layout.BackgroundImage;
28+
import javafx.scene.layout.BackgroundPosition;
29+
import javafx.scene.layout.BackgroundRepeat;
30+
import javafx.scene.layout.BackgroundSize;
31+
import javafx.scene.layout.BorderPane;
32+
import javafx.scene.layout.Pane;
2133
import javafx.scene.paint.Color;
2234
import javafx.scene.text.Font;
2335
import javafx.scene.text.FontWeight;
2436
import javafx.stage.Stage;
2537

26-
import java.awt.*;
27-
import java.awt.image.BufferedImage;
28-
2938
/**
3039
* This is the Window which is used from the user to draw the rectangle representing an area on the screen to be captured.
3140
*
@@ -353,23 +362,23 @@ private void repaintCanvas() {
353362

354363
// smart calculation of where the mouse has been dragged
355364
data.rectWidth = (data.mouseXNow > data.mouseXPressed) ? data.mouseXNow - data.mouseXPressed // RIGHT
356-
: data.mouseXPressed - data.mouseXNow // LEFT
365+
: data.mouseXPressed - data.mouseXNow // LEFT
357366
;
358367
data.rectHeight = (data.mouseYNow > data.mouseYPressed) ? data.mouseYNow - data.mouseYPressed // DOWN
359-
: data.mouseYPressed - data.mouseYNow // UP
368+
: data.mouseYPressed - data.mouseYNow // UP
360369
;
361370

362371
data.rectUpperLeftX = // -------->UPPER_LEFT_X
363-
(data.mouseXNow > data.mouseXPressed) ? data.mouseXPressed // RIGHT
364-
: data.mouseXNow// LEFT
372+
(data.mouseXNow > data.mouseXPressed) ? data.mouseXPressed // RIGHT
373+
: data.mouseXNow// LEFT
365374
;
366375
data.rectUpperLeftY = // -------->UPPER_LEFT_Y
367-
(data.mouseYNow > data.mouseYPressed) ? data.mouseYPressed // DOWN
368-
: data.mouseYNow // UP
376+
(data.mouseYNow > data.mouseYPressed) ? data.mouseYPressed // DOWN
377+
: data.mouseYNow // UP
369378
;
370379

371380
gc.strokeRect(data.rectUpperLeftX - 1.00, data.rectUpperLeftY - 1.00, data.rectWidth + 2.00,
372-
data.rectHeight + 2.00);
381+
data.rectHeight + 2.00);
373382
gc.clearRect(data.rectUpperLeftX, data.rectUpperLeftY, data.rectWidth, data.rectHeight);
374383

375384
// draw the text
@@ -378,10 +387,10 @@ private void repaintCanvas() {
378387
gc.setLineWidth(1);
379388
gc.setFill(Color.FIREBRICK);
380389
gc.fillRect(middle - 77, data.rectUpperLeftY < 50 ? data.rectUpperLeftY + 2 : data.rectUpperLeftY - 18.00, 100,
381-
18);
390+
18);
382391
gc.setFill(Color.WHITE);
383392
gc.fillText(data.rectWidth + " * " + data.rectHeight, middle - 77 + 9,
384-
data.rectUpperLeftY < 50 ? data.rectUpperLeftY + 17.00 : data.rectUpperLeftY - 4.00);
393+
data.rectUpperLeftY < 50 ? data.rectUpperLeftY + 17.00 : data.rectUpperLeftY - 4.00);
385394
}
386395
}
387396

@@ -418,8 +427,8 @@ public void prepareForCapture() {
418427
mainCanvas.setCursor(Cursor.CROSSHAIR);
419428
initGraphContent();
420429
rootPane.setBackground(new Background(new BackgroundImage(fxImage, BackgroundRepeat.NO_REPEAT,
421-
BackgroundRepeat.NO_REPEAT, BackgroundPosition.CENTER,
422-
new BackgroundSize(CaptureInfo.ScreenWidth, CaptureInfo.ScreenHeight, false, false, true, true))));
430+
BackgroundRepeat.NO_REPEAT, BackgroundPosition.CENTER,
431+
new BackgroundSize(CaptureInfo.ScreenWidth, CaptureInfo.ScreenHeight, false, false, true, true))));
423432
repaintCanvas();
424433
stage.setScene(scene);
425434
stage.setFullScreenExitHint("");
@@ -439,8 +448,8 @@ private void prepareImage() {
439448
try {
440449
mainCanvas.setDisable(true);
441450
image = new Robot().createScreenCapture(new Rectangle(data.rectUpperLeftX + CaptureInfo.ScreenMinX,
442-
data.rectUpperLeftY + (int) CommUtils.getCrtScreen(stage).getVisualBounds().getMinY(), data.rectWidth,
443-
data.rectHeight));
451+
data.rectUpperLeftY + (int) CommUtils.getCrtScreen(stage).getVisualBounds().getMinY(), data.rectWidth,
452+
data.rectHeight));
444453
} catch (AWTException ex) {
445454
StaticLog.error(ex);
446455
return;

‎src/main/java/com/luooqi/ocr/utils/OcrUtils.java‎

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,24 @@
11
package com.luooqi.ocr.utils;
22

3-
import ai.djl.modality.cv.Image;
4-
import ai.djl.opencv.OpenCVImageFactory;
3+
import java.awt.Point;
4+
import java.awt.image.BufferedImage;
5+
import java.io.File;
6+
import java.io.FileOutputStream;
7+
import java.util.ArrayList;
8+
import java.util.Arrays;
9+
import java.util.HashMap;
10+
import java.util.List;
11+
import java.util.Map;
12+
13+
import javax.imageio.ImageIO;
14+
15+
import org.apache.pdfbox.pdmodel.PDDocument;
16+
import org.apache.pdfbox.rendering.PDFRenderer;
17+
18+
import com.benjaminwan.ocrlibrary.OcrResult;
19+
import com.luooqi.ocr.local.PaddlePaddleOCRV4;
20+
import com.luooqi.ocr.model.TextBlock;
21+
522
import cn.hutool.core.codec.Base64;
623
import cn.hutool.core.io.FileUtil;
724
import cn.hutool.core.lang.UUID;
@@ -17,29 +34,13 @@
1734
import cn.hutool.json.JSONObject;
1835
import cn.hutool.json.JSONUtil;
1936
import cn.hutool.log.StaticLog;
20-
import com.benjaminwan.ocrlibrary.OcrResult;
21-
import com.luooqi.ocr.local.PaddlePaddleOCRV4;
22-
import com.luooqi.ocr.model.TextBlock;
23-
import org.apache.pdfbox.pdmodel.PDDocument;
24-
import org.apache.pdfbox.rendering.PDFRenderer;
25-
26-
import javax.imageio.ImageIO;
27-
import java.awt.*;
28-
import java.awt.image.BufferedImage;
29-
import java.awt.image.DataBufferInt;
30-
import java.io.File;
31-
import java.io.FileOutputStream;
32-
import java.io.InputStream;
33-
import java.util.List;
34-
import java.util.*;
3537

3638
/**
3739
* tools-ocr
3840
* Created by 何志龙 on 2019-03-22.
3941
*/
4042
public class OcrUtils {
4143

42-
4344
public static String recImgLocal(byte[] imgData) {
4445
String path = "tmp_" + Math.abs(Arrays.hashCode(imgData)) + ".png";
4546
File file = FileUtil.writeBytes(imgData, path);
@@ -54,7 +55,7 @@ public static String recImgLocal(BufferedImage image) {
5455
public static String recImgLocal(File file) {
5556
if (file.exists()) {
5657
try {
57-
return PaddlePaddleOCRV4.INSTANCE.ocr(file);
58+
return extractLocalResult(PaddlePaddleOCRV4.INSTANCE.ocr(file));
5859
} catch (Exception e) {
5960
e.printStackTrace();
6061
return e.getMessage();
@@ -63,7 +64,6 @@ public static String recImgLocal(File file) {
6364
return "文件不存在";
6465
}
6566

66-
6767
public static String recPdfLocal(File pdfFile) {
6868
if (pdfFile.exists()) {
6969
try (PDDocument document = PDDocument.load(pdfFile)) {
@@ -90,19 +90,18 @@ public static String recPdfLocal(File pdfFile) {
9090
return null;
9191
}
9292

93-
9493
public static String ocrImg(byte[] imgData) {
9594
int i = Math.abs(UUID.randomUUID().hashCode()) % 4;
9695
StaticLog.info("OCR Engine: " + i);
9796
switch (i) {
98-
case 0:
99-
return bdGeneralOcr(imgData);
100-
case 1:
101-
return bdAccurateOcr(imgData);
102-
case 2:
103-
return sogouMobileOcr(imgData);
104-
default:
105-
return sogouWebOcr(imgData);
97+
case 0:
98+
return bdGeneralOcr(imgData);
99+
case 1:
100+
return bdAccurateOcr(imgData);
101+
case 2:
102+
return sogouMobileOcr(imgData);
103+
default:
104+
return sogouWebOcr(imgData);
106105
}
107106
}
108107

@@ -115,7 +114,8 @@ private static String bdAccurateOcr(byte[] imgData) {
115114
}
116115

117116
private static String bdBaseOcr(byte[] imgData, String type) {
118-
String[] urlArr = new String[]{"http://ai.baidu.com/tech/ocr/general", "http://ai.baidu.com/index/seccode?action=show"};
117+
String[] urlArr = new String[] { "http://ai.baidu.com/tech/ocr/general",
118+
"http://ai.baidu.com/index/seccode?action=show" };
119119
StringBuilder cookie = new StringBuilder();
120120
for (String url : urlArr) {
121121
HttpResponse cookieResp = WebUtils.get(url);
@@ -129,17 +129,20 @@ private static String bdBaseOcr(byte[] imgData, String type) {
129129
HashMap<String, String> header = new HashMap<>();
130130
header.put("Referer", "http://ai.baidu.com/tech/ocr/general");
131131
header.put("Cookie", cookie.toString());
132-
String data = "type=" + URLUtil.encodeQuery(type) + "&detect_direction=false&image_url&image=" + URLUtil.encodeQuery("data:image/jpeg;base64," + Base64.encode(imgData)) + "&language_type=CHN_ENG";
132+
String data = "type=" + URLUtil.encodeQuery(type) + "&detect_direction=false&image_url&image="
133+
+ URLUtil.encodeQuery("data:image/jpeg;base64," + Base64.encode(imgData)) + "&language_type=CHN_ENG";
133134
HttpResponse response = WebUtils.postRaw("http://ai.baidu.com/aidemo", data, 0, header);
134135
return extractBdResult(WebUtils.getSafeHtml(response));
135136
}
136137

137138
public static String sogouMobileOcr(byte[] imgData) {
138139
String boundary = "------WebKitFormBoundary8orYTmcj8BHvQpVU";
139140
String url = "http://ocr.shouji.sogou.com/v2/ocr/json";
140-
String header = boundary + "\r\nContent-Disposition: form-data; name=\"pic\"; filename=\"pic.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n";
141+
String header = boundary
142+
+ "\r\nContent-Disposition: form-data; name=\"pic\"; filename=\"pic.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n";
141143
String footer = "\r\n" + boundary + "--\r\n";
142-
byte[] postData = CommUtils.mergeByte(header.getBytes(CharsetUtil.CHARSET_ISO_8859_1), imgData, footer.getBytes(CharsetUtil.CHARSET_ISO_8859_1));
144+
byte[] postData = CommUtils.mergeByte(header.getBytes(CharsetUtil.CHARSET_ISO_8859_1), imgData,
145+
footer.getBytes(CharsetUtil.CHARSET_ISO_8859_1));
143146
return extractSogouResult(CommUtils.postMultiData(url, postData, boundary.substring(2)));
144147
}
145148

@@ -148,7 +151,8 @@ public static String sogouWebOcr(byte[] imgData) {
148151
String referer = "https://deepi.sogou.com/?from=picsearch&tdsourcetag=s_pctim_aiomsg";
149152
String imageData = Base64.encode(imgData);
150153
long t = System.currentTimeMillis();
151-
String sign = SecureUtil.md5("sogou_ocr_just_for_deepibasicOpenOcr" + t + imageData.substring(0, Math.min(1024, imageData.length())) + "4b66a37108dab018ace616c4ae07e644");
154+
String sign = SecureUtil.md5("sogou_ocr_just_for_deepibasicOpenOcr" + t
155+
+ imageData.substring(0, Math.min(1024, imageData.length())) + "4b66a37108dab018ace616c4ae07e644");
152156
Map<String, Object> data = new HashMap<>();
153157
data.put("image", imageData);
154158
data.put("lang", "zh-Chs");
@@ -178,7 +182,7 @@ private static String extractSogouResult(String html) {
178182
JSONObject jObj = jsonArray.getJSONObject(i);
179183
TextBlock textBlock = new TextBlock();
180184
textBlock.setText(jObj.getStr("content").trim());
181-
//noinspection SuspiciousToArrayCall
185+
// noinspection SuspiciousToArrayCall
182186
String[] frames = jObj.getJSONArray("frame").toArray(new String[0]);
183187
textBlock.setTopLeft(CommUtils.frameToPoint(frames[0]));
184188
textBlock.setTopRight(CommUtils.frameToPoint(frames[1]));
@@ -205,7 +209,7 @@ private static String extractBdResult(String html) {
205209
JSONObject jObj = jsonArray.getJSONObject(i);
206210
TextBlock textBlock = new TextBlock();
207211
textBlock.setText(jObj.getStr("words").trim());
208-
//noinspection SuspiciousToArrayCall
212+
// noinspection SuspiciousToArrayCall
209213
JSONObject location = jObj.getJSONObject("location");
210214
int top = location.getInt("top");
211215
int left = location.getInt("left");
@@ -220,7 +224,6 @@ private static String extractBdResult(String html) {
220224
return CommUtils.combineTextBlocks(textBlocks, isEng);
221225
}
222226

223-
224227
private static String extractLocalResult(OcrResult ocrResult) {
225228
if (ocrResult == null) {
226229
return "";
@@ -240,5 +243,4 @@ private static String extractLocalResult(OcrResult ocrResult) {
240243
return CommUtils.combineTextBlocks(textBlocks, isEng);
241244
}
242245

243-
244246
}

‎src/main/java/com/luooqi/ocr/windows/MainForm.java‎

Lines changed: 39 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
package com.luooqi.ocr.windows;
22

3-
import ai.djl.MalformedModelException;
4-
import ai.djl.repository.zoo.ModelNotFoundException;
5-
import cn.hutool.core.io.FileTypeUtil;
6-
import cn.hutool.core.thread.ThreadUtil;
7-
import cn.hutool.core.util.StrUtil;
8-
import cn.hutool.log.StaticLog;
3+
import java.awt.image.BufferedImage;
4+
import java.io.File;
5+
import java.util.HashMap;
6+
import java.util.Map;
7+
98
import com.luooqi.ocr.config.InitConfig;
109
import com.luooqi.ocr.controller.ProcessController;
1110
import com.luooqi.ocr.local.PaddlePaddleOCRV4;
@@ -14,6 +13,11 @@
1413
import com.luooqi.ocr.snap.ScreenCapture;
1514
import com.luooqi.ocr.utils.CommUtils;
1615
import com.luooqi.ocr.utils.OcrUtils;
16+
17+
import cn.hutool.core.io.FileTypeUtil;
18+
import cn.hutool.core.thread.ThreadUtil;
19+
import cn.hutool.core.util.StrUtil;
20+
import cn.hutool.log.StaticLog;
1721
import javafx.application.Platform;
1822
import javafx.beans.property.SimpleStringProperty;
1923
import javafx.geometry.Insets;
@@ -23,20 +27,20 @@
2327
import javafx.scene.control.ToolBar;
2428
import javafx.scene.input.Clipboard;
2529
import javafx.scene.input.DataFormat;
26-
import javafx.scene.layout.*;
30+
import javafx.scene.layout.Border;
31+
import javafx.scene.layout.BorderPane;
32+
import javafx.scene.layout.BorderStroke;
33+
import javafx.scene.layout.BorderStrokeStyle;
34+
import javafx.scene.layout.BorderWidths;
35+
import javafx.scene.layout.CornerRadii;
36+
import javafx.scene.layout.HBox;
2737
import javafx.scene.paint.Color;
2838
import javafx.scene.text.Font;
2939
import javafx.scene.text.FontPosture;
3040
import javafx.stage.FileChooser;
3141
import javafx.stage.Stage;
3242
import lombok.extern.slf4j.Slf4j;
3343

34-
import java.awt.image.BufferedImage;
35-
import java.io.File;
36-
import java.io.IOException;
37-
import java.util.HashMap;
38-
import java.util.Map;
39-
4044
/**
4145
* Created by litonglinux@qq.com on 12/9/2023_4:40 PM
4246
*/
@@ -54,8 +58,8 @@ public int hashCode() {
5458
private static ScreenCapture screenCapture;
5559
private static ProcessController processController;
5660
private static TextArea textArea;
57-
//private static boolean isSegment = true;
58-
//private static String ocrText = "";
61+
// private static boolean isSegment = true;
62+
// private static String ocrText = "";
5963

6064
public void init(Stage primaryStage) {
6165

@@ -84,29 +88,24 @@ public void init(Stage primaryStage) {
8488
root.setTop(topBar);
8589
root.setCenter(textArea);
8690
root.setBottom(footerBar);
87-
root.getStylesheets().addAll(
88-
getClass().getResource("/css/main.css").toExternalForm()
89-
);
91+
root.getStylesheets().addAll(getClass().getResource("/css/main.css").toExternalForm());
9092
CommUtils.initStage(primaryStage);
9193
mainScene = new Scene(root, 670, 470);
9294
stage.setScene(mainScene);
93-
//启动引擎,加载模型,如果模型加载错误下屏幕显示错误
95+
// 启动引擎,加载模型,如果模型加载错误下屏幕显示错误
9496
try {
9597
PaddlePaddleOCRV4.init();
96-
} catch (ModelNotFoundException e) {
97-
textArea.setText("加载模型出现错误" + e.getMessage());
98-
} catch (MalformedModelException e) {
99-
textArea.setText("加载模型出现错误" + e.getMessage());
100-
} catch (IOException e) {
101-
textArea.setText("加载模型出现错误" + e.getMessage());
98+
} catch (Exception e) {
99+
e.printStackTrace();
102100
}
103101
}
104102

105103
private TextArea getCenter() {
106104
TextArea textArea = new TextArea();
107105
textArea.setId("ocrTextArea");
108106
textArea.setWrapText(true);
109-
textArea.setBorder(new Border(new BorderStroke(Color.DARKGRAY, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths.DEFAULT)));
107+
textArea.setBorder(
108+
new Border(new BorderStroke(Color.DARKGRAY, BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths.DEFAULT)));
110109
textArea.setFont(Font.font("Arial", FontPosture.REGULAR, 14));
111110
return textArea;
112111
}
@@ -116,21 +115,21 @@ private ToolBar getFooterBar() {
116115
footerBar.setId("statsToolbar");
117116
Label statsLabel = new Label();
118117
SimpleStringProperty statsProperty = new SimpleStringProperty("总字数:0");
119-
textArea.textProperty().addListener((observable, oldValue, newValue) -> statsProperty.set("总字数:" + newValue.replaceAll(CommUtils.SPECIAL_CHARS, "").length()));
118+
textArea.textProperty().addListener((observable, oldValue, newValue) -> statsProperty
119+
.set("总字数:" + newValue.replaceAll(CommUtils.SPECIAL_CHARS, "").length()));
120120
statsLabel.textProperty().bind(statsProperty);
121121
footerBar.getItems().add(statsLabel);
122122
return footerBar;
123123
}
124124

125125
private HBox getTopBar() {
126-
HBox topBar = new HBox(
127-
CommUtils.createButton("snapBtn", MainForm::screenShotOcr, "截图"),
128-
CommUtils.createButton("openImageBtn", this::openImageOcr, "打开"),
129-
CommUtils.createButton("copyBtn", this::copyText, "复制"),
130-
CommUtils.createButton("pasteBtn", this::pasteText, "粘贴"),
131-
CommUtils.createButton("clearBtn", this::clearText, "清空"),
132-
CommUtils.createButton("wrapBtn", this::wrapText, "换行")
133-
//CommUtils.SEPARATOR, resetBtn, segmentBtn
126+
HBox topBar = new HBox(CommUtils.createButton("snapBtn", MainForm::screenShotOcr, "截图"),
127+
CommUtils.createButton("openImageBtn", this::openImageOcr, "打开"),
128+
CommUtils.createButton("copyBtn", this::copyText, "复制"),
129+
CommUtils.createButton("pasteBtn", this::pasteText, "粘贴"),
130+
CommUtils.createButton("clearBtn", this::clearText, "清空"),
131+
CommUtils.createButton("wrapBtn", this::wrapText, "换行")
132+
// CommUtils.SEPARATOR, resetBtn, segmentBtn
134133
);
135134
topBar.setId("topBar");
136135
topBar.setMinHeight(40);
@@ -157,7 +156,6 @@ private void wrapText() {
157156
textArea.setWrapText(!textArea.isWrapText());
158157
}
159158

160-
161159
private void clearText() {
162160
textArea.setText("");
163161
}
@@ -167,9 +165,8 @@ private void pasteText() {
167165
if (StrUtil.isBlank(text)) {
168166
return;
169167
}
170-
textArea.setText(textArea.getText()
171-
+ (StrUtil.isBlank(textArea.getText()) ? "" : "\n")
172-
+ Clipboard.getSystemClipboard().getString());
168+
textArea.setText(textArea.getText() + (StrUtil.isBlank(textArea.getText()) ? "" : "\n")
169+
+ Clipboard.getSystemClipboard().getString());
173170
}
174171

175172
private void copyText() {
@@ -198,24 +195,22 @@ public static void screenShotOcr() {
198195
private void openImageOcr() {
199196
FileChooser fileChooser = new FileChooser();
200197
fileChooser.setTitle("Please Select Image File");
201-
String[] extensions = {"*.png", "*.jpg", "*.pdf", "*.PDF"};
198+
String[] extensions = { "*.png", "*.jpg", "*.pdf", "*.PDF" };
202199
fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("Image Files", extensions));
203200
File selectedFile = fileChooser.showOpenDialog(stage);
204201
if (selectedFile == null || !selectedFile.isFile()) {
205202
return;
206203
}
207-
stageInfo = new StageInfo(stage.getX(), stage.getY(),
208-
stage.getWidth(), stage.getHeight(), stage.isFullScreen());
204+
stageInfo = new StageInfo(stage.getX(), stage.getY(), stage.getWidth(), stage.getHeight(), stage.isFullScreen());
209205

210206
try {
211-
//BufferedImage image = ImageIO.read(selectedFile);
207+
// BufferedImage image = ImageIO.read(selectedFile);
212208
doOcr(selectedFile);
213209
} catch (Exception e) {
214210
StaticLog.error(e);
215211
}
216212
}
217213

218-
219214
public static void cancelSnap() {
220215
Platform.runLater(screenCapture::cancelSnap);
221216
}

‎src/main/resources/images/01.png‎

287 KB
Loading

‎src/test/java/com/benjaminwan/ocrlibrary/OcrEngineTest.java‎

Lines changed: 0 additions & 47 deletions
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.litongjava;
2+
3+
import com.benjaminwan.ocrlibrary.OcrResult;
4+
5+
import io.github.mymonstercat.Model;
6+
import io.github.mymonstercat.ocr.InferenceEngine;
7+
8+
public class RapidOcrTest {
9+
public static void main(String[] args) {
10+
InferenceEngine engine = InferenceEngine.getInstance(Model.ONNX_PPOCR_V4_SERVER);
11+
OcrResult ocrResult = engine.runOcr("images/01.png");
12+
System.out.println(ocrResult.getStrRes().trim());
13+
}
14+
}

‎src/test/java/com/luooqi/ocr/utils/OcrUtilsTest.java‎

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,12 @@
11
package com.luooqi.ocr.utils;
22

3-
import cn.hutool.core.swing.ScreenUtil;
4-
import cn.hutool.json.JSONArray;
5-
import cn.hutool.json.JSONObject;
6-
import cn.hutool.json.JSONUtil;
7-
import com.luooqi.ocr.model.TextBlock;
8-
import javafx.scene.SnapshotParameters;
9-
import org.junit.Test;
10-
11-
import java.awt.*;
3+
import java.awt.GraphicsConfiguration;
4+
import java.awt.GraphicsEnvironment;
5+
import java.awt.Point;
126
import java.awt.geom.AffineTransform;
137
import java.io.File;
14-
import java.util.ArrayList;
15-
import java.util.Collections;
16-
import java.util.Comparator;
17-
import java.util.List;
8+
9+
import org.junit.Test;
1810

1911
public class OcrUtilsTest {
2012

@@ -32,7 +24,8 @@ private Point frameToPoint(String text) {
3224

3325
@Test
3426
public void sogouWebOcr() {
35-
GraphicsConfiguration asdf = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
27+
GraphicsConfiguration asdf = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
28+
.getDefaultConfiguration();
3629
AffineTransform asfd2 = asdf.getDefaultTransform();
3730
double scaleX = asfd2.getScaleX();
3831
double scaleY = asfd2.getScaleY();
@@ -46,7 +39,7 @@ public void recPdfLocal() {
4639
}
4740

4841
@Test
49-
public void recImageLocal(){
42+
public void recImageLocal() {
5043
OcrUtils.recImgLocal(new File("temp_1010298_4.png"));
5144
}
5245
}

0 commit comments

Comments
 (0)
Please sign in to comment.