From 2a6dddcdb4492ec84f9457fe1a0130bb4fa7f5f8 Mon Sep 17 00:00:00 2001
From: linjj <850658129@qq.com>
Date: Fri, 27 Mar 2026 12:46:44 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=9A=E6=97=B6=E8=BD=AE?=
=?UTF-8?q?=E8=AF=A2=E4=BB=BB=E5=8A=A1=E6=9F=A5=E8=AF=A2=E5=BD=93=E5=89=8D?=
=?UTF-8?q?=E6=97=B6=E9=97=B4=E5=89=8D3=E5=A4=A9=E5=BD=93=E5=A4=A9?=
=?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 26 ++++
.../impl/MedicalAdviceServiceImpl.java | 12 +-
.../example/utils/PdfToDoubleLayerOFD.java | 100 ++++++++++++++
.../resources/mapper/ArchiveMasterMapper.xml | 4 +-
.../com/example/DemoApplicationTests.java | 125 ++++++++++++++----
5 files changed, 233 insertions(+), 34 deletions(-)
create mode 100644 src/main/java/com/example/utils/PdfToDoubleLayerOFD.java
diff --git a/pom.xml b/pom.xml
index 5852ff2..c6ec445 100644
--- a/pom.xml
+++ b/pom.xml
@@ -60,6 +60,32 @@
mybatis-plus-generator
${mybatisPlus.version}
+
+
+
+
+ org.ofdrw
+ ofdrw-layout
+ 1.20.2
+
+
+
+ org.apache.pdfbox
+ pdfbox
+ 2.0.27
+
+
+ org.apache.pdfbox
+ jbig2-imageio
+ 3.0.3
+
+
+
+ net.sourceforge.tess4j
+ tess4j
+ 5.10.0
+
+
mysql
mysql-connector-java
diff --git a/src/main/java/com/example/duplicate/service/impl/MedicalAdviceServiceImpl.java b/src/main/java/com/example/duplicate/service/impl/MedicalAdviceServiceImpl.java
index c52e0eb..f807b9d 100644
--- a/src/main/java/com/example/duplicate/service/impl/MedicalAdviceServiceImpl.java
+++ b/src/main/java/com/example/duplicate/service/impl/MedicalAdviceServiceImpl.java
@@ -88,12 +88,14 @@ public class MedicalAdviceServiceImpl implements MedicalAdviceService {
GenerateQueue(tasks, printParam, 5, collectId);
log.info("轮询增加任务成功,id为:" + tasks.getId());
}
- }else {
- //存在任务将任务表状态改为0为开始
- archiveOtherExtMapper.updateStatic(tasks.getId(), collectId);
- //存放队列消息
- GenerateQueue(tasks, printParam, 5, collectId);
}
+ //定时增加的任务理论上不存在有任务
+// else {
+// //存在任务将任务表状态改为0为开始
+// archiveOtherExtMapper.updateStatic(tasks.getId(), collectId);
+// //存放队列消息
+// GenerateQueue(tasks, printParam, 5, collectId);
+// }
log.info("轮询增加任务成功,id为:" + tasks.getId());
} catch (Exception e) {
log.error("轮询增加任务失败,id为:" + tasks.getId(), e);
diff --git a/src/main/java/com/example/utils/PdfToDoubleLayerOFD.java b/src/main/java/com/example/utils/PdfToDoubleLayerOFD.java
new file mode 100644
index 0000000..64412ff
--- /dev/null
+++ b/src/main/java/com/example/utils/PdfToDoubleLayerOFD.java
@@ -0,0 +1,100 @@
+package com.example.utils;
+
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.rendering.PDFRenderer;
+import org.ofdrw.layout.OFDDoc;
+import org.ofdrw.layout.PageLayout;
+import org.ofdrw.layout.element.*;
+import org.ofdrw.layout.element.canvas.Canvas;
+import org.ofdrw.core.basicStructure.pageObj.Page;
+import net.sourceforge.tess4j.ITesseract;
+import net.sourceforge.tess4j.Tesseract;
+import net.sourceforge.tess4j.Word;
+import org.ofdrw.layout.element.canvas.Drawer;
+import org.ofdrw.layout.element.canvas.FontSetting;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+
+/**
+ * @ClassName PdfToDoubleLayerOFD
+ * @Description
+ * @Author linjj
+ * @Date 2025/8/4 14:53
+ * @Version 1.0
+ */
+public class PdfToDoubleLayerOFD {
+
+ public static void main(String[] args) throws Exception {
+ String pdfPath = "E:\\work\\pdf\\1.pdf"; // 源 PDF
+ String ofdPath = "E:\\work\\pdf\\2.ofd"; // 目标 OFD
+ String tessPath = "E:\\work\\ocr"; // Tesseract 语言包目录
+
+ //加载 PDF
+ PDDocument pdfDoc = PDDocument.load(new File(pdfPath));
+ PDFRenderer renderer = new PDFRenderer(pdfDoc);
+ //初始化 OCR
+ ITesseract tesseract = new Tesseract();
+ tesseract.setDatapath(tessPath);
+ tesseract.setLanguage("chi_sim+eng");
+
+ try (OFDDoc ofdDoc = new OFDDoc(Paths.get(ofdPath))) {
+ for (int i = 0; i < pdfDoc.getNumberOfPages(); i++) {
+ try {
+ BufferedImage image = renderer.renderImageWithDPI(i, 150);
+ if (image == null) {
+ System.err.println("警告: 第 " + (i+1) + " 页渲染失败");
+ continue;
+ }
+
+ File tempImage = File.createTempFile("page", ".png");
+ ImageIO.write(image, "png", tempImage);
+
+ PageLayout layout = new PageLayout((double) image.getWidth(), (double) image.getHeight());
+ ofdDoc.setDefaultPageLayout(layout);
+
+ // 添加图像层
+ ofdDoc.add(new Img(tempImage.toPath())
+ .setPosition(Position.Absolute)
+ .setX(0d).setY(0d)
+ .setWidth((double) image.getWidth())
+ .setHeight((double) image.getHeight()));
+
+ // 添加文字层
+ Canvas canvas = new Canvas((double) image.getWidth(), (double) image.getHeight());
+ int finalI = i;
+ canvas.setDrawer(ctx -> {
+ try {
+ List words = tesseract.getWords(image, ITesseract.RenderedFormat.HOCR.ordinal());
+ if (words.isEmpty()) {
+ System.err.println("警告: 第 " + (finalI +1) + " 页OCR未识别到文字");
+ }
+ for (Word word : words) {
+ double x = word.getBoundingBox().getX();
+ double y = image.getHeight() - word.getBoundingBox().getY() - word.getBoundingBox().getHeight();
+ ctx.setFont(FontSetting.getInstance(8.0));
+ ctx.setFillColor(0, 0, 0);
+ ctx.fillText(word.getText(), x, y);
+ }
+ } catch (Exception e) {
+ System.err.println("OCR处理错误: " + e.getMessage());
+ }
+ });
+ ofdDoc.add(canvas);
+
+ } catch (Exception e) {
+ System.err.println("处理第 " + (i+1) + " 页时出错: " + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+ }
+ pdfDoc.close();
+ System.out.println("✅ 双层 OFD 完成:" + ofdPath);
+ }
+}
+
+
diff --git a/src/main/resources/mapper/ArchiveMasterMapper.xml b/src/main/resources/mapper/ArchiveMasterMapper.xml
index 31f1051..59ad21a 100644
--- a/src/main/resources/mapper/ArchiveMasterMapper.xml
+++ b/src/main/resources/mapper/ArchiveMasterMapper.xml
@@ -6,8 +6,8 @@