zhaowenxuan
2024-05-24 e763f8274af31b5240776d699d7d6077bf9a320e
导检单生产工具类
1个文件已添加
275 ■■■■■ 已修改文件
ltkj-common/src/main/java/com/ltkj/common/utils/PDFDocumentUtil.java 275 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-common/src/main/java/com/ltkj/common/utils/PDFDocumentUtil.java
New file
@@ -0,0 +1,275 @@
package com.ltkj.common.utils;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @Company: 西安路泰科技有限公司
 * @Author: zhaowenxuan
 * @Date: 2024/5/24 13:41
 */
public class PDFDocumentUtil {
    /**
     * 创建document文档对象
     *
     * @return
     * @throws IOException
     * @throws DocumentException
     */
    public static Map<String ,Object> getDocument() throws IOException, DocumentException {
        // 创建一个Document对象,并指定A4大小的页面和边距
        Document document = new Document(PageSize.A4, 30, 30, 30, 30);
        // 本地测试文件
//        String PDF_FILE = "d:\\Users\\w\\Desktop\\test.pdf";
//        PdfWriter.getInstance(document, Files.newOutputStream(Paths.get(PDF_FILE)));
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        PdfWriter.getInstance(document,outputStream);
        document.open();
        HashMap<String, Object> map = new HashMap<>();
        map.put("document",document);
        map.put("stream",outputStream);
//        map.put("stream",null);
        return map;
    }
    public static Font getFont() throws DocumentException, IOException {
        return new Font(BaseFont.createFont("C:\\Windows\\Fonts\\simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED));
    }
    /**
     * 导检单
     * 创建第一个表格为用户信息
     *
     * @param document
     * @param name
     * @param sex
     * @param tjNumber
     * @param phone
     * @param danwei
     * @param time
     * @throws IOException
     */
    public static void makeUserInfoTable(Document document, String name, String sex
            , String tjNumber, String phone, String danwei
            , String time) throws IOException {
        try {
            // 两个表格固定都是10列
            // 创建基础信息表格
            PdfPTable table1 = new PdfPTable(10);
            table1.setWidthPercentage(100);
            // 设置列宽
            float[] columnWidths = {1.5F, 2, 2, 1, 2, 3, 2, 1, 2, 2};
            table1.setWidths(columnWidths);
            PdfPCell cell;
            Font font;
            for (int i = 0; i < 12; i++) {
                for (int j = 0; j < 10; j++) {
                    if (i == 0 && j == 3) {
                        font = getFont();
                        font.setStyle(Font.BOLD);
                        font.setSize(24);
                        // 标题
                        cell = new PdfPCell(new Phrase("体检导检单", font));
                        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                        cell.setColspan(3);
                        cell.setBorder(Rectangle.NO_BORDER);
                        table1.addCell(cell);
                        // 条形码
                        cell = new PdfPCell(new Phrase(" ", font));
                        cell.setColspan(4);
                        cell.setBorder(Rectangle.NO_BORDER);
                        table1.addCell(cell);
                        break;
                    } else if (i == 1 && j == 5) {
                        // 体检号
                        addKVCell(table1, Font.BOLD, "体检号:", tjNumber, Rectangle.BOTTOM, null, 4, false);
                        break;
                    } else if (i == 2 && j == 0) {
                        addKVCell(table1, Font.BOLD, "姓名:", name, Rectangle.BOTTOM, null, null, false);
                        addKVCell(table1, Font.BOLD, "性别:", sex, Rectangle.BOTTOM, null, null, false);
                        cell = new PdfPCell(new Phrase(" ", getFont()));
                        cell.setBorder(Rectangle.NO_BORDER);
                        table1.addCell(cell);
                        addKVCell(table1, Font.BOLD, "手机号:", phone, Rectangle.BOTTOM, null, 3, false);
                        break;
                    } else if (i == 3 && j == 0) {
                        addKVCell(table1, Font.BOLD, "单位:", danwei, Rectangle.BOTTOM, null, 4, false);
                        addKVCell(table1, Font.BOLD, "登记日期:", time, Rectangle.BOTTOM, null, 3, false);
                        break;
                    } else if (i == 4 && j == 0) {
                        addKVCell(table1, null, "温馨提示:", " ", null, 2, null, true);
                        break;
                    } else if (i == 5 && j == 8) {
                        cell = new PdfPCell(new Phrase("1、采血,腹部彩超检查后方可用餐。", getFont()));
                        cell.setColspan(9);
                        cell.setBorder(Rectangle.NO_BORDER);
                        table1.addCell(cell);
                        break;
                    } else if (i == 6 && j == 1) {
                        cell = new PdfPCell(new Phrase("2、近期若有生育计划及未成年人,不宜进行胸片、双能骨密度等放射检查。", getFont()));
                        cell.setColspan(9);
                        cell.setBorder(Rectangle.NO_BORDER);
                        table1.addCell(cell);
                        break;
                    } else if (i == 7 && j == 1) {
                        cell = new PdfPCell(new Phrase("3、怀孕或可能已受孕的女士,还应避免妇科、放射科及阴式超声检查。", getFont()));
                        cell.setColspan(9);
                        cell.setBorder(Rectangle.NO_BORDER);
                        table1.addCell(cell);
                        break;
                    } else if (i == 8 && j == 1) {
                        cell = new PdfPCell(new Phrase("4、经期女性不宜进行妇科及尿常规检查。", getFont()));
                        cell.setColspan(9);
                        cell.setBorder(Rectangle.NO_BORDER);
                        table1.addCell(cell);
                        break;
                    } else if (i == 9 && j == 1) {
                        cell = new PdfPCell(new Phrase("5、若您在等待检查过程中有疑问,请及时联系导检护士。", getFont()));
                        cell.setColspan(9);
                        cell.setBorder(Rectangle.NO_BORDER);
                        table1.addCell(cell);
                        break;
                    } else if (i == 10 && j == 1) {
                        cell = new PdfPCell(new Phrase("6、体检结束后请将导检单交还至前台。", getFont()));
                        cell.setColspan(9);
                        cell.setBorder(Rectangle.NO_BORDER);
                        table1.addCell(cell);
                        break;
                    }
                    font = getFont();
                    cell = new PdfPCell(new Phrase(" ", font));
                    cell.setBorder(Rectangle.NO_BORDER);
                    table1.addCell(cell);
                }
            }
            for (PdfPCell pdfPCell : table1.getRows().get(0).getCells()) {
                try {
                    pdfPCell.setFixedHeight(50);
                } catch (Exception e) {
                }
            }
            document.add(table1);
        } catch (DocumentException | IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 导检单
     * 设置键值对
     * @param table1
     * @param fontStyle 字体样式
     * @param title     key
     * @param val       val
     * @param valBottom val是否有下划线
     * @param titleCol  key跨列
     * @param valCol    val跨列
     * @param isCenter  是否居中
     * @throws DocumentException
     * @throws IOException
     */
    public static void addKVCell(PdfPTable table1, Integer fontStyle
            , String title, String val, Integer valBottom, Integer titleCol, Integer valCol
            , boolean isCenter) throws DocumentException, IOException {
        PdfPCell cell;
        Font font;
        font = getFont();
        if (fontStyle != null)
            font.setStyle(fontStyle);
        // 文字居右
        cell = new PdfPCell(new Phrase(title, font));
        cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
        if (titleCol != null)
            cell.setColspan(titleCol);
        if (isCenter)
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setBorder(Rectangle.NO_BORDER);
        table1.addCell(cell);
        font = getFont();
        cell = new PdfPCell(new Phrase(val, font));
        if (valBottom != null) {
            cell.setBorder(Rectangle.BOTTOM);
        } else {
            cell.setBorder(Rectangle.NO_BORDER);
        }
        if (valCol != null) {
            cell.setColspan(4);
        }
        table1.addCell(cell);
    }
    /**
     * 设置导检单 主体信息
     * @param
     * @param
     * @throws DocumentException
     * @throws IOException
     */
    public static void makeTjInfo(Document document,List<Map<String ,String>> data) throws DocumentException, IOException {
        PdfPTable table1 = new PdfPTable(7);
        table1.setWidthPercentage(100);
        float[] columnWidths = {1.5f, 3, 3, 6, 1.5f, 3, 3};
        table1.setWidths(columnWidths);
        String[] titleArray = {"序号", "体检科室", "科室位置", "项目", "空腹", "医师签字", "弃检签字"};
        Font font = getFont();
        font.setStyle(Font.BOLD);
        for (int i = 0; i < 7; i++) {
            PdfPCell cell = new PdfPCell(new Phrase(titleArray[i], font));
            cell.setFixedHeight(30);
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            table1.addCell(cell);
        }
        font = getFont();
        font.setSize(10);
        for (int i = 0; i < data.size(); i++) {
            PdfPCell cell = new PdfPCell(new Phrase(String.valueOf(i+1), font));
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            table1.addCell(cell);
            cell = new PdfPCell(new Phrase((String) data.get(i).get("ksmc"), font));
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            table1.addCell(cell);
            cell = new PdfPCell(new Phrase((String) data.get(i).get("ksdz"), font));
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);
            cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
            table1.addCell(cell);
            cell = new PdfPCell(new Phrase((String) data.get(i).get("tjxm"), font));
            table1.addCell(cell);
            cell = new PdfPCell(new Phrase(" ", font));
            table1.addCell(cell);
            cell = new PdfPCell(new Phrase(" ", font));
            table1.addCell(cell);
            cell = new PdfPCell(new Phrase(" ", font));
            table1.addCell(cell);
        }
        document.add(table1);
    }
    public static ByteArrayOutputStream execDj(List<List<Map<String ,Object>>> data) throws IOException, DocumentException {
        Map<String, Object> map = getDocument();
        Document document = (Document) map.get("document");
        makeUserInfoTable(document, "李四", "女", "189787998", "123456", "单位", "2022-04-21");
        List<Map<String, Object>> mapList = data.get(Integer.parseInt("tjInfo"));
//        makeTjInfo(document, mapList);
        // 多条则换页
        document.newPage();
        document.close();
        return (ByteArrayOutputStream) map.get("stream");
    }
}