修改定时轮询任务查询当前时间前3天当天的数据

master
linjj 3 weeks ago
parent d1f42eff87
commit 2a6dddcdb4

@ -60,6 +60,32 @@
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatisPlus.version}</version>
</dependency>
<!-- OFD 核心支持 -->
<dependency>
<groupId>org.ofdrw</groupId>
<artifactId>ofdrw-layout</artifactId>
<version>1.20.2</version>
</dependency>
<!-- PDF 渲染 -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>jbig2-imageio</artifactId>
<version>3.0.3</version>
</dependency>
<!-- OCR -->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>5.10.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>

@ -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);

@ -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<Word> 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);
}
}

@ -6,8 +6,8 @@
<select id="getMedicalAdviceTask" resultType="com.example.duplicate.controller.vo.ArchiveMasterVo">
SELECT *
from archive_master
WHERE discharge_date_time >= dateadd(minute,-30, GETDATE())
FROM archive_master
WHERE CONVERT(date, discharge_date_time) = CONVERT(date, DATEADD(day, -3, GETDATE()))
</select>
<select id="getArchiveMasterByMasterId" resultType="com.example.duplicate.controller.vo.ArchiveMasterVo">
select *

@ -1,47 +1,118 @@
package com.example;
import com.example.utils.Md5Util;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.ofdrw.layout.element.canvas.DrawContext;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.Word;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.nio.file.*;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = com.example.SpringbootDemoApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class DemoApplicationTests {
/* 正则:住院号-出院时间-任意后缀 */
private static final Pattern PAT = Pattern.compile("^(\\d+)-(\\d{8})-.*");
@Test
public void contextLoads() {
String jpgPath = "E:\\pdf\\1\\2.jpg";
// 输出 PDF 文件路径
String pdfPath = "E:\\pdf\\2\\2.pdf";
public void contextLoads() throws Exception{
Path root = Paths.get("E:\\assort_imagepdf\\这些是要重新拷贝处理的图像"); // 根目录
List<Path> folders = listFolders(root); // 拿到所有一级子目录
for (Path folder : folders) {
System.out.println("======== 开始处理文件夹: " + folder);
List<Path> subFolders = listFolders(folder); // 拿到二级目录(如 641335-20170227-...
for (Path sub : subFolders) { // 逐个二级目录
String[] info = parseFolderName(sub.getFileName().toString());
if (info == null) { // 格式不对就跳过
System.out.println("格式不符,跳过:" + sub);
continue;
}
String patientId = info[0]; // 住院号
String dischargeDt = info[1]; // 出院时间
//将时间格式化
LocalDate date = LocalDate.parse(dischargeDt, DateTimeFormatter.ofPattern("yyyyMMdd"));
String fmtDischargeDt = date.format(DateTimeFormatter.ISO_LOCAL_DATE);
String caseKey = info[2]; // 病案主键
System.out.println("---- 子文件夹: " + sub);
System.out.println("住院号: " + patientId);
System.out.println("出院时间: " + dischargeDt);
System.out.println("病案主键: " + caseKey);
List<Path> pdfs = listPdfsInFolder(sub); // 只拿当前目录 PDF
//根据查询主键id
//删除文件表数据
//
try (PDDocument document = new PDDocument()) {
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
PDImageXObject pdImage = PDImageXObject.createFromFile(jpgPath, document);
try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
// 设置图片的位置和大小
contentStream.drawImage(pdImage, 0, 0, pdImage.getWidth(), pdImage.getHeight());
for (Path p : pdfs) {
System.out.println(p.toAbsolutePath()); // 只打印绝对路径
}
}
}
}
/* 解析文件夹名641335-20170227-6277c2cf527446e5a0030309fdd62622 */
private static String[] parseFolderName(String name) {
String[] parts = name.split("-");
if (parts.length < 3) return null; // 格式不对
String patientId = parts[0]; // 住院号
String dischargeDt = parts[1]; // 出院时间
String caseKey = parts[2]; // 病案主键32位
return new String[]{patientId, dischargeDt, caseKey};
}
/* 列出当前目录下的直接子目录(不递归) */
private static List<Path> listFolders(Path dir) throws IOException {
List<Path> list = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
for (Path entry : stream) {
if (Files.isDirectory(entry)) {
list.add(entry);
}
}
}
return list;
}
/* 列出当前目录下的 PDF 文件(不递归) */
private static List<Path> listPdfsInFolder(Path folder) throws IOException {
List<Path> list = new ArrayList<>();
try (DirectoryStream<Path> stream = Files.newDirectoryStream(folder, "*.pdf")) {
for (Path entry : stream) {
if (Files.isRegularFile(entry)) {
list.add(entry);
}
}
document.save(pdfPath);
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}

Loading…
Cancel
Save