赵文轩
2024-06-17 e854cddbd400f9304f233fd2f23894bf636e7e89
打印pdf报告工具类
1个文件已添加
784 ■■■■■ 已修改文件
ltkj-admin/src/main/java/com/ltkj/web/controller/his/HisPDFUtil.java 784 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/his/HisPDFUtil.java
New file
@@ -0,0 +1,784 @@
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.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
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.SysDictData;
import com.ltkj.common.utils.DateUtils;
import com.ltkj.framework.config.MatchUtils;
import com.ltkj.hosp.domain.*;
import com.ltkj.hosp.service.ITjCustomerService;
import com.ltkj.hosp.service.ITjOrderService;
import com.ltkj.hosp.service.ITjReportService;
import com.ltkj.hosp.service.ITjReportTemplateService;
import com.ltkj.mall.mallOrderUtils.TjConstants;
import com.ltkj.system.service.ISysDictDataService;
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 java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.List;
import static com.ltkj.web.config.pdfutils.PDFBinaryUtil.getPDFBinary;
/**
 * 检查 检验报告pdf生成
 */
@Slf4j
@Component
public class HisPDFUtil {
    @Autowired
    private HisApiGetMethodService apiGetMethodService;
    @Autowired
    private ITjOrderService tjOrderService;
    @Autowired
    private ITjCustomerService tjCustomerService;
    @Autowired
    private ITjReportService tjReportService;
    @Value("${path.filePath}")
    private String value;
    @Value("${path.reportServer}")
    private String urlValue;
    public AjaxResult execHisRequest(HashMap<String, Object> pdfInfoMap, Map<String, Object> params,TjOrder tjOrder,TjReportTemplate tjReportTemplate) {
        List<Map<String, Object>> list;
        String hisRegistrationId = params.get("his_registration_id").toString();
        AjaxResult getlabreportinfo = apiGetMethodService.getHISDataNew("Getlabreportinfo", params);
        list = makePDFInfo(pdfInfoMap, getlabreportinfo, "获取检验报告记录信息");
        JSONArray jsonArray = JSONUtil.createArray();
        if (list != null) {
            params.clear();
            for (Map<String, Object> stringObjectMap : list) {
                if (stringObjectMap == null)
                    continue;
                JSONObject obj = JSONUtil.createObj();
                obj.putOpt("报告记录", stringObjectMap);
                String jybgid = stringObjectMap.get("JYBGID").toString();
                params.put("jybgid", jybgid);
                // 获取检验结果记录信息
                AjaxResult getlabdetailinfo = apiGetMethodService.getHISDataNew("Getlabdetailinfo", params);
                putData(obj, getlabdetailinfo, "检验结果记录");
                // 获取微生物报告记录信息
                AjaxResult getlabgermrepinfo = apiGetMethodService.getHISDataNew("Getlabgermrepinfo", params);
                putData(obj, getlabgermrepinfo, "微生物报告记录");
                // 获取微生物药敏信息
                AjaxResult getlabgermdetailinfo = apiGetMethodService.getHISDataNew("Getlabgermdetailinfo", params);
                putData(obj, getlabgermdetailinfo, "微生物药敏信息");
                // 获取危急值信息
                AjaxResult getlaburgentinfo = apiGetMethodService.getHISDataNew("Getlaburgentinfo", params);
                putData(obj, getlaburgentinfo, "危机值信息");
                jsonArray.put(obj);
            }
            // 获取检查报告信息
            params.clear();
            params.put("his_registration_id", hisRegistrationId);
            params.put("ksmc", "");
            params.put("pationid", "");
            params.put("ksrq", "");
            params.put("jsrq", "");
            params.put("pagecount", 100);
            params.put("page", 1);
            params.put("status", "");
            AjaxResult getexamreportinfo = apiGetMethodService.getHISDataNew("Getexamreportinfo", params);
            JSONObject object = JSONUtil.parseObj(getexamreportinfo.get("result"));
            JSONObject response = JSONUtil.parseObj(object.get("Response"));
            if (!response.getStr("ResultCode").equals("0")) {
                if (!response.getStr("ResultContent").contains("查询失败"))
                    return AjaxResult.error("生成超时,请重试");
            }
            JSONObject obj = JSONUtil.createObj();
            putData(obj, getexamreportinfo, "检查报告");
            jsonArray.put(obj);
            System.out.println(JSONUtil.toJsonStr(jsonArray));
            if (makePDF(hisRegistrationId, jsonArray,tjOrder,tjReportTemplate))
                return AjaxResult.success("已生成报告!可直接点击预览!");
            else return AjaxResult.error();
        } else {
            return AjaxResult.error("未获取到检验报告记录信息");
        }
    }
    private List<Map<String, Object>> makePDFInfo(HashMap<String, Object> map, AjaxResult ajaxResult, String key) {
        List<Map<String, Object>> data = null;
        if (Integer.parseInt(ajaxResult.get("code").toString()) == 200) {
            data = (List<Map<String, Object>>) ajaxResult.get("data");
            List<Map<String, Object>> parent = (List<Map<String, Object>>) 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<Map<String, Object>> data = (List<Map<String, Object>>) result.get("data");
            jsonObject.putOpt(key, data);
        }
    }
    public Boolean makePDF(String cardId, JSONArray jsonArray,TjOrder tjOrder,TjReportTemplate reportTemplate) {
        String tjNumber = tjOrder.getTjNumber();
        String template = reportTemplate.getTemplate();
        LambdaQueryWrapper<TjCustomer> wq1 = new LambdaQueryWrapper<>();
        wq1.eq(TjCustomer::getCusId, tjOrder.getUserId());
        TjCustomer tjCustomer = tjCustomerService.getOne(wq1);
        Long userId = tjCustomer.getCusId();
        // 生成pdf
        try {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            PdfReader reader = new PdfReader(new ByteArrayInputStream(Base64.getDecoder().decode(template)));
            PdfStamper 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<String, Object> data = new HashMap<>();
            // 设置用户信息
            setUserInfo(tjNumber, tjOrder, tjCustomer, data);
            //异常项目
            // 遍历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();
            ByteArrayOutputStream byteArrayOutputStream1 = new ByteArrayOutputStream();
            Document document1 = new Document(PageSize.A4);
            PdfWriter pdfWriter = PdfWriter.getInstance(document1, byteArrayOutputStream1);
            document1.setMargins(70, 70, 40, 40);
            document1.open();
            List<ByteArrayOutputStream> jianchas = new ArrayList<>();
            for (Object o : jsonArray) {
                JSONObject jsonObject = (JSONObject) o;
                // 检验报告以及结果信息
                JSONObject reportInfo = jsonObject.getJSONObject("报告记录");
                String titleName = "";
                if (reportInfo != null) {
                    titleName = reportInfo.getStr("JYXMMC").trim();
                }
                JSONArray reportDetails = jsonObject.getJSONArray("检验结果记录");
                ArrayList<TjPdfVO> list = new ArrayList<>();
                String[] titles = null;
                float[] titlesWidth = null;
                // 结果信息
                if (reportDetails != null && reportDetails.size() > 0) {
                    for (Object reportDetail : reportDetails) {
                        JSONObject detail = (JSONObject) reportDetail;
                        TjPdfVO tjPdfVO = new TjPdfVO();
                        tjPdfVO.setProName(detail.getStr("JCZBMC"));
                        tjPdfVO.setProResult(detail.getStr("JCZBJG"));
                        tjPdfVO.setVal1(detail.getStr("JLDW"));
                        tjPdfVO.setVal2(detail.getStr("CKZFW"));
                        list.add(tjPdfVO);
                    }
                    titles = new String[]{"体检项目", "体检结果", "单位", "参考范围"};
                    titlesWidth = new float[]{120, 120, 120, 120};
                    addTable(document1, titleName, titles, titlesWidth, list);
                    // 主检医师
                    String bgysqm = reportInfo.getStr("BGYSQM");
                    String doctorName = "主检医师:" + bgysqm;
                    Font doctorFonts = PdfUtils.setFont(9);
                    Paragraph df = PdfUtils.setParagraph(doctorFonts, doctorName);
                    df.setAlignment(Element.ALIGN_RIGHT);
                    document1.add(df);
                    //分割线
                    LineSeparator objectName = new LineSeparator();
                    document1.add(objectName);
                }
                // 微生物报告记录信息
                JSONArray labgermrepInfos = jsonObject.getJSONArray("微生物报告记录");
                if (labgermrepInfos != null && labgermrepInfos.size() > 0) {
                    list = new ArrayList<>();
                    for (Object info : labgermrepInfos) {
                        JSONObject object = (JSONObject) info;
                        TjPdfVO tjPdfVO = new TjPdfVO();
                        tjPdfVO.setProName(object.getStr("XJMC"));
                        tjPdfVO.setProResult(object.getStr("JCJG"));
                        list.add(tjPdfVO);
                    }
                    titles = new String[]{"体检项目", "体检结果"};
                    titlesWidth = new float[]{120, 120};
                    addTable(document1, titleName, titles, titlesWidth, list);
                    //分割线
                    LineSeparator objectName = new LineSeparator();
                    document1.add(objectName);
                }
                // 微生物药敏信息
                JSONArray labgermdetailinfos = jsonObject.getJSONArray("微生物药敏信息");
                if (labgermdetailinfos != null && labgermdetailinfos.size() > 0) {
                    list = new ArrayList<>();
                    for (Object info : labgermdetailinfos) {
                        JSONObject object = (JSONObject) info;
                        TjPdfVO tjPdfVO = new TjPdfVO();
                        tjPdfVO.setProName(object.getStr("YMMC"));
                        tjPdfVO.setProResult(object.getStr("JCJG"));
                        tjPdfVO.setVal1(object.getStr("ZPHYL"));
                        tjPdfVO.setVal2(object.getStr("YJND"));
                        tjPdfVO.setVal3(object.getStr("YJHZJ"));
                        list.add(tjPdfVO);
                    }
                    titles = new String[]{"药敏名称", "检查结果", "纸片含药量", "抑菌浓度", "抑菌环直径"};
                    titlesWidth = new float[]{90, 90, 90, 90, 90};
                    addTable(document1, titleName, titles, titlesWidth, list);
                    //分割线
                    LineSeparator objectName = new LineSeparator();
                    document1.add(objectName);
                }
                // 危急值信息
                JSONArray laburgentinfos = jsonObject.getJSONArray("危机值信息");
                if (laburgentinfos != null && laburgentinfos.size() > 0) {
                    list = new ArrayList<>();
                    for (Object info : laburgentinfos) {
                        JSONObject object = (JSONObject) info;
                        TjPdfVO tjPdfVO = new TjPdfVO();
                        tjPdfVO.setProName(object.getStr("zbmc"));
                        tjPdfVO.setProResult(object.getStr("jg"));
                        tjPdfVO.setVal1(object.getStr("clfs"));
                        tjPdfVO.setVal2(object.getStr("bgcljg"));
                        list.add(tjPdfVO);
                    }
                    titles = new String[]{"指标名称", "危急值结果", "处理方式", "处理意见"};
                    titlesWidth = new float[]{120, 120, 120, 120};
                    addTable(document1, titleName, titles, titlesWidth, list);
                    //分割线
                    LineSeparator objectName = new LineSeparator();
                    document1.add(objectName);
                }
                JSONArray object = jsonObject.getJSONArray("检查报告");
                if (object != null && object.size() > 0) {
                    for (Object info : object) {
                        JSONObject obj = (JSONObject) info;
                        String xm = obj.getStr("HZXM");
                        String xb = obj.getStr("HZXB").equals("2") ? "女" : "男";
                        String nl = obj.getStr("HZNL");
                        if (StrUtil.isNotBlank(nl) && nl.contains(".")) {
                            String[] split = nl.split("\\.");
                            nl = split[0];
                        }
                        String jcks = obj.getStr("JCKSMC");
                        String zyh = "";
                        String sqks = obj.getStr("SQKSMC");
                        String sjks = obj.getStr("ZDJGMC");
                        String jcsb = obj.getStr("SBBM");
                        String jch = obj.getStr("JCH");
                        String jcxm = obj.getStr("JCXMMC");
                        String ms = obj.getStr("YXBX");
                        String ts = obj.getStr("YXZD");
                        String ch = obj.getStr("BZBCH");
                        // 报告医师签名
                        String bgysqm = obj.getStr("BGYSQM");
                        // 审核医师签名
                        String shysqm = obj.getStr("SHYSQM");
                        // 申请人
                        String sqrxm = obj.getStr("SQRXM");
                        String footer = "申请人:"+sqrxm + "     审核医师:"+shysqm+"     "+bgysqm;
                        ByteArrayOutputStream outputStream = makeJcPDFByteArrayStream(xm, xb, nl, jcks, zyh, ch, sjks, jcsb, jch, jcxm, ms, ts, null,footer);
                        jianchas.add(outputStream);
                    }
                }
            }
            document1.close();
            pdfWriter.close();
            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();
            }
            byteArrayOutputStream1.close();
            document.close();
            copy.close();
            reader.close();
//            String outputPath1 = "/Users/chacca/开发相关/代码/";
            String outputPath1 = value+"\\";
            String outputFileName1 = userId + tjNumber + tjCustomer.getCusName() + "_报告.pdf";
            File file = new File(outputPath1 + outputFileName1);
            BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
            outputStream.write(finalOutPut.toByteArray());
            outputStream.flush();
            outputStream.close();
            finalOutPut.close();
            reader.close();
            // 保存数据
            TjReport tjReport = new TjReport();
            tjReport.setTjNumber(String.valueOf(tjNumber));
            tjReport.setPath(urlValue + outputFileName1);
            String pdfBinary = getPDFBinary(outputPath1 + outputFileName1);
            tjReport.setReport(pdfBinary);
            tjReport.setType("体检报告");
            tjReport.setPrint("pdf");
            tjReportService.save(tjReport);
            //修改order表中的打印报告时间为当前时间
            LambdaUpdateWrapper<TjOrder> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.eq(TjOrder::getTjNumber, tjNumber);
            updateWrapper.set(TjOrder::getReportTime, new Date());
            updateWrapper.set(TjOrder::getPrintLastTime, new Date());
            updateWrapper.set(TjOrder::getDownloadLastTime, new Date());
            updateWrapper.set(TjOrder::getStatus, TjConstants.TJ_END);
            tjOrderService.update(updateWrapper);
        } catch (IOException | DocumentException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    /**
     * 设置用户信息
     *
     * @param tjNumber
     * @param tjOrder
     * @param tjCustomer
     * @param data
     */
    private void setUserInfo(String tjNumber, TjOrder tjOrder, TjCustomer tjCustomer, Map<String, Object> 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);
    }
    private static void addTable(Document document, String titleName, String[] titles, float[] titlesWidth, ArrayList<TjPdfVO> 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); // 锁定表格宽度
        for (String title : titles) {
            PdfPCell cell = new PdfPCell(new Paragraph(title, headFont));
            cell.setBorder(Rectangle.NO_BORDER); // 移除单元格边框
            table.addCell(cell);
        }
        for (TjPdfVO item : list) {
            Class<? extends TjPdfVO> aClass = item.getClass();
            Field[] fields = aClass.getDeclaredFields();
            ArrayList<String> 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(elements);
                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) {
        try {
            Document document = new Document(PageSize.A4);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PdfWriter writer = PdfWriter.getInstance(document, baos);
            writer.setPageEvent(new Footer(footer));
            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);
        public Footer(String footerText) {
            this.footerText = footerText;
        }
        @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);
            footer.addCell(new Phrase(footerText, footerFont));
            footer.writeSelectedRows(0, -1, 36, 36, writer.getDirectContent());
        }
    }
}