diff --git a/src/main/java/com/dpkj/modules/print/service/impl/MS439PrintServiceImpl.java b/src/main/java/com/dpkj/modules/print/service/impl/MS439PrintServiceImpl.java index 42d39b6..f1b3b02 100644 --- a/src/main/java/com/dpkj/modules/print/service/impl/MS439PrintServiceImpl.java +++ b/src/main/java/com/dpkj/modules/print/service/impl/MS439PrintServiceImpl.java @@ -17,35 +17,15 @@ import com.dpkj.modules.print.enums.MS439TonerStatusEnum; import com.dpkj.modules.print.request.MS439Request; import com.dpkj.modules.print.service.MS439PrintService; import com.dpkj.modules.print.utils.FolderUtils; -import com.dpkj.modules.print.utils.FontLoader; import com.dpkj.modules.print.utils.PDFUtils; +import com.dpkj.modules.print.utils.TemplateUtil; import com.dpkj.modules.print.vo.PrinterParam; import com.dpkj.modules.print.vo.PrinterStatus; -import com.itextpdf.text.BaseColor; -import com.itextpdf.text.Document; -import com.itextpdf.text.DocumentException; -import com.itextpdf.text.Font; -import com.itextpdf.text.PageSize; -import com.itextpdf.text.pdf.BaseFont; -import com.itextpdf.text.pdf.PdfWriter; -import com.itextpdf.tool.xml.XMLWorkerFontProvider; -import com.itextpdf.tool.xml.XMLWorkerHelper; import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebApplicationContext; import org.springframework.stereotype.Service; -import org.thymeleaf.TemplateEngine; -import org.thymeleaf.context.Context; -import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver; -import org.thymeleaf.templatemode.TemplateMode; import javax.annotation.Resource; -import java.io.ByteArrayInputStream; import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -95,7 +75,7 @@ public class MS439PrintServiceImpl implements MS439PrintService { // 校验盖章机是否正常,除了HEALTHY都抛异常 if (!device.equals(MS439StampStatusEnum.HEALTHY.getPrintCode())) { throw new RRException(MS439StampStatusEnum.getPCode(device), - MS439StampStatusEnum.getMessage(device)); + MS439StampStatusEnum.getMessage(device)); } } @@ -136,11 +116,11 @@ public class MS439PrintServiceImpl implements MS439PrintService { request.getDirection()));*/ String prtData = StrUtil.format("PaperNum={};PrintType={};Stamp={};File[0]={};WaitNum={}", - request.getCopies(), // 盖章事件分数,和打印份数一致 - printType, // 打印类型1-A4或者2-A5 - request.getStamp(), // 是否盖章 - request.getFileDir(), // 要打印的文件的路径 - request.getCopies() // 盖章事件分数,和打印份数一致 + request.getCopies(), // 盖章事件分数,和打印份数一致 + printType, // 打印类型1-A4或者2-A5 + request.getStamp(), // 是否盖章 + request.getFileDir(), // 要打印的文件的路径 + request.getCopies() // 盖章事件分数,和打印份数一致 ); param.put("prtData", prtData); @@ -244,9 +224,9 @@ public class MS439PrintServiceImpl implements MS439PrintService { // 2. 准备模板数据 Map data = prepareReportData(params); // 3. 渲染Thymeleaf模板 - String htmlContent = renderThymeleafTemplate(data); + String htmlContent = TemplateUtil.renderThymeleafTemplate(data, "reportJY"); // 4. 生成PDF文件 - createPdfFromHtml(htmlContent, pdfPath); + TemplateUtil.createPdfFromHtml(htmlContent, pdfPath); return pdfPath; } catch (Exception e) { @@ -275,74 +255,61 @@ public class MS439PrintServiceImpl implements MS439PrintService { } } - private void createPdfFromHtml(String html, String outputPath) - throws IOException, DocumentException { - // 大小为A4纸 - Document document = new Document(PageSize.A4); - try (OutputStream os = Files.newOutputStream(Paths.get(outputPath))) { - PdfWriter writer = PdfWriter.getInstance(document, os); - document.open(); - - // 加载自定义字体 - BaseFont simfangFont = FontLoader.loadFont("/font/simfang.ttf"); - - // 创建自定义字体提供器 - XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider() { - @Override - public Font getFont(String fontname, String encoding, boolean embedded, float size, int style, BaseColor color) { - return new Font(simfangFont, size, style, color); - } - }; - - // 解析 HTML 并生成 PDF - XMLWorkerHelper.getInstance().parseXHtml( - writer, document, - new ByteArrayInputStream(html.getBytes(StandardCharsets.UTF_8)), - null, StandardCharsets.UTF_8, - fontProvider // 注入字体提供器 - ); - document.close(); // 这里关闭,确保 OutputStream 还没被关闭 - } - } - - // 模板渲染方法(保持不变) - private String renderThymeleafTemplate(Map data) { - // 设置模板数据 - Context context = new Context(); - context.setVariables(data); - - // 填充数据到html - TemplateEngine templateEngine = new TemplateEngine(); - SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); - resolver.setPrefix("classpath:/templates/"); - resolver.setSuffix(".html"); - resolver.setTemplateMode(TemplateMode.HTML); - resolver.setCacheable(true); - resolver.setApplicationContext(new AnnotationConfigReactiveWebApplicationContext()); - templateEngine.setTemplateResolver(resolver); - return templateEngine.process("reportJY", context); - } // 报告数据准备(根据实际业务实现) - private Map prepareReportData(JSONObject params) { + public static Map prepareReportData(JSONObject params) { Map data = new HashMap<>(); // 基本信息 Map baseInfo = new HashMap<>(); - baseInfo.put("reportId", params.getString("reportId"));// 报告id(标本编号) - baseInfo.put("lspcmName", params.getString("lspcmName"));// 标本名称 + + // 报告信息 + JSONObject printInfo = params.getJSONObject("print_info"); + baseInfo.put("reportId", printInfo.getString("reportId"));// 报告id(标本编号) + baseInfo.put("lspcmName", printInfo.getString("lspcmName"));// 标本名称 + baseInfo.put("citemContent", printInfo.getString("citemContent"));// 申请内容 + baseInfo.put("examTime", printInfo.getString("examTime")); // 检验时间 + baseInfo.put("applyTime", printInfo.getString("applyTime"));// 申请时间 + baseInfo.put("spcmClctTime", printInfo.getString("spcmClctTime")); // 采集时间 + baseInfo.put("reportTime", printInfo.getString("reportTime")); // 报告时间 + baseInfo.put("chkTime", printInfo.getString("reportTime")); // 报告审核时间 + + // 患者信息 JSONObject patInfo = params.getJSONObject("pat_info"); baseInfo.put("patName", patInfo.getString("pat_name"));// 姓名 baseInfo.put("patSex", patInfo.getString("pat_sex"));// 性别 baseInfo.put("patAge", patInfo.getString("pat_age"));// 年龄 baseInfo.put("patHomePhno", patInfo.getString("pat_home_phno"));// 电话 + baseInfo.put("idno", patInfo.getString("idno"));// 身份证号 + baseInfo.put("outpno", patInfo.getString("outpno"));// 门诊号 + baseInfo.put("inpno", patInfo.getString("inpno"));// 住院号 + baseInfo.put("contactsPhno", patInfo.getString("contacts_phno"));// 电话 + + // 就诊信息 JSONObject pv1Info = params.getJSONObject("pv1_info"); baseInfo.put("deptName", pv1Info.getString("dept_name"));// 科室 + baseInfo.put("inpWardName", pv1Info.getString("inp_ward_name"));// 病区名称 baseInfo.put("inpBedNo", pv1Info.getString("inp_bed_no"));// 床号 + baseInfo.put("rgstNo", pv1Info.getString("rgst_no"));// 挂号单号 + String patVisitType = pv1Info.getString("pat_visit_type"); + if (StrUtil.isNotEmpty(patVisitType)) { + if (StrUtil.equals("1", patVisitType)) { + patVisitType = "门诊"; + } else if (StrUtil.equals("2", patVisitType)) { + patVisitType = "住院"; + } else if (StrUtil.equals("4", patVisitType)) { + patVisitType = "体检"; + } + } + baseInfo.put("patVisitType", patVisitType);// 就诊来源 + + JSONObject applyInfoFirst = params.getJSONArray("apply_info").getJSONObject(0); - baseInfo.put("placerName", applyInfoFirst.getString("placer_name"));// 申请医生 + baseInfo.put("placerName", applyInfoFirst.getString("placer_name"));// 开单医生 baseInfo.put("spcmClctor", applyInfoFirst.getString("spcm_clctor"));// 标本采集人 - baseInfo.put("citemContent", params.getString("citemContent"));// 申请项目 + // baseInfo.put("applyTime", params.getString("apply_time"));// 开单时间 + // baseInfo.put("citemContent", params.getString("citemContent"));// 申请项目 + data.put("baseInfo", baseInfo); // 检验项目数据 @@ -369,8 +336,13 @@ public class MS439PrintServiceImpl implements MS439PrintService { return data; } - private void addItem(List> items, String name, - String value, String range, String unit, String method, String oaflag) { + public static void addItem(List> items, + String name, + String value, + String range, + String unit, + String method, + String oaflag) { Map item = new HashMap<>(); item.put("loitemCname", name);// 项目名称 item.put("orderRptResult", value);// 结果 diff --git a/src/main/java/com/dpkj/modules/print/utils/TemplateUtil.java b/src/main/java/com/dpkj/modules/print/utils/TemplateUtil.java new file mode 100644 index 0000000..386fadc --- /dev/null +++ b/src/main/java/com/dpkj/modules/print/utils/TemplateUtil.java @@ -0,0 +1,100 @@ +package com.dpkj.modules.print.utils; + +import com.itextpdf.text.BaseColor; +import com.itextpdf.text.Document; +import com.itextpdf.text.DocumentException; +import com.itextpdf.text.Font; +import com.itextpdf.text.PageSize; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.BaseFont; +import com.itextpdf.text.pdf.PdfWriter; +import com.itextpdf.tool.xml.XMLWorkerFontProvider; +import com.itextpdf.tool.xml.XMLWorkerHelper; +import org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebApplicationContext; +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.context.Context; +import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver; +import org.thymeleaf.templatemode.TemplateMode; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Map; + +/** + * @Auther: 萧道子 + * @Date: 2025/11/7 14:50 + * @Description: + */ +public class TemplateUtil { + + /** + * 渲染Thymeleaf模板 + * + * @param data : 数据 + * @param fileName : 模板文件名 + * @return java.lang.String + * @author 萧道子 2025/11/7 + */ + public static String renderThymeleafTemplate(Map data, String fileName) { + // 设置模板数据 + Context context = new Context(); + context.setVariables(data); + + // 填充数据到html + TemplateEngine templateEngine = new TemplateEngine(); + SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver(); + resolver.setPrefix("classpath:/templates/"); + resolver.setSuffix(".html"); + resolver.setTemplateMode(TemplateMode.HTML); + resolver.setCacheable(true); + resolver.setApplicationContext(new AnnotationConfigReactiveWebApplicationContext()); + templateEngine.setTemplateResolver(resolver); + return templateEngine.process(fileName, context); + } + + + public static void createPdfFromHtml(String html, String outputPath) throws IOException, DocumentException { + createPdfFromHtml(html, outputPath, PageSize.A4); + } + + /** + * 将Html转为图片 + * + * @param html : + * @param outputPath : + * @return void + * @author 萧道子 2025/11/7 + */ + public static void createPdfFromHtml(String html, String outputPath, Rectangle size) throws IOException, DocumentException { + // 大小为A4纸 + Document document = new Document(size); + try (OutputStream os = Files.newOutputStream(Paths.get(outputPath))) { + PdfWriter writer = PdfWriter.getInstance(document, os); + document.open(); + + // 加载自定义字体 + BaseFont simfangFont = FontLoader.loadFont("/font/simfang.ttf"); + + // 创建自定义字体提供器 + XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider() { + @Override + public Font getFont(String fontname, String encoding, boolean embedded, float size, int style, BaseColor color) { + return new Font(simfangFont, size, style, color); + } + }; + + // 解析 HTML 并生成 PDF + XMLWorkerHelper.getInstance().parseXHtml( + writer, document, + new ByteArrayInputStream(html.getBytes(StandardCharsets.UTF_8)), + null, StandardCharsets.UTF_8, + fontProvider // 注入字体提供器 + ); + document.close(); // 这里关闭,确保 OutputStream 还没被关闭 + } + } +} diff --git a/src/main/resources/templates/reportJYA5.html b/src/main/resources/templates/reportJYA5.html new file mode 100644 index 0000000..e449172 --- /dev/null +++ b/src/main/resources/templates/reportJYA5.html @@ -0,0 +1,148 @@ + + + + + 检验报告单 + + +
+ +
+
+ 澜沧拉祜族自治县中医医院检验单 +
+
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 患者姓名: + + + 患者性别: + + + 患者年龄: + +
+ 患者电话: + + + 身份证号: + +
+ 就诊来源: + + + 就诊科室: + + + 挂号单号: + +
+ 门诊编号: + + + 住院编号: + + + 住院床号: + +
+
申请时间:
+
+
+
检验时间:
+
+
+ 申请项目: + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
项目名称结果单位参考区间测试方法
+ + + +
+ + + +
+ +