package com.ltkj.web.controller.his; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.itextpdf.text.*; import com.itextpdf.text.Font; import com.itextpdf.text.Image; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.*; import com.itextpdf.text.pdf.draw.LineSeparator; import com.ltkj.common.core.domain.AjaxResult; import com.ltkj.common.core.domain.entity.SysDictData; import com.ltkj.common.core.domain.entity.SysUser; import com.ltkj.common.utils.DateUtils; import com.ltkj.common.utils.SecurityUtils; import com.ltkj.framework.config.MatchUtils; import com.ltkj.hosp.domain.*; import com.ltkj.hosp.mapper.DictUserInfoMapper; import com.ltkj.hosp.mapper.TjOrderDetailMapper; import com.ltkj.hosp.mapper.TjOrderRemarkMapper; import com.ltkj.hosp.mapper.TjRulesMapper; import com.ltkj.hosp.service.*; import com.ltkj.hosp.sqlDomain.LtkjExamJcbgd; import com.ltkj.hosp.sqlDomain.LtkjHybgd; import com.ltkj.hosp.sqlDomain.LtkjHysqd; import com.ltkj.hosp.vodomain.CsProVo; import com.ltkj.system.service.ISysConfigService; import com.ltkj.system.service.ISysDictDataService; import com.ltkj.system.service.ISysUserService; import com.ltkj.web.config.pdfutils.PdfUtils; import com.ltkj.web.controller.system.SysDeptController; import jodd.util.StringUtil; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.awt.*; import java.io.*; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigDecimal; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.text.Collator; import java.text.SimpleDateFormat; import java.util.*; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import static com.ltkj.common.utils.pdfutils.PdfUtils.createTable; /** * 检查 检验报告pdf生成 */ @Slf4j @Component public class HisPDFUtil { @Autowired private HisApiGetMethodService apiGetMethodService; @Autowired private ITjOrderService tjOrderService; @Autowired private ITjCustomerService tjCustomerService; @Autowired private ITjReportService tjReportService; @Autowired private ITjProjectService projectService; @Autowired private ITjOrderRemarkService tjOrderRemarkService; @Autowired private ITjOrderDetailService tjOrderDetailService; @Autowired private ITjStandardService tjStandardService; @Autowired private ISysUserService userService; @Autowired private IDictCompService dictCompService; @Autowired private ITjBigPositiveService tjBigPositiveService; @Autowired private LtkjHybgdService ltkjHybgdService; @Autowired private LtkjHysqdService ltkjHysqdService; @Autowired private LtkjGetexamreportinfoService ltkjGetexamreportinfoService; @Value("${path.filePath}") private String value; @Value("${path.reportServer}") private String urlValue; @Autowired private DictUserInfoMapper dictUserInfoMapper; @Autowired private ISysConfigService sysConfigService; @Resource private LtkjExamJcbgdService jcbgdService; @Resource private LtkjExamJcsqdService jcsqdService; @Autowired private IDictHospService dictHospService; @Autowired private ISysDictDataService sysDictDataService; @Autowired private ITjRulesService tjRulesService; @Autowired private TjRulesMapper tjRulesMapper; @Autowired private TjOrderRemarkMapper tjOrderRemarkMapper; @Autowired private TjOrderDetailMapper tjOrderDetailMapper; @Autowired private SysDeptController sysDeptController; @Autowired private ITjProAdvicerulesService tjProAdvicerulesService; @Autowired private TjOrderYcxmService ycxmService; @Resource private TjXdtgmdjgService xdtgmdjgService; @Autowired private TjReportSpecialProjectService tjReportSpecialProjectService; private Integer pdfPage = 0; private static int DEFAULT_FONT_SIZE = 10; private static int DEFAULT_LITTLE_TITLE_FONT_SIZE = 11; private static int DEFAULT_TITLE_FONT_SIZE = 12; private static int DEFAULT_ZONGJIAN_FONT_SIZE = 15; private static String HOSP_NAME; private List> makePDFInfo(HashMap map, AjaxResult ajaxResult, String key) { List> data = null; if (Integer.parseInt(ajaxResult.get("code").toString()) == 200) { data = (List>) ajaxResult.get("data"); List> parent = (List>) map.get(key); if (parent != null) { parent.addAll(data); } else { map.put(key, data); } } return data; } /* public void putData(JSONObject jsonObject, AjaxResult result, String key) { if (Integer.parseInt(result.get("code").toString()) == 200) { List> data = (List>) result.get("data"); jsonObject.putOpt(key, data); } } public AjaxResult hisPDF(TjOrder tjOrder, TjCustomer customer, TjReportTemplate tjReportTemplate) throws Exception { DictHosp dictHosp = dictHospService.list().get(0); String color = sysConfigService.selectConfigByKey("report_title_color"); // list.get(0).getHospName().equals("澄合矿务局中心医院") List sysUserSex = sysDictDataService.list(new LambdaQueryWrapper().eq(SysDictData::getDictType, "sys_user_sex")); HashMap map = makeHisJianYan(tjOrder, customer); HashMap pdfChangGui = makePDFInfo(tjOrder, customer, tjReportTemplate, dictHosp, map); if (pdfChangGui == null) return AjaxResult.error(); Document document = (Document) pdfChangGui.get("document"); PdfCopy copy = (PdfCopy) pdfChangGui.get("copy"); ByteArrayOutputStream finalOutPut = (ByteArrayOutputStream) pdfChangGui.get("stream"); ByteArrayOutputStream byteArrayOutputStream1 = new ByteArrayOutputStream(); Document document1 = new Document(PageSize.A4); PdfWriter pdfWriter = null; int pageSize = 0; try { pdfWriter = PdfWriter.getInstance(document1, byteArrayOutputStream1); // if (dictHosp.getHospName().equals("澄合矿务局中心医院")){ if (true) { String sex = ""; if (customer.getCusSex() != null) { for (SysDictData userSex : sysUserSex) { if (userSex.getDictValue().equals(String.valueOf(customer.getCusSex()))) { sex = userSex.getDictLabel(); } } } if (StrUtil.isBlank(sex)) sex = "未知"; // pdfWriter.setPageEvent(new FooterHeaderPageEvent("澄合矿务局中心医院",customer.getCusName(),tjOrder.getTjNumber(),sex,String.valueOf(DateUtil.ageOfNow(customer.getCusBrithday())),null)); pdfWriter.setPageEvent(new FooterHeaderPageEvent(dictHosp.getHospName(), customer.getCusName(), tjOrder.getTjNumber(), sex, String.valueOf(DateUtil.ageOfNow(customer.getCusBrithday())), null)); pageSize = pdfWriter.getPageNumber(); } } catch (DocumentException e) { log.error(String.valueOf(e)); return AjaxResult.error(); } document1.setMargins(70, 70, 40, 40); document1.open(); // if (dictHosp.getHospName().equals("澄合矿务局中心医院")){ if (true) { // 组装体检检查项目报告 Map> printReport = new HashMap<>(); notHuaYanData(tjOrder.getTjNumber(), printReport, tjOrder, customer); try { notHuaYanTable(document1, printReport, dictHosp, color, false); } catch (DocumentException e) { log.error("非化验项目填充表格异常"); log.error(String.valueOf(e)); return AjaxResult.error(); } // 组装检验数据 makeHisJianYanTable(document1, map, dictHosp, color); // 组装pacs检查数据 printReport = new HashMap<>(); pacsJianChaData(tjOrder.getTjNumber(), printReport, tjOrder, customer); try { notHuaYanTable(document1, printReport, dictHosp, color, true); } catch (DocumentException e) { log.error("pacs项目填充表格异常"); log.error(String.valueOf(e)); return AjaxResult.error(); } } else { // 非化验项目报告 Map> printReport = new HashMap<>(); notHuaYanData(tjOrder.getTjNumber(), printReport, tjOrder, customer); try { notHuaYanTable(document1, printReport, dictHosp, color, true); } catch (DocumentException e) { log.error("非化验项目填充表格异常"); log.error(String.valueOf(e)); return AjaxResult.error(); } // 组装检验数据 makeHisJianYanTable(document1, map, dictHosp, color); } document1.close(); PdfReader reader = null; reader = new PdfReader(byteArrayOutputStream1.toByteArray()); int numberOfPages1 = reader.getNumberOfPages(); for (int i = 1; i <= numberOfPages1; i++) { PdfImportedPage page = copy.getImportedPage(reader, i); copy.addPage(page); } // if (!dictHosp.getHospName().equals("澄合矿务局中心医院")){ if (!true) { List jianchas = makeHisJianChaTable(tjOrder); // List jianchas = makeCcgcHisJianChaTable(tjOrder); try { for (ByteArrayOutputStream jiancha : jianchas) { reader = new PdfReader(jiancha.toByteArray()); numberOfPages1 = reader.getNumberOfPages(); for (int i = 1; i <= numberOfPages1; i++) { PdfImportedPage page = copy.getImportedPage(reader, i); copy.addPage(page); } jiancha.close(); } } catch (IOException e) { log.error("拷贝pdf异常"); log.error(String.valueOf(e)); return AjaxResult.error(); } } reader.close(); byteArrayOutputStream1.close(); document.close(); copy.close(); String outputFileName1 = customer.getCusId() + tjOrder.getTjNumber() + customer.getCusName() + "_报告.pdf"; try { PdfReader pdfReader = new PdfReader(finalOutPut.toByteArray()); int pages = pdfReader.getNumberOfPages(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream); // if (!dictHosp.getHospName().equals("澄合矿务局中心医院")){ if (!true) { PdfContentByte contentByte; BaseFont baseFont = PdfUtils.createBaseFont(null); for (int i = 2; i <= pages; i++) { contentByte = pdfStamper.getOverContent(i); contentByte.beginText(); contentByte.setFontAndSize(baseFont, 11); float x = contentByte.getPdfDocument().getPageSize().getWidth() / 2; float y = 20; contentByte.showTextAligned(PdfContentByte.ALIGN_CENTER, String.valueOf(i - 1), x, y, 0); contentByte.endText(); } } pdfStamper.close(); pdfReader.close(); finalOutPut = outputStream; } catch (IOException e) { log.error(String.valueOf(e)); return AjaxResult.error(); } savePDFFile(outputFileName1, tjOrder, customer, finalOutPut); return AjaxResult.success(); } public AjaxResult hisPDFNew(TjOrder tjOrder, TjCustomer customer, TjReportTemplate tjReportTemplate) throws Exception { pdfPage = 0; DictHosp dictHosp = dictHospService.list().get(0); String color = sysConfigService.selectConfigByKey("report_title_color"); List sysUserSex = sysDictDataService.list(new LambdaQueryWrapper().eq(SysDictData::getDictType, "sys_user_sex")); // 检验数据 HashMap map = makeHisJianYan(tjOrder, customer); String sex = ""; if (customer.getCusSex() != null) { for (SysDictData userSex : sysUserSex) { if (userSex.getDictValue().equals(String.valueOf(customer.getCusSex()))) { sex = userSex.getDictLabel(); } } } if (StrUtil.isBlank(sex)) sex = "未知"; // 生成 document2 并将其内容保存到 byteArrayOutputStream2 中 ByteArrayOutputStream byteArrayOutputStream2 = new ByteArrayOutputStream(); Document document2 = new Document(PageSize.A4); PdfWriter writer2 = PdfWriter.getInstance(document2, byteArrayOutputStream2); writer2.setPageEvent(new FooterHeaderPageEvent(dictHosp.getHospName(), customer.getCusName(), tjOrder.getTjNumber(), sex, String.valueOf(DateUtil.ageOfNow(customer.getCusBrithday())), 0)); document2.setMargins(50, 70, 40, 50); document2.open(); List list = tjOrderRemarkService.cSWebGetProByTjNumAndOrderId(tjOrder.getTjNumber(), false); Font defaultFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); Font defaultTitleFont = PdfUtils.setFont(DEFAULT_LITTLE_TITLE_FONT_SIZE); defaultTitleFont.setStyle(Font.BOLD); Paragraph paragraph = PdfUtils.setParagraph(defaultTitleFont, "检查科室与检查项目"); document2.add(paragraph); PdfPTable table = new PdfPTable(new float[]{80, 100, 80, 80}); table.setTotalWidth(PageSize.A4.getWidth() - 100); table.setLockedWidth(true); table.setHorizontalAlignment(Element.ALIGN_LEFT); String[] titles = {"科室", "体检项目", "检查状态", "检查时间"}; for (String head : titles) { table.addCell(PdfUtils.createCell(head, defaultFont, Rectangle.BOX, Element.ALIGN_CENTER, 5f, 5f)); } Map> listMap = list.stream().collect(Collectors.groupingBy(CsProVo::getDeptName)); for (Map.Entry> entry : listMap.entrySet()) { String dept = entry.getKey(); List proVos = entry.getValue(); PdfPCell deptCell = new PdfPCell(); deptCell.setVerticalAlignment(Element.ALIGN_MIDDLE); deptCell.setHorizontalAlignment(Element.ALIGN_CENTER); deptCell.setPhrase(new Phrase(dept, defaultFont)); deptCell.setPaddingTop(5f); deptCell.setPaddingBottom(5f); deptCell.setRowspan(proVos.size()); table.addCell(deptCell); proVos.forEach(proVo -> { table.addCell(PdfUtils.createCell(proVo.getProName(), defaultFont, Rectangle.BOX, Element.ALIGN_CENTER, 5f, 5f)); String tjType = ""; switch (proVo.getType()) { case 0: tjType = "未检"; break; case 1: tjType = "已检"; break; case 2: tjType = "弃检"; break; case 3: tjType = "延期"; break; } table.addCell(PdfUtils.createCell(tjType, defaultFont, Rectangle.BOX, Element.ALIGN_CENTER, 5f, 5f)); String tjTime = ""; if (proVo.getQdcreateTime() != null) { tjTime = new SimpleDateFormat("yyyy-MM-dd").format(proVo.getQdcreateTime()); } table.addCell(PdfUtils.createCell(tjTime, defaultFont, Rectangle.BOX, Element.ALIGN_CENTER, 5f, 5f)); }); } document2.add(table); for (int i = 0; i < 2; i++) { paragraph = PdfUtils.setParagraph(defaultFont, ""); document2.add(paragraph); } // List remarks = tjOrderRemarkMapper.getzongjianyishengchakanyichangxiangmu3( tjOrder.getTjNumber()); List orderDetails = tjOrderDetailMapper.getzongjianyishengchakanyichangxiangmu4(tjOrder.getTjNumber()); // List> jiancha = new ArrayList<>(); paragraph = PdfUtils.setParagraph(defaultTitleFont, "检查综述:"); paragraph.setSpacingBefore(3f); paragraph.setSpacingAfter(2f); document2.add(paragraph); int xmXh = 1; for (Map.Entry> entry : orderDetails.stream().collect(Collectors.groupingBy(TjOrderDetail::getProId)).entrySet()) { List details = entry.getValue(); String xmmc = details.get(0).getProName(); boolean isXmWrite = false; for (TjOrderDetail detail : details) { if (!isXmWrite) { paragraph = new Paragraph(xmXh + ". " + xmmc, defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); isXmWrite = true; } String result = detail.getProResult(); if (StrUtil.isNotBlank(result)) { int index = 1; result = result.replaceAll("本报告仅对本次检查负责,临床医生依据病情如有疑问,请及时复查或进一步检查", ""); String[] split = result.split("\n"); StringBuilder builder = new StringBuilder(); for (String s : split) { if (StrUtil.isBlank(s.replaceAll("\n", "").trim())) continue; builder.append(" (").append(index).append(")").append(s).append("\n"); index++; } result = builder.toString(); } paragraph = new Paragraph(result, defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); } paragraph = PdfUtils.setParagraph(defaultFont, ""); paragraph.setLeading(0f); paragraph.setSpacingBefore(0f); paragraph.setSpacingAfter(5f); document2.add(paragraph); xmXh++; } for (Map.Entry item : map.entrySet()) { String xmmc = item.getKey(); HashMap entryValue = (HashMap) item.getValue(); ArrayList> lists = (ArrayList>) entryValue.get("data"); boolean isXmWrite = false; int index = 1; for (List i : lists) { if (i.contains("↓") || i.contains("↑")) { if (!isXmWrite) { paragraph = new Paragraph(xmXh + ". " + xmmc, defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); isXmWrite = true; } String content = " (" + index + ") " + i.get(0) + ":" + i.get(1) + " " + i.get(3) + " " + i.get(4) + " " + i.get(2); paragraph = new Paragraph(content, defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); index++; } } paragraph = PdfUtils.setParagraph(defaultFont, ""); paragraph.setSpacingBefore(0f); paragraph.setSpacingAfter(5f); document2.add(paragraph); xmXh++; } paragraph = PdfUtils.setParagraph(defaultFont, ""); paragraph.setLeading(0f); paragraph.setSpacingBefore(10f); paragraph.setSpacingAfter(10f); document2.add(paragraph); paragraph = PdfUtils.setParagraph(defaultTitleFont, "医生建议:"); paragraph.setSpacingBefore(3f); paragraph.setSpacingAfter(2f); document2.add(paragraph); xmXh = 0; for (Map.Entry item : map.entrySet()) { String xmmc = item.getKey(); HashMap entryValue = (HashMap) item.getValue(); ArrayList> lists = (ArrayList>) entryValue.get("data"); boolean isXmWrite = false; int index = 1; for (List i : lists) { if (i.contains("↓") || i.contains("↑")) { if (!isXmWrite) { xmXh++; paragraph = new Paragraph("【" + xmXh + "." + xmmc + "】", defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); isXmWrite = true; } String content = " (" + index + ")" + i.get(0) + ":" + i.get(1) + " " + i.get(3) + " " + i.get(4) + " " + i.get(2); paragraph = new Paragraph(content, defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); // 第六位是lis项目id // LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // wrapper.eq(TjProject::getLisXmbm,i.get(5)); // TjProject project = projectService.getOne(wrapper); // if (project != null) { // LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); // queryWrapper.eq(TjRules::getProId,project.getProId()); // List rules = tjRulesService.list(queryWrapper); // if (!rules.isEmpty()){ // // } String str = " "; List> maps = tjRulesService.getyichangxiangmujianyiguize(i.get(5), "", i.get(2), tjOrder.getTjNumber(), i.get(5), ""); if (!maps.isEmpty()) { for (Map objectMap : maps) { // paragraph = new Paragraph(str+"建议标题",defaultFont); // paragraph.setAlignment(Element.ALIGN_LEFT); // document2.add(paragraph); // // paragraph = new Paragraph(str+objectMap.get("bt").toString(),defaultFont); // paragraph.setAlignment(Element.ALIGN_LEFT); // document2.add(paragraph); // // paragraph = new Paragraph(str+"建议内容",defaultFont); // paragraph.setAlignment(Element.ALIGN_LEFT); // document2.add(paragraph); // // paragraph = new Paragraph(str+objectMap.get("nr").toString(),defaultFont); // paragraph.setAlignment(Element.ALIGN_LEFT); // document2.add(paragraph); String content1 = str + objectMap.get("bt").toString().trim() + objectMap.get("nr").toString().trim(); if (StrUtil.isBlank(content1)) content1 = " 本报告仅对本次检查负责,临床医生依据病情如有疑问,请及时复查或进一步检查"; paragraph = new Paragraph(content1, defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); } paragraph = PdfUtils.setParagraph(defaultFont, ""); paragraph.setSpacingBefore(2f); paragraph.setSpacingAfter(5f); document2.add(paragraph); } // } index++; } } paragraph = PdfUtils.setParagraph(defaultFont, ""); paragraph.setSpacingBefore(0f); paragraph.setSpacingAfter(5f); document2.add(paragraph); } for (Map.Entry> entry : orderDetails.stream().collect(Collectors.groupingBy(TjOrderDetail::getProId)).entrySet()) { List details = entry.getValue(); String xmmc = details.get(0).getProName(); boolean isXmWrite = false; int index = 1; for (TjOrderDetail detail : details) { if (!isXmWrite) { xmXh++; paragraph = new Paragraph("【" + xmXh + "." + xmmc + "】", defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); isXmWrite = true; } String result = detail.getProResult(); if (StrUtil.isNotBlank(result)) { // result = result.replaceAll(" ","").replaceAll("\t",""); // result = result.replaceAll("\n本报告仅对本次检查负责,临床医生依据病情如有疑问,请及时复查或进一步检查", ""); // result = "\n " + result.replaceAll("\n", "\n "); int index1 = 1; String[] split = result.split("\n"); boolean contains = result.contains("本报告仅对本次检查负责,临床医生依据病情如有疑问,请及时复查或进一步检查"); StringBuilder builder = new StringBuilder(); for (String s : split) { if (StrUtil.isBlank(s.replaceAll("\n", "").trim())) continue; builder.append(" (").append(index1).append(")").append(s).append("\n"); index1++; } if (!contains) builder.append(" (").append(index1).append(")").append("本报告仅对本次检查负责,临床医生依据病情如有疑问,请及时复查或进一步检查"); else builder.substring(0, builder.length() - 1); result = builder.toString(); } // String content = " (" + index + ") " + detail.getProName() + ":" + result; // content = content.replaceAll("[\\n\\r]+$", ""); // content = content.replaceAll("\\s+$", ""); // paragraph = new Paragraph(content, defaultFont); paragraph = new Paragraph(result, defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); String str = " "; List> maps = tjRulesService.getyichangxiangmujianyiguize(entry.getKey().toString(), "", "", tjOrder.getTjNumber(), detail.getProName(), ""); for (Map objectMap : maps) { String content1 = str + objectMap.get("bt").toString() + objectMap.get("nr").toString(); if (StrUtil.isBlank(content1)) content1 = " 本报告仅对本次检查负责,临床医生依据病情如有疑问,请及时复查或进一步检查"; paragraph = new Paragraph(content1, defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); } index++; paragraph = PdfUtils.setParagraph(defaultFont, ""); paragraph.setLeading(0f); paragraph.setSpacingBefore(0f); paragraph.setSpacingAfter(5f); document2.add(paragraph); } } for (int i = 0; i < 1; i++) { paragraph = PdfUtils.setParagraph(defaultFont, ""); document2.add(paragraph); } paragraph = PdfUtils.setParagraph(defaultTitleFont, "总检医生建议:"); document2.add(paragraph); if (tjOrder.getCheckAdvice() == null) { paragraph = PdfUtils.setParagraph(defaultFont, "无"); document2.add(paragraph); } else { paragraph = PdfUtils.setParagraph(defaultFont, tjOrder.getCheckAdvice()); document2.add(paragraph); } Paragraph paragraphNone = new Paragraph("", defaultFont); paragraphNone.setAlignment(Element.ALIGN_LEFT); //行间距 paragraphNone.setLeading(5f); paragraphNone.setSpacingBefore(10f); paragraphNone.setSpacingAfter(10f); document2.add(paragraphNone); paragraphNone = new Paragraph("", defaultFont); paragraphNone.setAlignment(Element.ALIGN_LEFT); //行间距 paragraphNone.setLeading(5f); paragraphNone.setSpacingBefore(10f); paragraphNone.setSpacingAfter(10f); document2.add(paragraphNone); PdfPTable tableQz = new PdfPTable(new float[]{100f, 100f, 50f}); tableQz.setTotalWidth(PageSize.A4.getWidth() - 100); tableQz.setLockedWidth(true); tableQz.setHorizontalAlignment(Element.ALIGN_LEFT); tableQz.getDefaultCell().setBorder(0); tableQz.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); Font zongJianFont = PdfUtils.setFont(DEFAULT_ZONGJIAN_FONT_SIZE); Font zongJianTitleFont = PdfUtils.setFont(DEFAULT_ZONGJIAN_FONT_SIZE); zongJianTitleFont.setStyle(Font.BOLD); for (int i = 0; i < 3; i++) { PdfPCell cell = new PdfPCell(); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setPhrase(new Phrase("", defaultFont)); cell.setBorder(Rectangle.NO_BORDER); tableQz.addCell(cell); } PdfPCell cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setPhrase(new Phrase("", defaultFont)); cell.setRowspan(3); tableQz.addCell(cell); cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setPaddingTop(10); cell.setPaddingBottom(10); cell.setPhrase(new Phrase("体检单位盖章:", zongJianTitleFont)); tableQz.addCell(cell); cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setPaddingTop(10); cell.setPaddingBottom(10); cell.setPhrase(new Phrase("", zongJianFont)); tableQz.addCell(cell); cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setPaddingTop(10); cell.setPaddingBottom(10); cell.setPhrase(new Phrase("总检医师:", zongJianTitleFont)); tableQz.addCell(cell); cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setPaddingTop(10); cell.setPaddingBottom(10); // cell.setPhrase(new Phrase("何小婷", zongJianFont)); cell.setPhrase(new Phrase(sysConfigService.selectConfigByKey("pdf_report_zongjianysname"), zongJianFont)); tableQz.addCell(cell); cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setPaddingTop(10); cell.setPaddingBottom(10); cell.setPhrase(new Phrase("总检日期:", zongJianTitleFont)); tableQz.addCell(cell); cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setPaddingTop(10); cell.setPaddingBottom(10); cell.setPhrase(new Phrase(new SimpleDateFormat("yyyy-MM-dd").format(tjOrder.getCheckTime()), zongJianFont)); tableQz.addCell(cell); document2.add(tableQz); document2.close(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); Document document = new Document(PageSize.A4); PdfWriter pdfWriter = null; // int pageSize = 0; // try { pdfWriter = PdfWriter.getInstance(document, byteArrayOutputStream); pdfWriter.setPageEvent(new FooterHeaderPageEvent(dictHosp.getHospName(), customer.getCusName(), tjOrder.getTjNumber(), sex, String.valueOf(DateUtil.ageOfNow(customer.getCusBrithday())), null)); // pageSize = pdfWriter.getPageNumber(); // } catch (DocumentException e) { // log.error(String.valueOf(e)); // return AjaxResult.error(); // } // 后面页码数量 int dataPageNumer = pdfWriter.getPageNumber(); document.setMargins(70, 70, 40, 40); document.open(); Map> printReport = new HashMap<>(); notHuaYanData(tjOrder.getTjNumber(), printReport, tjOrder, customer); try { notHuaYanTable(document, printReport, dictHosp, color, false); } catch (DocumentException e) { log.error("非化验项目填充表格异常"); log.error(String.valueOf(e)); return AjaxResult.error(); } PdfReader reader = null; makeHisJianYanTable(document, map, dictHosp, color); printReport = new HashMap<>(); pacsJianChaData(tjOrder.getTjNumber(), printReport, tjOrder, customer); try { notHuaYanTable(document, printReport, dictHosp, color, true); } catch (DocumentException e) { log.error("pacs项目填充表格异常"); log.error(String.valueOf(e)); return AjaxResult.error(); } document.close(); // 首页表单 String tjNumber = tjOrder.getTjNumber(); String template = tjReportTemplate.getTemplate(); LambdaQueryWrapper wq111 = new LambdaQueryWrapper<>(); wq111.eq(DictComp::getDrugManufacturerId, tjOrder.getFirmId()); DictComp dictComp = dictCompService.getOne(wq111); LambdaQueryWrapper wq2 = new LambdaQueryWrapper<>(); wq2.eq(TjOrderDetail::getOrderId, tjOrder.getOrderId()); wq2.isNotNull(TjOrderDetail::getFlowingWaterId); List detailList = tjOrderDetailService.list(wq2); for (TjOrderDetail tjOrderDetail : detailList) { TjProject tjProject = projectService.selectTjProjectByProId(tjOrderDetail.getProId()); tjOrderDetail.setProject(tjProject); } ByteArrayOutputStream byteArrayOutputStream4 = new ByteArrayOutputStream(); PdfReader reader4 = null; PdfStamper pdfStamper = null; reader4 = new PdfReader(new ByteArrayInputStream(Base64.getDecoder().decode(template))); pdfStamper = new PdfStamper(reader4, byteArrayOutputStream4); AcroFields acroFields = pdfStamper.getAcroFields(); BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); acroFields.addSubstitutionFont(bf); HashMap data = new HashMap<>(); Long cusSex = customer.getCusSex(); String tjtype; if (cusSex == 0) { sex = "男"; } else { sex = "女"; } HashMap hashMap = new HashMap<>(); hashMap.put("name", customer.getCusName()); if ("1".equals(tjOrder.getTjType())) { tjtype = "团队"; hashMap.put("tjtype", tjtype); } else { tjtype = "个人"; hashMap.put("tjtype", tjtype); } if (dictComp == null) { hashMap.put("work", "无"); } else { hashMap.put("work", dictComp.getCnName()); } hashMap.put("sex", sex); hashMap.put("tjnumber", tjNumber); hashMap.put("tjdate", DateUtils.parseDateToStr("yyyy/MM/dd", tjOrder.getCreateTime())); hashMap.put("phone", customer.getCusPhone()); for (String key : hashMap.keySet()) { acroFields.setFieldProperty(key, "textsize", DEFAULT_FONT_SIZE, null); acroFields.setField(key, hashMap.get(key)); } pdfStamper.setFormFlattening(true); pdfStamper.close(); reader4.close(); // 将修改后的PDF内容写入 byte[] bytes = byteArrayOutputStream4.toByteArray(); ByteArrayOutputStream finalOutput = new ByteArrayOutputStream(); Document mergedDocument = new Document(PageSize.A4); PdfCopy copy = new PdfCopy(mergedDocument, finalOutput); mergedDocument.open(); reader4 = new PdfReader(new ByteArrayInputStream(bytes)); int numberOfPages = reader4.getNumberOfPages(); for (int i = 1; i <= numberOfPages; i++) { copy.addPage(copy.getImportedPage(reader4, i)); } PdfReader reader2 = new PdfReader(byteArrayOutputStream2.toByteArray()); int numberOfPages2 = reader2.getNumberOfPages(); for (int i = 1; i <= numberOfPages2; i++) { PdfImportedPage page = copy.getImportedPage(reader2, i); copy.addPage(page); } reader2.close(); PdfReader reader1 = new PdfReader(byteArrayOutputStream.toByteArray()); int numberOfPages1 = reader1.getNumberOfPages(); for (int i = 1; i <= numberOfPages1; i++) { PdfImportedPage page = copy.getImportedPage(reader1, i); copy.addPage(page); } reader1.close(); mergedDocument.close(); String outputFileName1 = customer.getCusId() + tjOrder.getTjNumber() + customer.getCusName() + "_报告.pdf"; savePDFFile(outputFileName1, tjOrder, customer, finalOutput); return AjaxResult.success(); }*/ public AjaxResult hisPDFNew2(TjOrder tjOrder, TjCustomer customer, TjReportTemplate tjReportTemplate, TjReportTemplate zongJianYiShiQianMing) throws Exception { String s1 = sysConfigService.selectConfigByKey("tjreport_font_size_second_page_info"); String s2 = sysConfigService.selectConfigByKey("tjreport_font_size_second_page_title"); String s3 = sysConfigService.selectConfigByKey("tjreport_font_size_result_title"); String s4 = sysConfigService.selectConfigByKey("tjreport_font_size_zongjian"); // String hospName = sysDeptController.getdangqiandengluyuanqu().get("msg").toString(); if (StrUtil.isNotBlank(s1) && Integer.parseInt(s1) > 10) DEFAULT_FONT_SIZE = Integer.parseInt(s1); else DEFAULT_FONT_SIZE = 10; if (StrUtil.isNotBlank(s2) && Integer.parseInt(s2) > 10) DEFAULT_LITTLE_TITLE_FONT_SIZE = Integer.parseInt(s2); else DEFAULT_LITTLE_TITLE_FONT_SIZE = 10; if (StrUtil.isNotBlank(s3) && Integer.parseInt(s3) > 10) DEFAULT_TITLE_FONT_SIZE = Integer.parseInt(s3); else DEFAULT_TITLE_FONT_SIZE = 10; if (StrUtil.isNotBlank(s4) && Integer.parseInt(s4) > 10) DEFAULT_ZONGJIAN_FONT_SIZE = Integer.parseInt(s4); else DEFAULT_ZONGJIAN_FONT_SIZE = 10; pdfPage = 0; DictHosp dictHosp = dictHospService.list().get(0); HOSP_NAME = dictHosp.getHospName(); String color = sysConfigService.selectConfigByKey("report_title_color"); List sysUserSex = sysDictDataService.list(new LambdaQueryWrapper().eq(SysDictData::getDictType, "sys_user_sex")); // 检验数据 HashMap map = makeHisJianYan(tjOrder, customer); String sex = ""; if (customer.getCusSex() != null) { for (SysDictData userSex : sysUserSex) { if (userSex.getDictValue().equals(String.valueOf(customer.getCusSex()))) { sex = userSex.getDictLabel(); } } } if (StrUtil.isBlank(sex)) sex = "未知"; // 生成 document2 并将其内容保存到 byteArrayOutputStream2 中 ByteArrayOutputStream byteArrayOutputStream2 = new ByteArrayOutputStream(); Document document2 = new Document(PageSize.A4); PdfWriter writer2 = PdfWriter.getInstance(document2, byteArrayOutputStream2); writer2.setPageEvent(new FooterHeaderPageEvent(dictHosp.getHospName(), customer.getCusName(), tjOrder.getTjNumber(), sex, String.valueOf(DateUtil.ageOfNow(customer.getCusBrithday())), 0)); document2.setMargins(50, 70, 40, 50); document2.open(); List list = tjOrderRemarkService.cSWebGetProByTjNumAndOrderId(tjOrder.getTjNumber(), false); Font defaultFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); Font defaultTitleFont = PdfUtils.setFont(DEFAULT_LITTLE_TITLE_FONT_SIZE); defaultTitleFont.setStyle(Font.BOLD); Paragraph paragraph = PdfUtils.setParagraph(defaultTitleFont, "检查科室与检查项目"); document2.add(paragraph); PdfPTable table = new PdfPTable(new float[]{80, 100, 80, 80}); table.setTotalWidth(PageSize.A4.getWidth() - 100); table.setLockedWidth(true); table.setHorizontalAlignment(Element.ALIGN_LEFT); String[] titles = {"科室", "体检项目", "检查状态", "检查时间"}; for (String head : titles) { table.addCell(PdfUtils.createCell(head, defaultFont, Rectangle.BOX, Element.ALIGN_CENTER, 5f, 5f)); } // Map> listMap = list.stream() // .collect(Collectors.groupingBy(i -> i.getDeptId() + "_" + i.getDeptName())); Map> listMap = list.stream() .collect(Collectors.groupingBy( i -> i.getDeptId() + "_" + i.getDeptName(), TreeMap::new, // 按键排序 Collectors.mapping( i -> i, Collectors.collectingAndThen( Collectors.toList(), l -> l.stream() .sorted(Comparator.comparing(CsProVo::getDeptId)) // 对 List 排序 .collect(Collectors.toList()) ) ) )); // List sortedList = list.stream() // .sorted(Comparator.comparingLong(CsProVo::getProId)) // .collect(Collectors.toList()); for (Map.Entry> entry : listMap.entrySet()) { String dept = entry.getKey().split("_")[1]; List proVos = entry.getValue(); proVos = proVos.stream() .sorted(Comparator.comparingLong(CsProVo::getProId)) .collect(Collectors.toList()); PdfPCell deptCell = new PdfPCell(); deptCell.setVerticalAlignment(Element.ALIGN_MIDDLE); deptCell.setHorizontalAlignment(Element.ALIGN_CENTER); deptCell.setPhrase(new Phrase(dept, defaultFont)); deptCell.setPaddingTop(5f); deptCell.setPaddingBottom(5f); if (proVos.size() > 1) deptCell.setRowspan(proVos.size()); table.addCell(deptCell); proVos.forEach(proVo -> { table.addCell(PdfUtils.createCell(proVo.getProName(), defaultFont, Rectangle.BOX, Element.ALIGN_CENTER, 5f, 5f)); String tjType = ""; switch (proVo.getType()) { case 0: tjType = "未检"; break; case 1: tjType = "已检"; break; case 2: tjType = "弃检"; break; case 3: tjType = "延期"; break; } table.addCell(PdfUtils.createCell(tjType, defaultFont, Rectangle.BOX, Element.ALIGN_CENTER, 5f, 5f)); String tjTime = ""; if (proVo.getQdcreateTime() != null) { tjTime = new SimpleDateFormat("yyyy-MM-dd").format(proVo.getQdcreateTime()); } table.addCell(PdfUtils.createCell(tjTime, defaultFont, Rectangle.BOX, Element.ALIGN_CENTER, 5f, 5f)); }); } document2.add(table); for (int i = 0; i < 2; i++) { paragraph = PdfUtils.setParagraph(defaultFont, ""); document2.add(paragraph); } // List remarks = tjOrderRemarkMapper.getzongjianyishengchakanyichangxiangmu3( tjOrder.getTjNumber()); List orderDetails = tjOrderDetailMapper.getzongjianyishengchakanyichangxiangmu4(tjOrder.getTjNumber()); // List> jiancha = new ArrayList<>(); int xmXh = 1; Map> collect = orderDetails.stream().collect(Collectors.groupingBy(TjOrderDetail::getProId)); LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.eq(TjOrderYcxm::getTjh, tjOrder.getTjNumber()); List ycxms = ycxmService.list(wq); boolean isBr = false; if (null != ycxms && !ycxms.isEmpty()) { paragraph = PdfUtils.setParagraph(defaultTitleFont, "检查综述:"); paragraph.setSpacingBefore(3f); paragraph.setSpacingAfter(2f); document2.add(paragraph); isBr = true; Map> stringListMap = ycxms.stream().collect(Collectors.groupingBy(TjOrderYcxm::getParentName)); for (Map.Entry> entry : stringListMap.entrySet()) { List details = entry.getValue(); String xmmc = entry.getKey(); // String xmmc = details.get(0).getProName(); boolean isXmWrite = false; int index = 1; for (TjOrderYcxm detail : details) { // if (!entry.getKey().equals(detail.getProId())) continue; if (!isXmWrite) { paragraph = new Paragraph(xmXh + ". " + xmmc, defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); isXmWrite = true; } String result = detail.getJcjg(); if (StrUtil.isNotBlank(result)) { result = result.replaceAll("本报告仅对本次检查负责,临床医生依据病情如有疑问,请及时复查或进一步检查", ""); StringBuilder builder = new StringBuilder(); if (StrUtil.isBlank(result.replaceAll("\n", "").trim())) continue; builder.append(" (").append(index).append(")").append(detail.getJcxm()).append(": ").append(result).append("\n"); index++; result = builder.toString(); } paragraph = new Paragraph(result, defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); } if (isXmWrite) { paragraph = PdfUtils.setParagraph(defaultFont, ""); paragraph.setLeading(0f); paragraph.setSpacingBefore(0f); paragraph.setSpacingAfter(5f); document2.add(paragraph); xmXh++; } } } if(isBr) { paragraph = PdfUtils.setParagraph(defaultFont, ""); paragraph.setLeading(0f); paragraph.setSpacingBefore(10f); paragraph.setSpacingAfter(10f); document2.add(paragraph); } xmXh = 0; // LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); // wq.eq(TjOrderYcxm::getTjh, tjOrder.getTjNumber()); // List ycxms = ycxmService.list(wq); if (null != ycxms && !ycxms.isEmpty()) { paragraph = PdfUtils.setParagraph(defaultTitleFont, "医生建议:"); paragraph.setSpacingBefore(3f); paragraph.setSpacingAfter(2f); document2.add(paragraph); Map> stringListMap = ycxms.stream().collect(Collectors.groupingBy(TjOrderYcxm::getParentName)); for (Map.Entry> entry : stringListMap.entrySet()) { List details = entry.getValue(); if(null !=details && !details.isEmpty()){ details= details.stream() .sorted(Comparator.comparing(TjOrderYcxm::getJcxm)) .collect(Collectors.toList()); boolean isXmWrite = false; int index = 1; int index1 = 1; for (TjOrderYcxm detail : details) { String xmmc = entry.getKey().toString(); if (!isXmWrite) { xmXh++; paragraph = new Paragraph("【" + xmXh + "." + xmmc + "】", defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); isXmWrite = true; } String result = detail.getJcjg(); if (StrUtil.isNotBlank(result)) { StringBuilder builder = new StringBuilder(); if (StrUtil.isBlank(result.replaceAll("\n", "").trim())) continue; builder.append(" (").append(index1).append(")").append(detail.getJcxm()).append(": ").append(result).append("\n"); index1++; result = builder.toString(); } if (StrUtil.isNotBlank(result)) { paragraph = new Paragraph(result, defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); } else { paragraph = new Paragraph("建议定期复查", defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); } String str = " "; List> maps = new ArrayList<>(); String jynr = detail.getJynr(); JSONArray array = JSONUtil.parseArray(jynr); for (Object object : array) { Map objectMap=new HashMap<>(); JSONObject jsonObject = (JSONObject) object; String bt = jsonObject.getStr("bt"); String nr = jsonObject.getStr("nr"); objectMap.put("bt",bt); objectMap.put("nr",nr); if(null !=bt || null !=nr) maps.add(objectMap); } List> collect1 = maps.stream().distinct().collect(Collectors.toList()); for (Map objectMap : collect1) { String content = str + objectMap.get("bt").toString() + objectMap.get("nr").toString(); if (StrUtil.isBlank(content)) content = " "; paragraph = new Paragraph(content, defaultFont); paragraph.setAlignment(Element.ALIGN_LEFT); document2.add(paragraph); } index++; paragraph = PdfUtils.setParagraph(defaultFont, ""); paragraph.setLeading(0f); paragraph.setSpacingBefore(0f); paragraph.setSpacingAfter(5f); document2.add(paragraph); } } } } for (int i = 0; i < 1; i++) { paragraph = PdfUtils.setParagraph(defaultFont, ""); document2.add(paragraph); } paragraph = PdfUtils.setParagraph(defaultTitleFont, "总检医生建议:"); document2.add(paragraph); if (tjOrder.getCheckAdvice() == null) { paragraph = PdfUtils.setParagraph(defaultFont, "无"); document2.add(paragraph); } else { Paragraph paragraphs = new Paragraph(tjOrder.getCheckAdvice(), defaultFont); //设置文字居中 paragraphs.setAlignment(Element.ALIGN_LEFT); //行间距 // paragraphs.setLeading(5f); //设置段落上空白 paragraphs.setSpacingBefore(10f); //设置段落下空白 paragraphs.setSpacingAfter(10f); // paragraph = PdfUtils.setParagraph(defaultFont, tjOrder.getCheckAdvice()); document2.add(paragraphs); } Paragraph paragraphNone = new Paragraph("", defaultFont); paragraphNone.setAlignment(Element.ALIGN_LEFT); //行间距 paragraphNone.setLeading(5f); paragraphNone.setSpacingBefore(10f); paragraphNone.setSpacingAfter(10f); document2.add(paragraphNone); paragraphNone = new Paragraph("", defaultFont); paragraphNone.setAlignment(Element.ALIGN_LEFT); //行间距 paragraphNone.setLeading(5f); paragraphNone.setSpacingBefore(10f); paragraphNone.setSpacingAfter(10f); document2.add(paragraphNone); PdfPTable tableQz = new PdfPTable(new float[]{100f, 100f, 50f}); tableQz.setTotalWidth(PageSize.A4.getWidth() - 100); tableQz.setLockedWidth(true); tableQz.setHorizontalAlignment(Element.ALIGN_LEFT); tableQz.getDefaultCell().setBorder(0); tableQz.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); Font zongJianFont = PdfUtils.setFont(DEFAULT_ZONGJIAN_FONT_SIZE); Font zongJianTitleFont = PdfUtils.setFont(DEFAULT_ZONGJIAN_FONT_SIZE); zongJianTitleFont.setStyle(Font.BOLD); for (int i = 0; i < 3; i++) { PdfPCell cell = new PdfPCell(); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setPhrase(new Phrase("", defaultFont)); cell.setBorder(Rectangle.NO_BORDER); tableQz.addCell(cell); } PdfPCell cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setPhrase(new Phrase("", defaultFont)); cell.setRowspan(3); tableQz.addCell(cell); cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setPaddingTop(10); cell.setPaddingBottom(10); cell.setPhrase(new Phrase("体检单位盖章:", zongJianTitleFont)); tableQz.addCell(cell); File file = new File(value + File.separator + "yinzhang.png"); cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setPaddingTop(10); cell.setPaddingBottom(10); if (!file.exists()) { cell.setPhrase(new Phrase("", zongJianFont)); }else { FileInputStream fileInputStream = new FileInputStream(file); byte[] fileBytes = new byte[(int) file.length()]; fileInputStream.read(fileBytes); fileInputStream.close(); Image image = Image.getInstance(Base64.getDecoder().decode(Base64.getEncoder().encodeToString(fileBytes))); image.scaleToFit(90, 90); cell.addElement(image); } tableQz.addCell(cell); cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setPaddingTop(10); cell.setPaddingBottom(10); cell.setPhrase(new Phrase("总检医师:", zongJianTitleFont)); tableQz.addCell(cell); cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setPaddingTop(10); cell.setPaddingBottom(10); String zongjianysname = sysConfigService.selectConfigByKey("pdf_report_zongjianysname"); if (zongJianYiShiQianMing == null && StrUtil.isNotBlank(zongjianysname) && !zongjianysname.equals("无")) { cell.setPhrase(new Phrase(zongjianysname, zongJianFont)); tableQz.addCell(cell); } else if (zongJianYiShiQianMing == null && zongjianysname.equals("无")) { String nickName = SecurityUtils.getLoginUser().getUser().getNickName(); cell.setPhrase(new Phrase(nickName, zongJianFont)); tableQz.addCell(cell); } else { byte[] bytes = Base64.getDecoder().decode(zongJianYiShiQianMing.getTemplate()); Image image = Image.getInstance(bytes); image.scaleToFit(100, 100); cell.addElement(image); tableQz.addCell(cell); } cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setPaddingTop(10); cell.setPaddingBottom(10); cell.setPhrase(new Phrase("总检日期:", zongJianTitleFont)); tableQz.addCell(cell); cell = new PdfPCell(); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setPaddingTop(10); cell.setPaddingBottom(10); cell.setPhrase(new Phrase(new SimpleDateFormat("yyyy-MM-dd").format(tjOrder.getCheckTime()), zongJianFont)); tableQz.addCell(cell); document2.add(tableQz); document2.close(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); Document document = new Document(PageSize.A4); PdfWriter pdfWriter = null; // int pageSize = 0; // try { pdfWriter = PdfWriter.getInstance(document, byteArrayOutputStream); pdfWriter.setPageEvent(new FooterHeaderPageEvent(dictHosp.getHospName(), customer.getCusName(), tjOrder.getTjNumber(), sex, String.valueOf(DateUtil.ageOfNow(customer.getCusBrithday())), null)); // pageSize = pdfWriter.getPageNumber(); // } catch (DocumentException e) { // log.error(String.valueOf(e)); // return AjaxResult.error(); // } // 后面页码数量 int dataPageNumer = pdfWriter.getPageNumber(); document.setMargins(70, 70, 40, 40); document.open(); Map> printReport = new HashMap<>(); notHuaYanData(tjOrder.getTjNumber(), printReport, tjOrder, customer); try { notHuaYanTable(document, printReport, dictHosp, color, false); } catch (DocumentException e) { log.error("非化验项目填充表格异常"); log.error(String.valueOf(e)); return AjaxResult.error(); } PdfReader reader = null; makeHisJianYanTable(document, map, dictHosp, color); printReport = new HashMap<>(); pacsJianChaData(tjOrder.getTjNumber(), printReport, tjOrder, customer); try { notHuaYanTable(document, printReport, dictHosp, color, true); } catch (DocumentException e) { log.error("pacs项目填充表格异常"); log.error(String.valueOf(e)); return AjaxResult.error(); } LambdaQueryWrapper wqq=new LambdaQueryWrapper<>(); wqq.eq(TjXdtgmdjg::getTjh,tjOrder.getTjNumber()); wqq.isNotNull(TjXdtgmdjg::getUrl); List xdtgmdjgList = xdtgmdjgService.list(wqq); int index=1; for (TjXdtgmdjg xdtgmdjg : xdtgmdjgList) { document.newPage(); cell = new PdfPCell(); PdfPTable tablefj = new PdfPTable(new float[]{100f}); tablefj.setTotalWidth(PageSize.A4.getWidth() - 100); tablefj.setLockedWidth(true); tablefj.setHorizontalAlignment(Element.ALIGN_LEFT); tablefj.getDefaultCell().setBorder(0); tablefj.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setBorder(Rectangle.NO_BORDER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setPaddingTop(10); cell.setPaddingBottom(10); cell.setPhrase(new Phrase("附件"+index+": "+ xdtgmdjg.getProName(), zongJianFont)); Path path = Paths.get(xdtgmdjg.getUrl()); byte[] bytesfj = null; try { bytesfj = Files.readAllBytes(path); } catch (IOException e) { throw new RuntimeException(e); } Image image = Image.getInstance(bytesfj); image.scaleToFit(500, 2500); tablefj.addCell(cell); cell = new PdfPCell(); cell.addElement(image); tablefj.addCell(cell); document.add(tablefj); index++; } document.close(); // 首页表单 String tjNumber = tjOrder.getTjNumber(); String template = tjReportTemplate.getTemplate(); LambdaQueryWrapper wq2 = new LambdaQueryWrapper<>(); wq2.eq(TjOrderDetail::getOrderId, tjOrder.getOrderId()); wq2.isNotNull(TjOrderDetail::getFlowingWaterId); List detailList = tjOrderDetailService.list(wq2); for (TjOrderDetail tjOrderDetail : detailList) { TjProject tjProject = projectService.selectTjProjectByProId(tjOrderDetail.getProId()); tjOrderDetail.setProject(tjProject); } ByteArrayOutputStream byteArrayOutputStream4 = new ByteArrayOutputStream(); PdfReader reader4 = null; PdfStamper pdfStamper = null; reader4 = new PdfReader(new ByteArrayInputStream(Base64.getDecoder().decode(template))); pdfStamper = new PdfStamper(reader4, byteArrayOutputStream4); AcroFields acroFields = pdfStamper.getAcroFields(); BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); acroFields.addSubstitutionFont(bf); HashMap data = new HashMap<>(); Long cusSex = customer.getCusSex(); String tjtype; if (cusSex == 0) { sex = "男"; } else { sex = "女"; } HashMap hashMap = new HashMap<>(); hashMap.put("name", customer.getCusName()); if ("1".equals(tjOrder.getTjType())) { tjtype = "团队"; hashMap.put("tjtype", tjtype); } else { tjtype = "个人"; hashMap.put("tjtype", tjtype); } if (StrUtil.isNotBlank(tjOrder.getFirmName())) { hashMap.put("work", tjOrder.getFirmName()); } else { // LambdaQueryWrapper wq111 = new LambdaQueryWrapper<>(); // wq111.eq(DictComp::getDrugManufacturerId, tjOrder.getFirmId()); // DictComp dictComp = dictCompService.getOne(wq111); if (StrUtil.isBlank(tjOrder.getFirmName())) { hashMap.put("work", "无"); } else { hashMap.put("work", tjOrder.getFirmName()); } } if (StrUtil.isBlank(tjOrder.getFirmDeptName())) { hashMap.put("bumen", "无"); } else { hashMap.put("bumen", tjOrder.getFirmDeptName()); } hashMap.put("sex", sex); hashMap.put("tjnumber", tjNumber); hashMap.put("tjdate", DateUtils.parseDateToStr("yyyy/MM/dd", tjOrder.getCreateTime())); hashMap.put("phone", customer.getCusPhone()); for (String key : hashMap.keySet()) { acroFields.setFieldProperty(key, "textsize", DEFAULT_FONT_SIZE, null); acroFields.setField(key, hashMap.get(key)); } pdfStamper.setFormFlattening(true); pdfStamper.close(); reader4.close(); // 将修改后的PDF内容写入 byte[] bytes = byteArrayOutputStream4.toByteArray(); ByteArrayOutputStream finalOutput = new ByteArrayOutputStream(); Document mergedDocument = new Document(PageSize.A4); PdfCopy copy = new PdfCopy(mergedDocument, finalOutput); mergedDocument.open(); reader4 = new PdfReader(new ByteArrayInputStream(bytes)); int numberOfPages = reader4.getNumberOfPages(); for (int i = 1; i <= numberOfPages; i++) { copy.addPage(copy.getImportedPage(reader4, i)); } PdfReader reader2 = new PdfReader(byteArrayOutputStream2.toByteArray()); int numberOfPages2 = reader2.getNumberOfPages(); for (int i = 1; i <= numberOfPages2; i++) { PdfImportedPage page = copy.getImportedPage(reader2, i); copy.addPage(page); } reader2.close(); PdfReader reader1 = new PdfReader(byteArrayOutputStream.toByteArray()); int numberOfPages1 = reader1.getNumberOfPages(); for (int i = 1; i <= numberOfPages1; i++) { PdfImportedPage page = copy.getImportedPage(reader1, i); copy.addPage(page); } reader1.close(); mergedDocument.close(); String outputFileName1 = customer.getCusId() + tjOrder.getTjNumber() + customer.getCusName() + "_报告.pdf"; savePDFFile(outputFileName1, tjOrder, customer, finalOutput); return AjaxResult.success(); } /** * 生成检查表格 * * @param tjOrder * @return */ private List makeHisJianChaTable(TjOrder tjOrder) throws Exception { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(LtkjGetexamreportinfo::getRequestParamsHisRegistrationId, tjOrder.getCardId()); lambdaQueryWrapper.groupBy(LtkjGetexamreportinfo::getJcbgid); List list = ltkjGetexamreportinfoService.list(lambdaQueryWrapper); // List list = ltkjGetexamreportinfoService.list(); List jianchas = new ArrayList<>(); Paragraph elements = new Paragraph(); elements.setLeading(5f); elements.setSpacingBefore(10f); elements.setSpacingAfter(10f); elements.setAlignment(Element.ALIGN_RIGHT); Phrase phrase = new Phrase(); Font doctorFonts = PdfUtils.setFont(11); for (LtkjGetexamreportinfo getexamreportinfo : list) { String xm = getexamreportinfo.getHzxm(); String xb = getexamreportinfo.getHzxb().equals("2") ? "女" : "男"; String nl = getexamreportinfo.getHznl(); if (StrUtil.isNotBlank(nl) && nl.contains(".")) { String[] split = nl.split("\\."); nl = split[0]; } String jcks = getexamreportinfo.getJcksmc(); String sqks = getexamreportinfo.getSqksmc(); String sjks = getexamreportinfo.getZdjgmc(); String jcsb = getexamreportinfo.getSbbm(); String jch = getexamreportinfo.getJch(); String jcxm = getexamreportinfo.getJcxmmc(); String ms = getexamreportinfo.getYxbx(); String ts = getexamreportinfo.getYxzd(); String bgysqm = getexamreportinfo.getBgysqm(); String shysqm = getexamreportinfo.getShysqm(); String sqrxm = getexamreportinfo.getSqrxm(); String zyh = ""; String ch = ""; String sqrbh = getexamreportinfo.getSqrbh(); String shysbh = getexamreportinfo.getShysbh(); String bgysbh = getexamreportinfo.getBgysbh(); String jcysqm = getexamreportinfo.getJcysqm(); String jcysbh = getexamreportinfo.getJcysbh(); StringBuilder builder; String footer; // 检查返回的医师编码不属于his医师id 暂注释 // String key = sysConfigService.selectConfigByKey("is_report_pdf_use_ysqm"); // if (key.equals("Y")){ // footer = null; // if (null != sqrbh && StrUtil.isNotBlank(sqrbh)){ // makeYiShiInfoLine(phrase, doctorFonts, sqrxm, sqrbh,"申请人:"); // } // if (null != jcysbh && StrUtil.isNotBlank(jcysbh)){ // makeYiShiInfoLine(phrase, doctorFonts, jcysqm, jcysbh," 检查医师:"); // } // if (null != shysbh && StrUtil.isNotBlank(shysbh)){ // makeYiShiInfoLine(phrase, doctorFonts, shysqm, shysbh," 审核医师:"); // } // if (null != bgysbh && StrUtil.isNotBlank(bgysbh)){ // makeYiShiInfoLine(phrase, doctorFonts, bgysqm, bgysbh," 报告医师:"); // } // }else { builder = new StringBuilder(); if (null != sqrxm && StrUtil.isNotBlank(sqrxm)) { builder.append("申请人:").append(sqrxm); } if (null != jcysqm && StrUtil.isNotBlank(jcysqm)) { builder.append(" 检查医师:").append(jcysqm); } if (null != shysqm && StrUtil.isNotBlank(shysqm)) { builder.append(" 审核医师:").append(shysqm); } if (null != bgysqm && StrUtil.isNotBlank(bgysqm)) { builder.append(" 报告医师:").append(bgysqm); } footer = builder.toString().trim(); // } // elements.add(phrase); ByteArrayOutputStream outputStream = makeJcPDFByteArrayStream(xm, xb, nl, jcks, zyh, ch, sjks, jcsb, jch, jcxm, ms, ts, null, footer, elements); if (outputStream == null) throw new Exception(); jianchas.add(outputStream); } return jianchas; } /** * 生成检查表格存储过程时用 * * @param tjOrder * @return */ private List makeCcgcHisJianChaTable(TjOrder tjOrder) throws Exception { TjCustomer customer = tjCustomerService.getById(tjOrder.getUserId()); List list = jcbgdService.getJianJcBaoGaoDanByTjh(tjOrder.getCardId()); List jianchas = new ArrayList<>(); Paragraph elements = new Paragraph(); elements.setLeading(5f); elements.setSpacingBefore(10f); elements.setSpacingAfter(10f); elements.setAlignment(Element.ALIGN_RIGHT); for (LtkjExamJcbgd getexamreportinfo : list) { String xm = customer.getCusName(); String xb = customer.getCusSex() == 2 ? "女" : "男"; String nl = customer.getAge(); String jcks = "体检中心"; String sjks = ""; String jcsb = ""; String jch = getexamreportinfo.getTmh(); String jcxm = getexamreportinfo.getXmmc(); String ms = getexamreportinfo.getYxbx(); String ts = getexamreportinfo.getYxzd(); String bgysqm = getexamreportinfo.getShysxm(); String shysqm = getexamreportinfo.getShysdm(); String sqrxm = "王健萍"; String zyh = ""; String ch = ""; String jcysqm = getexamreportinfo.getShysdm(); StringBuilder builder; String footer; builder = new StringBuilder(); if (null != sqrxm && StrUtil.isNotBlank(sqrxm)) { builder.append("申请人:").append(sqrxm); } if (null != jcysqm && StrUtil.isNotBlank(jcysqm)) { builder.append(" 检查医师:").append(jcysqm); } if (null != shysqm && StrUtil.isNotBlank(shysqm)) { builder.append(" 审核医师:").append(shysqm); } if (null != bgysqm && StrUtil.isNotBlank(bgysqm)) { builder.append(" 报告医师:").append(bgysqm); } footer = builder.toString().trim(); ByteArrayOutputStream outputStream = makeJcPDFByteArrayStream(xm, xb, nl, jcks, zyh, ch, sjks, jcsb, jch, jcxm, ms, ts, null, footer, elements); if (outputStream == null) throw new Exception(); jianchas.add(outputStream); } return jianchas; } /** * 医师信息行 * * @param phrase * @param doctorFonts * @param sqrxm * @param sqrbh * @throws BadElementException */ private void makeYiShiInfoLine(Phrase phrase, Font doctorFonts, String sqrxm, String sqrbh, String title) throws BadElementException { String qmImg = dictUserInfoMapper.selectQmImgInnerJoinUserByHisDictCode(sqrbh); // String qmImg = dictUserInfoMapper.selectQmImgInnerJoinUserByUserId(sqrbh); if (null != qmImg && StrUtil.isNotBlank(qmImg)) { byte[] decode = Base64.getDecoder().decode(qmImg); Image image = null; try { image = Image.getInstance(decode); image.scaleToFit(60, 25); phrase.add(new Chunk(title, doctorFonts)); phrase.add(new Chunk(image, 0, -10, true)); } catch (IOException e) { phrase.add(new Chunk(title + sqrxm, doctorFonts)); } } else { phrase.add(new Chunk(title + sqrxm, doctorFonts)); } } /** * PDF文件存储至本地 * * @param tjOrder * @param customer * @param finalOutPut */ private void savePDFFile(String outputFileName1, TjOrder tjOrder, TjCustomer customer, ByteArrayOutputStream finalOutPut) throws IOException, DocumentException, InterruptedException { // 第一步:生成文件并保存 String outputPath1 = value + File.separator; File file = new File(outputPath1 + outputFileName1); BufferedOutputStream outputStream = null; outputStream = new BufferedOutputStream(new FileOutputStream(file)); outputStream.write(finalOutPut.toByteArray()); outputStream.flush(); outputStream.close(); finalOutPut.close(); // Thread.sleep(2000); // // FileInputStream fileInputStream = new FileInputStream(file); // FileOutputStream fileOutputStream = new FileOutputStream(file); // // PdfReader pdfReader = new PdfReader(fileInputStream); // PdfStamper pdfStamper = new PdfStamper(pdfReader, fileOutputStream); // AcroFields form = pdfStamper.getAcroFields(); // // List fieldNames = new ArrayList<>(form.getFields().keySet()); // if (fieldNames.contains("page")) { // form.setField("page", "1111"); // } // // pdfStamper.setFormFlattening(true); // 设置为 true 后表单字段不可编辑 // // pdfStamper.close(); // pdfReader.close(); // fileInputStream.close(); // fileOutputStream.close(); } /** * 填充检验表格数据 * * @param document1 * @param map * @throws DocumentException */ private void makeHisJianYanTable(Document document1, HashMap map, DictHosp dictHosp, String colorStr) throws DocumentException { if (!map.isEmpty()) { String[] titles = new String[]{"体检项目", "体检结果", "提示", "单位", "参考范围"}; float[] titlesWidth = new float[]{280, 100, 40, 100, 120}; for (Map.Entry entry : map.entrySet()) { String titleName = entry.getKey().trim(); HashMap entryValue = (HashMap) entry.getValue(); HashSet jyys = (HashSet) entryValue.get("jyys"); ArrayList> lists = (ArrayList>) entryValue.get("data"); String shsj = entryValue.get("shsj").toString(); addJianYanTable(document1, titleName, titles, titlesWidth, lists, dictHosp, colorStr); if (!jyys.isEmpty()) { Font doctorFonts = PdfUtils.setFont(DEFAULT_FONT_SIZE); String doctors = ""; Paragraph elements = new Paragraph(); elements.setLeading(5f); elements.setSpacingBefore(10f); elements.setSpacingAfter(10f); elements.setAlignment(Element.ALIGN_RIGHT); Phrase phrase = new Phrase(); phrase.add(new Chunk("检查日期:" + shsj + " 审核医师:", doctorFonts)); boolean flag = false; for (String s : jyys) { if (s.contains("|")) { flag = true; String[] split = s.split("\\|"); String qmImg = dictUserInfoMapper.selectQmImgInnerJoinUserByHisDictCode(split[1]); if (null != qmImg && StrUtil.isNotBlank(qmImg)) { byte[] decode = Base64.getDecoder().decode(qmImg); Image image = null; try { image = Image.getInstance(decode); image.scaleToFit(60, 25); phrase.add(new Chunk(image, 0, -10, true)); } catch (IOException e) { phrase.add(new Chunk(split[0].trim(), doctorFonts)); } } else { phrase.add(new Chunk(split[0].trim(), doctorFonts)); } } else { doctors += s.trim() + "、"; } } if (!flag) { String substring = doctors.substring(0, doctors.length() - 1).trim(); Paragraph df = PdfUtils.setParagraph(doctorFonts, "检查日期:" + shsj + " 审核医师:" + substring); df.setAlignment(Element.ALIGN_RIGHT); document1.add(df); } else { elements.add(phrase); document1.add(elements); } } //分割线 // if (!dictHosp.getHospName().equals("澄合矿务局中心医院")) { if (!true) { LineSeparator objectName = new LineSeparator(); objectName.setOffset(-5); document1.add(objectName); } } } } /** * 非化验项目表格填充 * * @param document1 * @param printReport * @throws DocumentException */ private void notHuaYanTable(Document document1, Map> printReport, DictHosp dictHosp, String colorStr, boolean isPacs) throws DocumentException { List tjReportSpecialProjects = tjReportSpecialProjectService.list(); for (Map.Entry> entry : printReport.entrySet()) { LambdaQueryWrapper wqqq = new LambdaQueryWrapper<>(); wqqq.eq(TjProject::getProId, entry.getKey().getProId()); TjProject one11 = projectService.getOne(wqqq); if (entry.getValue() == null || entry.getValue().isEmpty()) continue; //判断该项目是否需要打印报告 if (null != one11 && "Y".equals(one11.getNeedReport())) { TjOrderRemark orderRemark = entry.getKey(); List value = entry.getValue(); if (StrUtil.isBlank(value.get(0).getProResult()) && (StrUtil.isBlank(value.get(0).getTs()) && StrUtil.isBlank(value.get(0).getSj()))) { continue; } String titleName = null; if ("1".equals(one11.getResultType())) { titleName = one11.getProName(); // 设置标题字体样式 Font titleFonts = PdfUtils.setFont(9); Paragraph paragraph = PdfUtils.setParagraph(titleFonts, titleName); // if (dictHosp.getHospName().equals("澄合矿务局中心医院")) { if (true) { Font titleFont = PdfUtils.setFont(DEFAULT_TITLE_FONT_SIZE); titleFont.setStyle(Font.BOLD); PdfPCell cellTitle = new PdfPCell(PdfUtils.setParagraph(titleFont, titleName)); cellTitle.setBorder(Rectangle.NO_BORDER); Color color = Color.decode(colorStr); cellTitle.setBackgroundColor(new BaseColor(color.getRed(), color.getGreen(), color.getBlue())); // 设置背景颜色(十六进制 RGB) // 创建表格并添加单元格 PdfPTable tableTitle = new PdfPTable(1); tableTitle.setWidthPercentage(100); tableTitle.addCell(cellTitle); // 将表格添加到文档中 document1.add(tableTitle); } else { document1.add(paragraph); } // String[] titles = {"体检项目", "体检结果", "单位"}; // Font headFont = PdfUtils.setFont(9); // Font textFont = PdfUtils.setFont(9); // PdfPTable table = PdfUtils.setTable2(headFont, textFont, titles, value,dictHosp.getHospName().equals("澄合矿务局中心医院")); // document1.add(table); // if (dictHosp.getHospName().equals("澄合矿务局中心医院") && !value.isEmpty()){ if (!value.isEmpty()) { if (value.size() > 1) { Long pid = Long.valueOf(value.get(0).getPid()); Optional match = tjReportSpecialProjects.stream() .filter(item -> item.getProId().equals(pid)) .findFirst(); if (match.isPresent()) { reportSpecialProject(document1, entry, paragraph, value,match.get()); } else { String[] titles = {"体检项目", "体检结果", "单位"}; Font headFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); Font textFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); PdfPTable table = PdfUtils.setTable2(headFont, textFont, titles, value, isPacs, new float[]{240, 240, 240}); document1.add(table); } } else { Font remarkFonts = PdfUtils.setFont(DEFAULT_FONT_SIZE); if (isPacs) { Paragraph pp; Paragraph ppp; if (StrUtil.isNotBlank(value.get(0).getSj())) { pp = PdfUtils.setParagraph(remarkFonts, "检查所见:"); document1.add(pp); ppp = new Paragraph(value.get(0).getSj(), remarkFonts); paragraph.setAlignment(Element.ALIGN_LEFT); paragraph.setLeading(5f); document1.add(ppp); } pp = PdfUtils.setParagraph(remarkFonts, "检查提示:"+value.get(0).getTs()); document1.add(pp); // ppp = new Paragraph(value.get(0).getTs(), remarkFonts); // paragraph.setAlignment(Element.ALIGN_LEFT); // paragraph.setLeading(5f); // document1.add(ppp); } else { Long pid = Long.valueOf(value.get(0).getPid()); Optional match = tjReportSpecialProjects.stream() .filter(item -> item.getProId().equals(pid)) .findFirst(); if (match.isPresent()) { reportSpecialProject(document1, entry, paragraph, value,match.get()); } else { String[] titles = {"体检项目", "体检结果"}; Font headFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); Font textFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); PdfPTable table = PdfUtils.setTable2(headFont, textFont, titles, value, false, new float[]{240, 300}); document1.add(table); } } } } else { String[] titles = {"体检项目", "体检结果", "单位"}; Font headFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); Font textFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); PdfPTable table = PdfUtils.setTable2(headFont, textFont, titles, value, isPacs, new float[]{240, 240, 240}); document1.add(table); } //判断备注是否为空 空不能显示null if (entry.getKey().getRemark() == null) { entry.getKey().setRemark(""); } // if (!dictHosp.getHospName().equals("澄合矿务局中心医院")){ if (false) { String remark = "备注:" + entry.getKey().getRemark(); if (entry.getKey().getRemark().length() > 50) { int j = 0; for (int i = 0; i < remark.length() / 50; i++) { String substring = remark.substring(j, j + 50); Font remarkFonts = PdfUtils.setFont(DEFAULT_FONT_SIZE); Paragraph pp = PdfUtils.setParagraph(remarkFonts, substring); document1.add(pp); j = j + 50; } if (remark.length() % 50 != 0) { String substring = remark.substring((remark.length() / 50) * 50, remark.length() - 1); Font remarkFonts = PdfUtils.setFont(DEFAULT_FONT_SIZE); Paragraph pp = PdfUtils.setParagraph(remarkFonts, substring); document1.add(pp); } } else { Font remarkFonts = PdfUtils.setFont(DEFAULT_FONT_SIZE); Paragraph pp = PdfUtils.setParagraph(remarkFonts, remark); document1.add(pp); } } //判断主检医师是否为空 空不能显示null zhuJianYiShi(document1, entry, orderRemark.getCreateTime(), dictHosp); //分割线 // if (!dictHosp.getHospName().equals("澄合矿务局中心医院")) { if (false) { LineSeparator objectName = new LineSeparator(); document1.add(objectName); } } else { if (entry.getValue().get(0).getProName().contains(";")) titleName = entry.getValue().get(0).getProName(); else titleName = one11.getProName(); // 设置标题字体样式 Font titleFonts = PdfUtils.setFont(DEFAULT_FONT_SIZE); Paragraph paragraph = PdfUtils.setParagraph(titleFonts, titleName); // if (dictHosp.getHospName().equals("澄合矿务局中心医院")) { if (StrUtil.isBlank(value.get(0).getProResult()) && (StrUtil.isBlank(value.get(0).getTs()) && StrUtil.isBlank(value.get(0).getSj()))) { continue; } Font titleFont = PdfUtils.setFont(DEFAULT_TITLE_FONT_SIZE); titleFont.setStyle(Font.BOLD); PdfPCell cellTitle = new PdfPCell(PdfUtils.setParagraph(titleFont, titleName)); cellTitle.setBorder(Rectangle.NO_BORDER); Color color = Color.decode("#B4CDCD"); cellTitle.setBackgroundColor(new BaseColor(color.getRed(), color.getGreen(), color.getBlue())); // 设置背景颜色(十六进制 RGB) // 创建表格并添加单元格 PdfPTable tableTitle = new PdfPTable(1); tableTitle.setWidthPercentage(100); tableTitle.addCell(cellTitle); // 将表格添加到文档中 document1.add(tableTitle); // String[] titles = {"体检项目", "体检结果", "单位"}; // Font headFont = PdfUtils.setFont(9); // Font textFont = PdfUtils.setFont(9); // PdfPTable table = PdfUtils.setTable(headFont, textFont, titles, value,dictHosp.getHospName().equals("澄合矿务局中心医院")); // document1.add(table); // if (dictHosp.getHospName().equals("澄合矿务局中心医院") && !value.isEmpty()){ if (!value.isEmpty()) { if (value.size() > 1) { Long pid = Long.valueOf(value.get(0).getPid()); Optional match = tjReportSpecialProjects.stream() .filter(item -> item.getProId().equals(pid)) .findFirst(); if (match.isPresent()) { reportSpecialProject(document1, entry, paragraph, value,match.get()); } else { String[] titles = {"体检项目", "体检结果", "单位"}; Font headFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); Font textFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); PdfPTable table = PdfUtils.setTable2(headFont, textFont, titles, value, isPacs, new float[]{240, 240, 240}); document1.add(table); } } else { Font remarkFonts = PdfUtils.setFont(DEFAULT_FONT_SIZE); if (isPacs) { Paragraph pp; Paragraph ppp; // String key = sysConfigService.selectConfigByKey("makepdfuseorderdetailproresult"); // if (StrUtil.isNotBlank(key) && !key.equals("Y")){ // if (StrUtil.isNotBlank(value.get(0).getSj())) { // pp = PdfUtils.setParagraph(remarkFonts, "检查所见:"); // document1.add(pp); // ppp = new Paragraph(value.get(0).getSj(), remarkFonts); // paragraph.setAlignment(Element.ALIGN_LEFT); // paragraph.setLeading(5f); // document1.add(ppp); // } // }else { // if (StrUtil.isNotBlank(value.get(0).getSj()) || StrUtil.isNotBlank(value.get(0).getProResult())) { // pp = PdfUtils.setParagraph(remarkFonts, "检查所见:"); // document1.add(pp); // ppp = new Paragraph(value.get(0).getSj() != null ? value.get(0).getSj() : value.get(0).getProResult(), remarkFonts); // paragraph.setAlignment(Element.ALIGN_LEFT); // paragraph.setLeading(5f); // document1.add(ppp); // } // } if (StrUtil.isNotBlank(value.get(0).getSj()) || StrUtil.isNotBlank(value.get(0).getProResult())) { pp = PdfUtils.setParagraph(remarkFonts, "检查所见:"); document1.add(pp); ppp = new Paragraph(value.get(0).getSj() != null ? value.get(0).getSj() : value.get(0).getProResult(), remarkFonts); paragraph.setAlignment(Element.ALIGN_LEFT); paragraph.setLeading(5f); document1.add(ppp); } pp = PdfUtils.setParagraph(remarkFonts, "检查提示:"); document1.add(pp); ppp = new Paragraph((value.get(0).getTs() != null ? value.get(0).getTs() : value.get(0).getProResult()), remarkFonts); paragraph.setAlignment(Element.ALIGN_LEFT); paragraph.setLeading(5f); document1.add(ppp); // ppp = new Paragraph(value.get(0).getTs() != null ? value.get(0).getTs() : value.get(0).getProResult(), remarkFonts); // paragraph.setAlignment(Element.ALIGN_LEFT); // paragraph.setLeading(5f); // document1.add(ppp); } else { Long pid = Long.valueOf(value.get(0).getPid()); Optional match = tjReportSpecialProjects.stream() .filter(item -> item.getProId().equals(pid)) .findFirst(); if (match.isPresent()) { reportSpecialProject(document1, entry, paragraph, value,match.get()); } else { String[] titles = {"体检项目", "体检结果"}; Font headFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); Font textFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); PdfPTable table = PdfUtils.setTable2(headFont, textFont, titles, value, false, new float[]{240, 300}); document1.add(table); } } } } else { String[] titles = {"体检项目", "体检结果", "单位"}; Font headFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); Font textFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); PdfPTable table = PdfUtils.setTable(headFont, textFont, titles, value, isPacs); document1.add(table); } //判断备注是否为空 空不能显示null if (entry.getKey().getRemark() == null) { entry.getKey().setRemark(""); } // if (!dictHosp.getHospName().equals("澄合矿务局中心医院")){ if (!true) { String remark = "备注:" + entry.getKey().getRemark(); if (entry.getKey().getRemark().length() > 50) { int j = 0; for (int i = 0; i < remark.length() / 50; i++) { String substring = remark.substring(j, j + 50); Font remarkFonts = PdfUtils.setFont(DEFAULT_FONT_SIZE); Paragraph pp = PdfUtils.setParagraph(remarkFonts, substring); document1.add(pp); j = j + 50; } if (remark.length() % 50 != 0) { String substring = remark.substring((remark.length() / 50) * 50, remark.length() - 1); Font remarkFonts = PdfUtils.setFont(DEFAULT_FONT_SIZE); Paragraph pp = PdfUtils.setParagraph(remarkFonts, substring); document1.add(pp); } } else { Font remarkFonts = PdfUtils.setFont(DEFAULT_FONT_SIZE); Paragraph pp = PdfUtils.setParagraph(remarkFonts, remark); document1.add(pp); } } //判断主检医师是否为空 空不能显示null zhuJianYiShi(document1, entry, orderRemark.getCreateTime(), dictHosp); // if (!dictHosp.getHospName().equals("澄合矿务局中心医院")) { if (!true) { //分割线 LineSeparator objectName = new LineSeparator(); document1.add(objectName); } } } } } /** * 目前写死 只有碳13、14 模板都是一样的只不过参考值不同 * 凌云:{"dy":"4.0","xy":"4.0","title":"阳性参考值:","dystr":"DOB值: ≥ ${dy} HP-阳性","xystr":" < ${xy} 正常","en":"DOB"} * 泾川县医院:{"dy":"100","xy":"100","title":"参考值(DPM):","dystr":"DPM值: ≥ ${dy} 阳性","xystr":" < ${xy} 阴性","en":"DPM"} * @param document1 * @param entry * @param paragraph * @param value * @param tjReportSpecialProject * @throws DocumentException */ private static void reportSpecialProject(Document document1, Map.Entry> entry, Paragraph paragraph, List value,TjReportSpecialProject tjReportSpecialProject) throws DocumentException { JSONObject entries = JSONUtil.parseObj(tjReportSpecialProject.getParams()); Font remarkFonts = PdfUtils.setFont(DEFAULT_FONT_SIZE); Paragraph ppp = new Paragraph(entries.getStr("title"), remarkFonts); paragraph.setAlignment(Element.ALIGN_LEFT); paragraph.setLeading(5f); document1.add(ppp); ppp = new Paragraph(entries.getStr("dystr").replace("${dy}",entries.getStr("dy")), remarkFonts); paragraph.setAlignment(Element.ALIGN_LEFT); paragraph.setLeading(5f); document1.add(ppp); ppp = new Paragraph(entries.getStr("xystr").replace("${xy}",entries.getStr("xy")), remarkFonts); paragraph.setAlignment(Element.ALIGN_LEFT); paragraph.setLeading(5f); document1.add(ppp); ppp = new Paragraph("检测结果: "+entries.getStr("en")+"=" + value.get(0).getProResult(), remarkFonts); paragraph.setAlignment(Element.ALIGN_LEFT); paragraph.setLeading(5f); document1.add(ppp); ppp = new Paragraph("", remarkFonts); paragraph.setAlignment(Element.ALIGN_LEFT); paragraph.setLeading(5f); document1.add(ppp); ppp = new Paragraph("", remarkFonts); paragraph.setAlignment(Element.ALIGN_LEFT); paragraph.setLeading(5f); document1.add(ppp); if (StrUtil.isNotBlank(entry.getKey().getRemark())) { ppp = new Paragraph("结论:" + entry.getKey().getRemark().replaceAll("null",""), remarkFonts); paragraph.setAlignment(Element.ALIGN_LEFT); paragraph.setLeading(5f); document1.add(ppp); } } /** * 主见医师行显示设置 * * @param document1 * @param entry * @throws DocumentException */ private void zhuJianYiShi(Document document1, Map.Entry> entry, Date createTime, DictHosp dictHosp) throws DocumentException { // if ((null != entry.getKey().getDoctorName() && null != userService.getById(entry.getKey().getDoctorName())) || dictHosp.getHospName().equals("澄合矿务局中心医院") ) { if ((null != entry.getKey().getDoctorName() && null != userService.getById(entry.getKey().getDoctorName())) || true) { //主检医师 String key = sysConfigService.selectConfigByKey("is_report_pdf_use_ysqm"); SysUser sysUser = userService.getById(entry.getKey().getDoctorName()); String doctorNameDefault = "无"; if (sysUser != null) doctorNameDefault = sysUser.getNickName(); // if (!entry.getValue().isEmpty() && StrUtil.isNotBlank(entry.getValue().get(0).getShys()) && dictHosp.getHospName().equals("澄合矿务局中心医院")){ if (!entry.getValue().isEmpty() && StrUtil.isNotBlank(entry.getValue().get(0).getShys()) && true) { doctorNameDefault = entry.getValue().get(0).getShys(); } Font doctorFonts = PdfUtils.setFont(9); if (key.equals("Y")) { String qmImg = dictUserInfoMapper.selectQmImgInnerJoinUserByUserId(String.valueOf(sysUser.getUserId())); if (null != qmImg && StrUtil.isNotBlank(qmImg)) { Paragraph elements = new Paragraph(); elements.setLeading(5f); elements.setSpacingBefore(10f); elements.setSpacingAfter(10f); elements.setAlignment(Element.ALIGN_RIGHT); Phrase phrase = new Phrase(); if (createTime != null) { phrase.add(new Chunk("检查时间:" + new SimpleDateFormat("yyyy-MM-dd").format(createTime) + " 主检医师:", doctorFonts)); } else { phrase.add(new Chunk("主检医师:", doctorFonts)); } byte[] decode = Base64.getDecoder().decode(qmImg); Image image = null; try { image = Image.getInstance(decode); image.scaleToFit(60, 25); phrase.add(new Chunk(image, 0, -10, true)); elements.add(phrase); document1.add(elements); } catch (IOException e) { String doctorName = "主检医师:" + doctorNameDefault; if (createTime != null) doctorName = "检查时间:" + new SimpleDateFormat("yyyy-MM-dd").format(createTime) + " 主检医师:" + doctorNameDefault; Paragraph df = PdfUtils.setParagraph(doctorFonts, doctorName); df.setAlignment(Element.ALIGN_RIGHT); document1.add(df); } } else { String doctorName = "主检医师:" + doctorNameDefault; if (createTime != null) doctorName = "检查时间:" + new SimpleDateFormat("yyyy-MM-dd").format(createTime) + " 主检医师:" + doctorNameDefault; Paragraph df = PdfUtils.setParagraph(doctorFonts, doctorName); df.setAlignment(Element.ALIGN_RIGHT); document1.add(df); } } else { String doctorName = "主检医师:" + doctorNameDefault; if (createTime != null) doctorName = "检查时间:" + new SimpleDateFormat("yyyy-MM-dd").format(createTime) + " 主检医师:" + doctorNameDefault; Paragraph df = PdfUtils.setParagraph(doctorFonts, doctorName); df.setAlignment(Element.ALIGN_RIGHT); document1.add(df); } } else { String doctorName = "主检医师:" + "无"; if (createTime != null) doctorName = "检查时间:" + new SimpleDateFormat("yyyy-MM-dd").format(createTime) + " 主检医师:" + "无"; Font doctorFonts = PdfUtils.setFont(9); Paragraph df = PdfUtils.setParagraph(doctorFonts, doctorName); df.setAlignment(Element.ALIGN_RIGHT); document1.add(df); } } public HashMap makeHisJianYan(TjOrder tjOrder, TjCustomer customer) { LambdaQueryWrapper ltkjHysqdLambdaQueryWrapper = new LambdaQueryWrapper<>(); ltkjHysqdLambdaQueryWrapper.eq(LtkjHysqd::getTjh, tjOrder.getCardId()); List list = ltkjHysqdService.list(ltkjHysqdLambdaQueryWrapper); HashMap data = new HashMap<>(); for (LtkjHysqd hysqd : list) { // LambdaQueryWrapper ltkjHybgdLambdaQueryWrapper = new LambdaQueryWrapper<>(); // ltkjHybgdLambdaQueryWrapper.eq(LtkjHybgd::getTmh, hysqd.getTmh()); // List hybgds = ltkjHybgdService.list(ltkjHybgdLambdaQueryWrapper); List hybgds = ltkjHybgdService.getReportJianYanBaoGaoDanList(hysqd.getTmh()); if(null !=hybgds && !hybgds.isEmpty()){ hybgds = new ArrayList<>(hybgds.stream() .collect(Collectors.toMap(LtkjHybgd::getJcxm, p -> p, (existing, replacement) -> existing)) .values()); // hybgds=hybgds.stream().sorted(Comparator.comparing(LtkjHybgd::getJcxm, Collator.getInstance(Locale.CHINA))).collect(Collectors.toList()); // hybgds = hybgds.stream() // .sorted(Comparator.comparingInt( // a -> a.getJcxm().length() // 根据名字的长度排序 // )) // .collect(Collectors.toList()); // 大类项目名称 String xmmc = hysqd.getXmmc(); ArrayList> lists = new ArrayList<>(); HashSet hashSet = new HashSet<>(); String shsj = ""; for (LtkjHybgd hybgd : hybgds) { shsj = hybgd.getShsj(); // 检查项目 String jcxm = hybgd.getJcxm() != null ? hybgd.getJcxm().trim() : null; // 检验结果 String jyjg = hybgd.getJyjg() != null ? hybgd.getJyjg().trim() : null; // 结果单位 String jgdw = hybgd.getJgdw() != null ? hybgd.getJgdw().trim() : null; // 范围值 String fwz = hybgd.getFwz() != null ? hybgd.getFwz().trim() : null; // 检验医师 // String jyys = hybgd.getJyys(); //审核医生 String shysmc = hybgd.getShysmc() != null ? hybgd.getShysmc().trim() : null; // 审核医师编码 String shys = hybgd.getShys() != null ? hybgd.getShys().trim() : null; String ycbz = ""; if (jyjg != null && StrUtil.isNotBlank(jyjg) && fwz != null && StrUtil.isNotBlank(fwz)) { try { String[] fwzs = fwz.split("-"); BigDecimal min = new BigDecimal(fwzs[0]); BigDecimal max = new BigDecimal(fwzs[1]); BigDecimal jyjgval = new BigDecimal(jyjg); // 比较检验结果和范围值 if (jyjgval.compareTo(min) < 0) { // jyjg 小于范围最小值,添加下箭头 // jyjg = jyjg + " ↓"; ycbz = "↓"; } else if (jyjgval.compareTo(max) > 0) { // jyjg 大于范围最大值,添加上箭头 // jyjg = jyjg + " ↑"; ycbz = "↑"; } } catch (Exception ignored) { } } // LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); // queryWrapper.eq(SysUser::getUserName,jyys); // List sysUsers = userService.list(queryWrapper); // if (!sysUsers.isEmpty()) // hashSet.add(sysUsers.get(0).getNickName()); String key = sysConfigService.selectConfigByKey("is_report_pdf_use_ysqm"); if (null != shys && null != shysmc && key.equals("Y")) { hashSet.add(shysmc + "|" + shys); } else { if (null != shysmc) hashSet.add(shysmc); } ArrayList strings = new ArrayList<>(); strings.add(jcxm); strings.add(jyjg); strings.add(ycbz); strings.add(jgdw); strings.add(fwz); strings.add(hybgd.getJcxmid()); strings.add(hysqd.getXmid()); lists.add(strings); } if (!lists.isEmpty()) { HashMap map = new HashMap<>(); map.put("data", lists); map.put("jyys", hashSet); if (StrUtil.isNotBlank(shsj)) { shsj = shsj.split(" ")[0]; } map.put("shsj", shsj); data.put(xmmc, map); } } } return data; } /** * 生成PDF模版以及用户信息部分 * * @param tjOrder * @param reportTemplate */ public HashMap makePDFInfo(TjOrder tjOrder, TjCustomer tjCustomer, TjReportTemplate reportTemplate, DictHosp dictHosp, HashMap jianYanMap) { String tjNumber = tjOrder.getTjNumber(); String template = reportTemplate.getTemplate(); LambdaQueryWrapper wq111 = new LambdaQueryWrapper<>(); wq111.eq(DictComp::getDrugManufacturerId, tjOrder.getFirmId()); DictComp dictComp = dictCompService.getOne(wq111); LambdaQueryWrapper wq2 = new LambdaQueryWrapper<>(); wq2.eq(TjOrderDetail::getOrderId, tjOrder.getOrderId()); //20230306判断该项目是否退费/缴费 wq2.isNotNull(TjOrderDetail::getFlowingWaterId); //20230323判断该项目是否弃检/未检 // wq2.eq(TjOrderDetail::getTjStatus,1); List list = tjOrderDetailService.list(wq2); for (TjOrderDetail tjOrderDetail : list) { TjProject tjProject = projectService.selectTjProjectByProId(tjOrderDetail.getProId()); tjOrderDetail.setProject(tjProject); } ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); PdfReader reader = null; PdfStamper pdfStamper = null; try { reader = new PdfReader(new ByteArrayInputStream(Base64.getDecoder().decode(template))); pdfStamper = new PdfStamper(reader, byteArrayOutputStream); // 获取pdf表单 AcroFields acroFields = pdfStamper.getAcroFields(); BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); acroFields.addSubstitutionFont(bf); HashMap data = new HashMap<>(); // 设置用户信息 setUserInfo(tjNumber, tjOrder, tjCustomer, data); //异常项目 if (dictComp == null) { data.put("work", "无"); } else { data.put("work", dictComp.getCnName()); } //封面页下面的总检建议显示 if (tjOrder.getCheckAdvice() == null) { data.put("remark", "无"); } else { data.put("remark", tjOrder.getCheckAdvice()); } //封面页下面的总检建议显示 if (tjOrder.getCheckDoctor() == null) { data.put("docname", "无"); } else { data.put("docname", tjOrder.getCheckDoctor()); } //拼接重大阳性结果 StringBuffer str = new StringBuffer(); // if (!dictHosp.getHospName().equals("澄合矿务局中心医院")) { if (!true) { str.append("【重大阳性项目】\n"); LambdaQueryWrapper bigPositiveLambdaQueryWrapper = new LambdaQueryWrapper<>(); bigPositiveLambdaQueryWrapper.eq(TjBigPositive::getTjNumber, tjNumber); List list1 = tjBigPositiveService.list(bigPositiveLambdaQueryWrapper); if (list1 != null && list1.size() > 0) { for (int i = 0; i < list1.size(); i++) { str.append((i + 1) + "、" + list1.get(i).getProName() + ";\n"); } } else { str.append(" 无;\n"); } } //拼接异常项目 str.append("【异常情况项目】\n"); // if (!dictHosp.getHospName().equals("澄合矿务局中心医院")) { if (!true) { if (list.size() > 0) { for (int i = 0; i < list.size(); i++) { if (list.get(i).getExceptionDesc() == 1) { str.append((i + 1) + "、" + projectService.getById(list.get(i).getProId()).getProName() + ";\n"); } } } else { str.append(" 无;\n"); } } else { int maxProjectLength = 0; for (Map.Entry item : jianYanMap.entrySet()) { HashMap entryValue = (HashMap) item.getValue(); ArrayList> lists = (ArrayList>) entryValue.get("data"); for (List i : lists) { maxProjectLength = Math.max(maxProjectLength, i.get(0).length()); } } int projectWidth = maxProjectLength * 2; int resultWidth = 8; int flagWidth = 8; int unitWidth = 8; int rangeWidth = 15; str.append(padRight("项目", projectWidth)) .append(padRight("结果", resultWidth)) .append(padRight("标志", flagWidth)) .append(padRight("单位", unitWidth)) .append(padRight("参考范围", rangeWidth)) .append("\n"); for (Map.Entry item : jianYanMap.entrySet()) { HashMap entryValue = (HashMap) item.getValue(); ArrayList> lists = (ArrayList>) entryValue.get("data"); for (List i : lists) { if (i.contains("↓") || i.contains("↑")) { int currentProjectWidth = i.get(0).length() + (maxProjectLength - i.get(0).length()) * 2 + 2; str.append(padRight(i.get(0), currentProjectWidth)); str.append(padRight(i.get(1), resultWidth)); str.append(padRight(i.get(2), flagWidth)); str.append(padRight(i.get(3), unitWidth)); str.append(padRight(i.get(4), rangeWidth)); str.append("\n"); } } } } //异常项目 data.put("yichang", str.toString()); data.put("zjrq", new SimpleDateFormat("yyyy-MM-dd").format(tjOrder.getCheckTime())); // 遍历data 给pdf表单表格赋值 for (String key : data.keySet()) { acroFields.setField(key, data.get(key).toString()); } //设置为无法编辑 pdfStamper.setFormFlattening(true); pdfStamper.close(); reader.close(); // 将修改后的PDF内容写入 byte[] bytes = byteArrayOutputStream.toByteArray(); // 创建新的PDF文档 Document document = new Document(PageSize.A4); ByteArrayOutputStream finalOutPut = new ByteArrayOutputStream(); PdfCopy copy = new PdfCopy(document, finalOutPut); document.open(); reader = new PdfReader(bytes); int numberOfPages = reader.getNumberOfPages(); for (int i = 1; i <= numberOfPages; i++) { PdfImportedPage page = copy.getImportedPage(reader, i); copy.addPage(page); } // 添加详情页 document.newPage(); HashMap map = new HashMap<>(); map.put("document", document); map.put("copy", copy); map.put("stream", finalOutPut); map.put("form", pdfStamper); return map; } catch (IOException | DocumentException e) { e.printStackTrace(); return null; } } public static String padRight(String str, int length) { StringBuilder sb = new StringBuilder(str); while (sb.length() < length) { sb.append(" "); } return sb.toString(); } /** * 组合非化验项目报告数据 * * @param tjNumber * @param printReport * @param one * @param customer */ private void notHuaYanData(String tjNumber, Map> printReport, TjOrder one, TjCustomer customer) { // LambdaQueryWrapper wqq = new LambdaQueryWrapper<>(); // wqq.eq(TjOrderRemark::getTjNumber, tjNumber); // wqq.ne(TjOrderRemark::getDeptId, "241"); // wqq.in(TjOrderRemark::getDeptId, "269", "270", "253", "254", "255", "257"); // wqq.notIn(TjOrderRemark::getProId, projectService.getNneedReprotProId()); // List tjOrderRemarks = tjOrderRemarkService.list(wqq); List tjOrderRemarks = tjOrderRemarkService.notHuaYanData(tjNumber); for (TjOrderRemark tjOrderRemark : tjOrderRemarks) { printReport.put(tjOrderRemark,null); } for (Map.Entry> entry : printReport.entrySet()) { List tjPdfVOS = new ArrayList<>(); List tjOrderDetails = tjOrderDetailService.getDetailByOrderIdAndParId(one.getOrderId(), entry.getKey().getProId()); tjOrderDetails = tjOrderDetails.stream().filter(i -> StrUtil.isNotBlank(i.getProResult())).collect(Collectors.toList()); tjOrderDetails = new ArrayList<>(tjOrderDetails.stream() .collect(Collectors.toMap(TjOrderDetail::getProId, i -> i, (existing, replacement) -> existing)).values()); for (TjOrderDetail tjOrderDetail : tjOrderDetails) { TjProject tjProject = projectService.getById(String.valueOf(tjOrderDetail.getProId())); if (null != tjProject && tjProject.getNeedReport().equals("Y")) { tjOrderDetail.setProject(tjProject); if (tjOrderDetail.getProject().getProParentId().equals(entry.getKey().getProId()) && entry.getKey().getType() == 1) { TjPdfVO tjPdfVO = new TjPdfVO(); tjPdfVO.setProName(tjOrderDetail.getProject().getProName()); tjPdfVO.setProResult(tjOrderDetail.getProResult()); tjPdfVO.setExc(tjOrderDetail.getExceptionDesc()); if (null != tjProject.getProMetering()) { tjPdfVO.setCompany(tjProject.getProMetering()); } else { tjPdfVO.setCompany("/"); } tjPdfVO.setProId(String.valueOf(tjOrderDetail.getProject().getProId())); tjPdfVO.setPid(String.valueOf(tjProject.getProParentId())); // LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // wrapper.eq(LtkjExamJcbgd::getTjh, tjNumber); // wrapper.eq(LtkjExamJcbgd::getXmdm, String.valueOf(tjOrderDetail.getProject().getProParentId())); tjPdfVOS.add(tjPdfVO); } } } if(!tjPdfVOS.isEmpty()){ tjPdfVOS=tjPdfVOS.stream().sorted(Comparator.comparing(TjPdfVO::getProName, Collator.getInstance(Locale.CHINA))).collect(Collectors.toList()); tjPdfVOS = tjPdfVOS.stream() .sorted(Comparator.comparingInt( tjPdfVO -> tjPdfVO.getProName().length() // 根据名字的长度排序 )) .collect(Collectors.toList()); } printReport.put(entry.getKey(), tjPdfVOS); } } private void pacsJianChaData(String tjNumber, Map> printReport, TjOrder one, TjCustomer customer) { // LambdaQueryWrapper wqq = new LambdaQueryWrapper<>(); // wqq.eq(TjOrderRemark::getTjNumber, tjNumber); // wqq.ne(TjOrderRemark::getDeptId, "241"); // wqq.in(TjOrderRemark::getDeptId, "269", "270", "253", "254", "255", "257"); // wqq.notIn(TjOrderRemark::getProId, projectService.getNneedReprotProId()); // List tjOrderRemarks = tjOrderRemarkService.list(wqq); List tjOrderRemarks = tjOrderRemarkService.pacsJianChaData(tjNumber); for (TjOrderRemark tjOrderRemark : tjOrderRemarks) { printReport.put(tjOrderRemark, null); } String ids = ""; for (Map.Entry> entry : printReport.entrySet()) { List tjPdfVOS = new ArrayList<>(); List tjOrderDetails = tjOrderDetailService.getDetailByOrderIdAndParId(one.getOrderId(), entry.getKey().getProId()); tjOrderDetails = new ArrayList<>(tjOrderDetails.stream().collect(Collectors.toMap(TjOrderDetail::getProId, i -> i, (existing, replacement) -> existing)).values()); for (TjOrderDetail tjOrderDetail : tjOrderDetails) { TjProject tjProject = projectService.getById(tjOrderDetail.getProId()); if (null != tjProject && tjProject.getNeedReport().equals("Y")) { tjOrderDetail.setProject(tjProject); if (tjOrderDetail.getProject().getProParentId().equals(entry.getKey().getProId()) && entry.getKey().getType() == 1 && !ids.contains(String.valueOf(tjOrderDetail.getProject().getProParentId()))) { TjProject tjProjectq = projectService.getById(tjOrderDetail.getProject().getProParentId()); TjPdfVO tjPdfVO = new TjPdfVO(); tjPdfVO.setProName(tjOrderDetail.getProject().getProName()); tjPdfVO.setProResult(tjOrderDetail.getProResult()); tjPdfVO.setExc(tjOrderDetail.getExceptionDesc()); if (null != tjProject.getProMetering()) { tjPdfVO.setCompany(tjProject.getProMetering()); } else { tjPdfVO.setCompany("/"); } tjPdfVO.setProId(String.valueOf(tjOrderDetail.getProject().getProId())); // LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // wrapper.eq(LtkjExamJcbgd::getTjh, one.getCardId()); // wrapper.like(LtkjExamJcbgd::getXmdm, String.valueOf(tjOrderDetail.getProject().getProParentId())) // .or().eq(LtkjExamJcbgd::getXmdm, String.valueOf(tjProjectq.getHisXmbm())); // wrapper.orderByDesc(LtkjExamJcbgd::getZdsj); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(LtkjExamJcbgd::getTjh, one.getCardId()) .and(w -> w.like(LtkjExamJcbgd::getXmdm, String.valueOf(tjOrderDetail.getProject().getProParentId())) .or() .eq(LtkjExamJcbgd::getXmdm, String.valueOf(tjProjectq.getHisXmbm()))).orderByDesc(LtkjExamJcbgd::getZdsj); List list = jcbgdService.list(wrapper); if (null != list && !list.isEmpty()) { LtkjExamJcbgd jcbgd = list.get(0); if (jcbgd != null) { String yxbx = jcbgd.getYxbx(); String bgNr = jcbgd.getBgNr(); // 正则表达式:匹配数字后跟 '.' 或 '、' String regex = "\\d+[\\.,、]"; // 使用正则替换,匹配的数字后添加换行符 if(StringUtil.isNotBlank(yxbx)) yxbx = yxbx.replaceAll(regex, "\n$0"); if(StringUtil.isBlank(bgNr)) bgNr = ""; if(StringUtil.isBlank(yxbx)) yxbx = ""; tjPdfVO.setTs(yxbx); tjPdfVO.setSj(bgNr); tjPdfVO.setShys(jcbgd.getShysxm()); tjPdfVO.setProName(jcbgd.getXmmc()); ids += "|" + jcbgd.getXmdm(); } } tjPdfVOS.add(tjPdfVO); } } } printReport.put(entry.getKey(), tjPdfVOS); } } /** * 设置用户信息 * * @param tjNumber * @param tjOrder * @param tjCustomer * @param data */ private void setUserInfo(String tjNumber, TjOrder tjOrder, TjCustomer tjCustomer, Map data) { //填充性别:判断男女 Long cusSex = tjCustomer.getCusSex(); String sex; String name1; String tjtype; if (cusSex == 0) { sex = "男"; name1 = tjCustomer.getCusName() + "先生"; } else { sex = "女"; name1 = tjCustomer.getCusName() + "女士"; } data.put("name", tjCustomer.getCusName()); data.put("cusId", tjCustomer.getCusId()); data.put("name1", name1); if ("1".equals(tjOrder.getTjType())) { tjtype = "团队"; data.put("tjtype", tjtype); } else { tjtype = "个人"; data.put("tjtype", tjtype); } data.put("dstype", "统一"); data.put("sex", sex); data.put("age", DateUtil.ageOfNow(tjCustomer.getCusBrithday())); data.put("tjnumber", tjNumber); data.put("tjdate", DateUtils.parseDateToStr("yyyy/MM/dd", tjOrder.getCreateTime())); data.put("phone", tjCustomer.getCusPhone()); data.put("idcard", MatchUtils.hideIdCardNum(tjCustomer.getCusIdcard())); data.put("num2", 0); data.put("num3", 4); } /** * @param document * @param titleName * @param titles * @param titlesWidth * @param list * @throws DocumentException * @deprecated 数据从数据库查有具体的实体类 */ @Deprecated private static void addTable(Document document, String titleName, String[] titles, float[] titlesWidth, ArrayList list) throws DocumentException { Font titleFont = PdfUtils.setFont(9); Paragraph paragraph = new Paragraph(titleName, titleFont); // 设置文字居中 paragraph.setAlignment(Element.ALIGN_LEFT); // 行间距 paragraph.setLeading(5f); // 设置段落上空白 paragraph.setSpacingBefore(10f); // 设置段落下空白 paragraph.setSpacingAfter(10f); document.add(paragraph); // 创建一个表格并添加到文档 Font headFont = PdfUtils.setFont(9); Font textFont = PdfUtils.setFont(9); PdfPTable table = new PdfPTable(titlesWidth); table.setTotalWidth(PageSize.A4.getWidth() - 100); // 设置表格总宽度 table.setLockedWidth(true); // 锁定表格宽度 table.setHorizontalAlignment(Element.ALIGN_LEFT); table.getDefaultCell().setBorder(0); table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); for (String title : titles) { PdfPCell cell = new PdfPCell(new Paragraph(title, headFont)); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_LEFT); cell.setBorder(Rectangle.NO_BORDER); // 移除单元格边框 table.addCell(cell); } for (TjPdfVO item : list) { Class aClass = item.getClass(); Field[] fields = aClass.getDeclaredFields(); ArrayList values = new ArrayList<>(); for (Field field : fields) { String fieldName = field.getName(); String getterName = "get" + Character.toUpperCase(fieldName.charAt(0)) + fieldName.substring(1); try { Method method = aClass.getDeclaredMethod(getterName); if (method != null) { Object invoke = method.invoke(item); if (invoke != null) { values.add(String.valueOf(invoke)); } } } catch (NoSuchMethodException e) { log.error("根据字段获取get方法异常 ->{}", e.getMessage()); } catch (InvocationTargetException | IllegalAccessException e) { log.error("反射获取类字段异常 ->{}", e.getMessage()); } } for (int i = 0; i < values.size(); i++) { String value = String.valueOf(values.get(i)); Paragraph elements = null; if (StrUtil.isBlank(value) || value.equals("null")) { elements = new Paragraph("", textFont); } else { elements = new Paragraph(value, textFont); } PdfPCell nameCell = new PdfPCell(); nameCell.setVerticalAlignment(Element.ALIGN_MIDDLE); nameCell.setHorizontalAlignment(Element.ALIGN_LEFT); nameCell.setPhrase(elements); nameCell.setBorder(Rectangle.NO_BORDER); // 移除单元格边框 table.addCell(nameCell); } } // 将表格添加到文档 document.add(table); } private static void addJianYanTable(Document document, String titleName, String[] titles, float[] titlesWidth, ArrayList> lists, DictHosp dictHosp, String colorStr) throws DocumentException { // 大项标题 Font titleFont = PdfUtils.setFont(DEFAULT_TITLE_FONT_SIZE); // if (dictHosp.getHospName().equals("澄合矿务局中心医院")) { if (true) { titleFont.setSize(DEFAULT_TITLE_FONT_SIZE); titleFont.setStyle(Font.BOLD); } Paragraph paragraph = new Paragraph(titleName, titleFont); paragraph.setAlignment(Element.ALIGN_LEFT); // 行间距 paragraph.setLeading(5f); // 设置段落上空白 paragraph.setSpacingBefore(10f); // 设置段落下空白 paragraph.setSpacingAfter(10f); // if (dictHosp.getHospName().equals("澄合矿务局中心医院")) { if (true) { // 行间距 paragraph.setLeading(7f); // 设置段落上空白 paragraph.setSpacingBefore(12f); // 设置段落下空白 paragraph.setSpacingAfter(12f); // 大项 PdfPCell cellTitle = new PdfPCell(paragraph); cellTitle.setBorder(Rectangle.NO_BORDER); Color color = Color.decode(colorStr); cellTitle.setBackgroundColor(new BaseColor(color.getRed(), color.getGreen(), color.getBlue())); // 设置背景颜色(十六进制 RGB) // 创建表格并添加单元格 PdfPTable tableTitle = new PdfPTable(1); tableTitle.setWidthPercentage(100); tableTitle.addCell(cellTitle); // 将表格添加到文档中 document.add(tableTitle); } else { document.add(paragraph); } // 创建一个表格并添加到文档 Font headFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); Font textFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); PdfPTable table = new PdfPTable(titlesWidth); table.setTotalWidth(PageSize.A4.getWidth() - 10); // 设置表格总宽度 //table.setLockedWidth(true); // 锁定表格宽度 table.setHorizontalAlignment(Element.ALIGN_LEFT); table.getDefaultCell().setBorder(0); table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT); for (String title : titles) { PdfPCell cell = new PdfPCell(new Paragraph(title, headFont)); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_LEFT); cell.setBorder(Rectangle.NO_BORDER); // 移除单元格边框 // Color color = Color.decode(colorStr); // cell.setBackgroundColor(new BaseColor(color.getRed(), color.getGreen(), color.getBlue())); // 设置背景颜色(十六进制 RGB) table.addCell(cell); } for (List list : lists) { boolean isYc = false; textFont = PdfUtils.setFont(DEFAULT_FONT_SIZE); // if (dictHosp.getHospName().equals("澄合矿务局中心医院")){ if (true) { if (list.contains("↓") || list.contains("↑")) { isYc = true; } } int index = 1; for (String s : list) { // 跳过项目id if (index == 6) continue; PdfPCell nameCell = new PdfPCell(); nameCell.setVerticalAlignment(Element.ALIGN_MIDDLE); nameCell.setHorizontalAlignment(Element.ALIGN_LEFT); nameCell.setBorder(Rectangle.NO_BORDER); // 移除单元格边框 if (isYc) { textFont.setStyle(Font.BOLD); nameCell.setPhrase(new Paragraph(s, textFont)); nameCell.setBorder(Rectangle.NO_BORDER); // Color color = Color.decode("#0033cc"); // nameCell.setBackgroundColor(new BaseColor(color.getRed(), color.getGreen(), color.getBlue())); // 设置背景颜色(十六进制 RGB) } else { nameCell.setPhrase(new Paragraph(s, textFont)); } table.addCell(nameCell); index++; } } document.add(table); } /** * 创建检查pdf * * @param xm * @param xb * @param nl * @param jcks * @param zyh * @param ch * @param sjks * @param jcsb * @param jch * @param jcxm * @param ms * @param ts * @param files * @param footer * @return bytearrayoutputstream */ public static ByteArrayOutputStream makeJcPDFByteArrayStream(String xm, String xb, String nl, String jcks, String zyh, String ch, String sjks, String jcsb, String jch , String jcxm, String ms, String ts, File[] files, String footer, Paragraph elements) { try { Document document = new Document(PageSize.A4); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PdfWriter writer = PdfWriter.getInstance(document, baos); if (footer != null) { writer.setPageEvent(new Footer(footer)); } else { writer.setPageEvent(new Footer(elements)); } document.open(); document.setMargins(70, 70, 40, 40); // 创建第一个表格:图片之前的内容 PdfPTable table1 = new PdfPTable(10); table1.setWidthPercentage(100); table1.setSpacingBefore(10f); table1.setSpacingAfter(10f); Font titleFont = PdfUtils.setFont(12); // PdfPCell mergedCell = new PdfPCell(new Phrase("陕健医澄合矿务局中心医院", titleFont)); PdfPCell mergedCell = new PdfPCell(new Phrase(HOSP_NAME, titleFont)); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setColspan(10); mergedCell.setHorizontalAlignment(Element.ALIGN_CENTER); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase(" ")); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setColspan(10); mergedCell.setFixedHeight(1f); table1.addCell(mergedCell); titleFont = PdfUtils.setFont(15); mergedCell = new PdfPCell(new Phrase("检查报告单", titleFont)); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setColspan(10); mergedCell.setHorizontalAlignment(Element.ALIGN_CENTER); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase(" ")); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setColspan(10); table1.addCell(mergedCell); titleFont = PdfUtils.setFont(10); PdfPCell textFieldCell = new PdfPCell(); mergedCell = new PdfPCell(new Phrase("姓 名:", titleFont)); mergedCell.setBorder(Rectangle.TOP); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase(xm, titleFont)); mergedCell.setBorder(Rectangle.TOP); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase("性 别:", titleFont)); mergedCell.setBorder(Rectangle.TOP); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase(xb, titleFont)); mergedCell.setBorder(Rectangle.TOP); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase("年 龄:", titleFont)); mergedCell.setBorder(Rectangle.TOP); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase(nl, titleFont)); mergedCell.setBorder(Rectangle.TOP); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase("检查科室:", titleFont)); mergedCell.setBorder(Rectangle.TOP); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase(jcks, titleFont)); mergedCell.setBorder(Rectangle.TOP); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(3); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase("住 院 号:", titleFont)); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase(zyh, titleFont)); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase("床 号:", titleFont)); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase(ch, titleFont)); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase("送检科室:", titleFont)); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase(sjks, titleFont)); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(2); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase("检查设备:", titleFont)); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase(jcsb, titleFont)); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(2); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase("检查号:", titleFont)); mergedCell.setBorder(Rectangle.BOTTOM); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase(jch, titleFont)); mergedCell.setBorder(Rectangle.BOTTOM); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(2); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase("检查项目:", titleFont)); mergedCell.setBorder(Rectangle.BOTTOM); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(1); table1.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase(jcxm, titleFont)); mergedCell.setBorder(Rectangle.BOTTOM); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setColspan(6); table1.addCell(mergedCell); // 创建第二个表格:显示图片部分 PdfPTable table2 = new PdfPTable(10); float[] columnWidths = {0.8f, 0.8f, 0.8f, 0.8f, 0.1f, 0.1f, 0.8f, 0.8f, 0.8f, 0.8f}; table2.setWidths(columnWidths); if (files != null) { int imageIndex = 0; while (imageIndex < files.length) { // 第一张图片占位符 if (imageIndex < files.length) { PdfPCell imageCell = createImageCell(files[imageIndex].getPath()); imageCell.setColspan(4); table2.addCell(imageCell); imageIndex++; } // 调整这个单元格占用的宽度 不影响其他行 PdfPCell middleBlankCell = new PdfPCell(new Phrase("")); middleBlankCell.setColspan(2); middleBlankCell.setBorder(Rectangle.NO_BORDER); table2.addCell(middleBlankCell); // 第二张图片占位符 if (imageIndex < files.length) { PdfPCell imageCell = createImageCell(files[imageIndex].getPath()); imageCell.setColspan(4); table2.addCell(imageCell); imageIndex++; } // 完成当前行 table2.completeRow(); } } // 创建第三个表格:图片之后的内容 PdfPTable table3 = new PdfPTable(10); table3.setWidthPercentage(100); table3.setSpacingBefore(10f); table3.setSpacingAfter(10f); mergedCell = new PdfPCell(new Phrase("描述:", titleFont)); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setBorder(Rectangle.NO_BORDER); table3.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase("")); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setColspan(9); table3.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase("", titleFont)); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setBorder(Rectangle.NO_BORDER); table3.addCell(mergedCell); Phrase phrase = new Phrase(ms, titleFont); PdfPCell textCell = new PdfPCell(phrase); textCell.setHorizontalAlignment(Element.ALIGN_LEFT); textCell.setBorder(Rectangle.NO_BORDER); textCell.setColspan(10); table3.addCell(textCell); mergedCell = new PdfPCell(new Phrase("提示:", titleFont)); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setBorder(Rectangle.NO_BORDER); table3.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase("")); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setColspan(9); table3.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase("", titleFont)); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setBorder(Rectangle.NO_BORDER); table3.addCell(mergedCell); mergedCell = new PdfPCell(new Phrase(ts, titleFont)); mergedCell.setHorizontalAlignment(Element.ALIGN_LEFT); mergedCell.setBorder(Rectangle.NO_BORDER); mergedCell.setColspan(9); table3.addCell(mergedCell); // 添加表格到文档 document.add(table1); document.add(table2); // 在添加表格前,检查当前页是否有足够空间,如果没有则添加新页。 if (writer.getVerticalPosition(true) - table3.getTotalHeight() < document.bottomMargin()) { document.newPage(); } document.add(table3); document.close(); writer.close(); return baos; } catch (DocumentException | IOException e) { e.printStackTrace(); return null; } } private static PdfPCell createImageCell(String path) throws IOException, BadElementException { Image image = Image.getInstance(path); image.scaleToFit(150, 150); PdfPCell cell = new PdfPCell(image); cell.setBorder(Rectangle.NO_BORDER); cell.setHorizontalAlignment(Element.ALIGN_CENTER); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); // cell.setPadding(5); return cell; } static class Footer extends PdfPageEventHelper { private String footerText; private Font footerFont = PdfUtils.setFont(10); private Paragraph paragraph; public Footer(String footerText) { this.footerText = footerText; } public Footer(Paragraph paragraph) { this.paragraph = paragraph; } @Override public void onEndPage(PdfWriter writer, Document document) { PdfPTable footer = new PdfPTable(1); footer.setTotalWidth(523); footer.setWidthPercentage(100); footer.getDefaultCell().setBorder(Rectangle.NO_BORDER); footer.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); if (footerText != null) footer.addCell(new Phrase(footerText, footerFont)); if (paragraph != null) footer.addCell(paragraph); footer.writeSelectedRows(0, -1, 36, 50, writer.getDirectContent()); } } // 自定义页脚和页眉的绘制 class FooterHeaderPageEvent extends PdfPageEventHelper { private String name; // 页眉的名字 private String tjName; private String tjNumber; private String sex; private String age; private Integer page; public FooterHeaderPageEvent(String name, String tjName, String tjNumber, String sex, String age, Integer page) { this.name = name; this.tjNumber = tjNumber; this.tjName = tjName; this.sex = sex; this.age = age; this.page = page; } // 在每一页的顶部绘制页眉 @Override public void onStartPage(PdfWriter writer, Document document) { // 获取页面宽度和高度 float width = document.getPageSize().getWidth(); float margin = document.leftMargin(); // 创建页眉表格:2行,第一行包含姓名、性别、年龄和体检号,第二行是分割线 PdfPTable headerTable = new PdfPTable(2); // 2列:第一列为姓名、性别、年龄,第二列为体检号 headerTable.setWidthPercentage(100); // 设置宽度为100% headerTable.setSpacingAfter(10); // 页眉与内容之间的间距 // 设置列宽度 float[] columnWidths = {0.6f, 0.4f}; // 第一列占 60%,第二列占 40% try { headerTable.setWidths(columnWidths); } catch (DocumentException e) { e.printStackTrace(); } // 第一行:姓名、性别、年龄以及体检号 PdfPCell infoCell = new PdfPCell(new Phrase("姓名:" + tjName + " 性别:" + sex + " 年龄:" + age, PdfUtils.setFont(8))); infoCell.setBorder(Rectangle.NO_BORDER); infoCell.setHorizontalAlignment(Element.ALIGN_LEFT); // 第一列左对齐 infoCell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 垂直居中 headerTable.addCell(infoCell); PdfPCell idCell = new PdfPCell(new Phrase("体检号:" + tjNumber, PdfUtils.setFont(8))); idCell.setBorder(Rectangle.NO_BORDER); idCell.setHorizontalAlignment(Element.ALIGN_RIGHT); // 第二列右对齐 idCell.setVerticalAlignment(Element.ALIGN_MIDDLE); // 垂直居中 headerTable.addCell(idCell); // 第二行:淡灰色分割线 PdfPCell separatorCell = new PdfPCell(); separatorCell.setBorder(Rectangle.TOP); // 设置上边框 separatorCell.setBorderColor(BaseColor.LIGHT_GRAY); // 设置为淡灰色 separatorCell.setBorderWidthTop(0.5f); // 设置上边框的宽度 separatorCell.setColspan(2); // 合并两列 headerTable.addCell(separatorCell); // 将页眉表格添加到文档 try { document.add(headerTable); } catch (DocumentException e) { e.printStackTrace(); } } // 在每一页的底部绘制页脚 @SneakyThrows @Override public void onEndPage(PdfWriter writer, Document document) { // 获取页面宽度和高度 float width = document.getPageSize().getWidth(); float height = document.getPageSize().getHeight(); float margin = document.leftMargin(); // 页脚距离底部的位置,确保其位于页面底部 增加是上移 减少是下移 float footerPositionY = document.bottomMargin(); // 页脚表格:2行2列,第一行医院名和页码,第二行祝福语 PdfPTable footerTable = new PdfPTable(2); // 2列,第一列医院名,第二列页码 footerTable.setWidthPercentage(100); // 设置宽度为100%,使其水平居中 footerTable.setTotalWidth(width - margin * 2 + 10); // 设置总宽度,避免与页边距重叠 footerTable.setSpacingBefore(0); // 去除表格顶部的间距 footerTable.setSpacingAfter(0); // 去除表格底部的间距 footerTable.getDefaultCell().setBorder(Rectangle.NO_BORDER); // 去除所有单元格的边框 float[] columnWidths = {2.5f, 2f}; // 第一列占 1,第二列占 2 footerTable.setWidths(columnWidths); // 设置列宽比例 // 第一行:医院名和页码 PdfPCell hospitalNameCell = new PdfPCell(new Phrase(name, PdfUtils.setFont(8))); hospitalNameCell.setHorizontalAlignment(Element.ALIGN_RIGHT); // 水平居中 hospitalNameCell.setVerticalAlignment(Element.ALIGN_TOP); // 垂直对齐到底部 hospitalNameCell.setMinimumHeight(12f); // 设置最小高度,避免高度过大 hospitalNameCell.setBorder(Rectangle.TOP); // 设置上边框 hospitalNameCell.setBorderColor(BaseColor.LIGHT_GRAY); // 设置上边框为淡灰色 hospitalNameCell.setBorderWidthTop(0.5f); // 设置上边框宽度 footerTable.addCell(hospitalNameCell); // 创建页码的单元格:右对齐 String pageText; // if (page != null) pageText = "第 " + writer.getPageNumber() + 1 + " 页,共 " + page + " 页"; // 页码 // else pageText = "第 " + (writer.getPageNumber() + 1) + " 页"; // 页码 // if (page == null) { // pageText = "第 " + (writer.getPageNumber() + 1) + " 页"; // 页码 // } else { // pageText = "第 " + (page + 1) + " 页"; // 页码 // } pageText = "第 " + (++pdfPage) + " 页"; PdfPCell pageCell = new PdfPCell(new Phrase(pageText, PdfUtils.setFont(8))); pageCell.setHorizontalAlignment(Element.ALIGN_RIGHT); // 右对齐 pageCell.setVerticalAlignment(Element.ALIGN_TOP); // 垂直对齐到底部 pageCell.setMinimumHeight(12f); // 设置最小高度,避免高度过大 pageCell.setBorder(Rectangle.TOP); // 设置上边框 pageCell.setBorderColor(BaseColor.LIGHT_GRAY); // 设置上边框为淡灰色 pageCell.setBorderWidthTop(0.5f); // 设置上边框宽度 footerTable.addCell(pageCell); // 第二行:祝福语,合并两列 PdfPCell footerTextCell = new PdfPCell(new Phrase("本体检报告仅供临床参考,不作为临床依据,祝您身体健康!!!", PdfUtils.setFont(8))); footerTextCell.setColspan(2); // 合并两列 footerTextCell.setHorizontalAlignment(Element.ALIGN_CENTER); // 居中 footerTextCell.setVerticalAlignment(Element.ALIGN_TOP); // 垂直对齐到底部 footerTextCell.setMinimumHeight(14f); // 设置最小高度,避免高度过大 footerTextCell.setBorder(Rectangle.NO_BORDER); // 去除所有边框 footerTable.addCell(footerTextCell); // 页脚表格的位置:将表格写入页脚,Y 坐标需要设置为距离页面底部指定的位置 footerTable.writeSelectedRows(0, -1, margin, footerPositionY, writer.getDirectContent()); } } }