package com.ltkj.web.controller.his; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.itextpdf.text.*; 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.SysUser; import com.ltkj.common.utils.DateUtils; import com.ltkj.framework.config.MatchUtils; import com.ltkj.hosp.domain.*; import com.ltkj.hosp.mapper.DictUserInfoMapper; 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.system.service.ISysConfigService; import com.ltkj.system.service.ISysUserService; import com.ltkj.web.config.pdfutils.PdfUtils; 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.io.*; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigDecimal; import java.util.*; import java.util.List; /** * 检查 检验报告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; 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 { HashMap pdfChangGui = makePDFInfo(tjOrder, customer, tjReportTemplate); 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; try { pdfWriter = PdfWriter.getInstance(document1, byteArrayOutputStream1); } catch (DocumentException e) { e.printStackTrace(); return AjaxResult.error(); } document1.setMargins(70, 70, 40, 40); document1.open(); // 非化验项目报告 Map> printReport = new HashMap<>(); notHuaYanData(tjOrder.getTjNumber(), printReport, tjOrder, customer); try { notHuaYanTable(document1, printReport); } catch (DocumentException e) { log.error("非化验项目填充表格异常"); e.printStackTrace(); return AjaxResult.error(); } // 组装检验数据 HashMap map = makeHisJianYan(tjOrder, customer); makeHisJianYanTable(document1, map); List jianchas = makeHisJianChaTable(tjOrder); // List jianchas = makeCcgcHisJianChaTable(tjOrder); document1.close(); pdfWriter.close(); PdfReader reader = null; try { 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); } 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(); } reader.close(); byteArrayOutputStream1.close(); document.close(); copy.close(); } catch (IOException e) { log.error("拷贝pdf异常"); e.printStackTrace(); return AjaxResult.error(); } 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); 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) { e.printStackTrace(); return AjaxResult.error(); } 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(9); 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 { // 文件配置 // String outputPath1 = "/Users/chacca/开发相关/代码/"; String outputPath1 = value + "\\"; 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(); } /** * 填充检验表格数据 * * @param document1 * @param map * @throws DocumentException */ private void makeHisJianYanTable(Document document1, HashMap map) throws DocumentException { if (!map.isEmpty()) { String[] titles = new String[]{"体检项目", "体检结果", "单位", "参考范围"}; float[] titlesWidth = new float[]{120, 120, 120, 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"); addJianYanTable(document1, titleName, titles, titlesWidth, lists); if (!jyys.isEmpty()) { Font doctorFonts = PdfUtils.setFont(9); 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("审核医师:",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, "审核医师:" + substring); df.setAlignment(Element.ALIGN_RIGHT); document1.add(df); } else { elements.add(phrase); document1.add(elements); } } //分割线 LineSeparator objectName = new LineSeparator(); objectName.setOffset(-5); document1.add(objectName); } } } /** * 非化验项目表格填充 * * @param document1 * @param printReport * @throws DocumentException */ private void notHuaYanTable(Document document1, Map> printReport) throws DocumentException { for (Map.Entry> entry : printReport.entrySet()) { LambdaQueryWrapper wqqq = new LambdaQueryWrapper<>(); wqqq.eq(TjProject::getProId, entry.getKey().getProId()); TjProject one11 = projectService.getOne(wqqq); //判断该项目是否需要打印报告 if (null != one11 && "Y".equals(one11.getNeedReport())) { List value = entry.getValue(); String titleName = null; if (null != one11 && "1".equals(one11.getResultType())) { titleName = one11.getProName(); // 设置标题字体样式 Font titleFonts = PdfUtils.setFont(9); Paragraph paragraph = PdfUtils.setParagraph(titleFonts, titleName); String[] titles = {"体检项目", "体检结果", "单位"}; // 获取列表数据 //设置表头字体样式 Font headFont = PdfUtils.setFont(9); // 设置正文字体样式:12号 Font textFont = PdfUtils.setFont(9); //创建表格 将表头字体和正文字体放进去 PdfPTable table = PdfUtils.setTable2(headFont, textFont, titles, value); document1.add(paragraph); document1.add(table); //判断备注是否为空 空不能显示null if (entry.getKey().getRemark() == null) { entry.getKey().setRemark(""); } 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(9); 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(9); Paragraph pp = PdfUtils.setParagraph(remarkFonts, substring); document1.add(pp); } } else { Font remarkFonts = PdfUtils.setFont(9); Paragraph pp = PdfUtils.setParagraph(remarkFonts, remark); document1.add(pp); } //判断主检医师是否为空 空不能显示null zhuJianYiShi(document1, entry); //分割线 LineSeparator objectName = new LineSeparator(); document1.add(objectName); } else { if (null != one11) { titleName = one11.getProName(); } else { titleName = entry.getKey().getProName(); } // 设置标题字体样式 Font titleFonts = PdfUtils.setFont(9); Paragraph paragraph = PdfUtils.setParagraph(titleFonts, titleName); String[] titles = {"体检项目", "体检结果", "单位"}; // 获取列表数据 //设置表头字体样式 Font headFont = PdfUtils.setFont(9); // 设置正文字体样式:12号 Font textFont = PdfUtils.setFont(9); //创建表格 将表头字体和正文字体放进去 PdfPTable table = PdfUtils.setTable(headFont, textFont, titles, value); document1.add(paragraph); document1.add(table); //判断备注是否为空 空不能显示null if (entry.getKey().getRemark() == null) { entry.getKey().setRemark(""); } 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(9); 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(9); Paragraph pp = PdfUtils.setParagraph(remarkFonts, substring); document1.add(pp); } } else { Font remarkFonts = PdfUtils.setFont(9); Paragraph pp = PdfUtils.setParagraph(remarkFonts, remark); document1.add(pp); } //判断主检医师是否为空 空不能显示null zhuJianYiShi(document1, entry); //分割线 LineSeparator objectName = new LineSeparator(); document1.add(objectName); } } } } /** * 主见医师行显示设置 * @param document1 * @param entry * @throws DocumentException */ private void zhuJianYiShi(Document document1, Map.Entry> entry) throws DocumentException { if (null != entry.getKey().getDoctorName() && null != userService.getById(entry.getKey().getDoctorName())) { //主检医师 String key = sysConfigService.selectConfigByKey("is_report_pdf_use_ysqm"); SysUser sysUser = userService.getById(entry.getKey().getDoctorName()); 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(); 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 = "主检医师:" + sysUser.getNickName(); Paragraph df = PdfUtils.setParagraph(doctorFonts, doctorName); df.setAlignment(Element.ALIGN_RIGHT); document1.add(df); } }else { String doctorName = "主检医师:" + sysUser.getNickName(); Paragraph df = PdfUtils.setParagraph(doctorFonts, doctorName); df.setAlignment(Element.ALIGN_RIGHT); document1.add(df); } }else { String doctorName = "主检医师:" + sysUser.getNickName(); Paragraph df = PdfUtils.setParagraph(doctorFonts, doctorName); df.setAlignment(Element.ALIGN_RIGHT); document1.add(df); } } else { String doctorName = "主检医师:" + "无"; 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); // List list = ltkjHysqdService.list(); HashMap data = new HashMap<>(); for (LtkjHysqd hysqd : list) { LambdaQueryWrapper ltkjHybgdLambdaQueryWrapper = new LambdaQueryWrapper<>(); ltkjHybgdLambdaQueryWrapper.eq(LtkjHybgd::getTmh, hysqd.getTmh()); List hybgds = ltkjHybgdService.list(ltkjHybgdLambdaQueryWrapper); // 大类项目名称 String xmmc = hysqd.getXmmc(); ArrayList> lists = new ArrayList<>(); HashSet hashSet = new HashSet<>(); for (LtkjHybgd hybgd : hybgds) { // 检查项目 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; 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 + " ↓"; } else if (jyjgval.compareTo(max) > 0) { // jyjg 大于范围最大值,添加上箭头 jyjg = jyjg + " ↑"; } } 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(jgdw); strings.add(fwz); lists.add(strings); } if (!lists.isEmpty()) { HashMap map = new HashMap<>(); map.put("data", lists); map.put("jyys", hashSet); data.put(xmmc, map); } } return data; } /** * 生成PDF模版以及用户信息部分 * * @param tjOrder * @param reportTemplate */ public HashMap makePDFInfo(TjOrder tjOrder, TjCustomer tjCustomer, TjReportTemplate reportTemplate) { 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(); 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 (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"); } //异常项目 data.put("yichang", str.toString()); // 遍历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); return map; } catch (IOException | DocumentException e) { e.printStackTrace(); return null; } } /** * 组合非化验项目报告数据 * * @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()); 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())) { 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("/"); } 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) 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 (List list : lists) { for (String s : list) { PdfPCell nameCell = new PdfPCell(); nameCell.setVerticalAlignment(Element.ALIGN_MIDDLE); nameCell.setHorizontalAlignment(Element.ALIGN_LEFT); nameCell.setPhrase(new Paragraph(s, textFont)); nameCell.setBorder(Rectangle.NO_BORDER); // 移除单元格边框 table.addCell(nameCell); } } 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)); 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()); } } }