Java 使用 itextpdf 自定义 生成 pdf

Java 使用 itextpdf 自定义 生成 pdf

  • [maven 依赖](#maven 依赖)
  • 实现
  • [docker 服务 字体文件找不到问题](#docker 服务 字体文件找不到问题)

maven 依赖

javascript 复制代码
<!-- iText 7 -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext7-core</artifactId>
    <version>7.2.3</version>
    <type>pom</type>
</dependency>
<!-- fastjson2 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.28</version>
</dependency>

实现

java 复制代码
    /**
     * 生成pdf文档
     * @param data
     * @param file
     * @throws IOException
     */
    public static void generatePDF(JSONObject data, File file,String path) throws IOException {
        // 创建 PDF 文档
        PdfWriter writer = new PdfWriter(file);
        PdfDocument pdfDoc = new PdfDocument(writer);
        Document document = new Document(pdfDoc);

        // 从 Redis 中加载字体
        /*PdfFont simkaiFont = fontUtil.loadFontFromRedis(RedisKeyConstant.FONT + ":simkai");
        PdfFont simsunFont = fontUtil.loadFontFromRedis(RedisKeyConstant.FONT + ":simsun");
        PdfFont stzhongsFont = fontUtil.loadFontFromRedis(RedisKeyConstant.FONT + ":stzhongs");*/
        // 自定义字体文件 path 文件父文件夹
        PdfFont simkaiFont = PdfFontFactory.createFont(path + "simkai.ttf", PdfEncodings.IDENTITY_H, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);
        PdfFont simsunFont = PdfFontFactory.createFont(path + "simsun.ttf", PdfEncodings.IDENTITY_H, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);
        PdfFont stzhongsFont = PdfFontFactory.createFont(path + "stzhongs.ttf", PdfEncodings.IDENTITY_H, PdfFontFactory.EmbeddingStrategy.PREFER_EMBEDDED);

        // 设置边距
        document.setMargins(42.7f, 38f, 42.7f, 38f); // 上、右、下、左边距

        // 添加法院名称
        Paragraph courtLevel = new Paragraph(data.getString("court_level"))
                .setFont(stzhongsFont) // 华文中宋
                .setFontSize(22)       // 二号字
                .setFontColor(DeviceRgb.BLACK)  // 黑色字体
                .setMultipliedLeading(1.5f)     // 1.5倍行距
                .setMarginTop(10)               // 段前间距
                .setTextAlignment(TextAlignment.CENTER); // 居中对齐
        document.add(courtLevel);
        // 添加页眉页脚
        pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new FooterEventHandler(data.getString("case_name"), simkaiFont, simsunFont));

        // 添加判决书类型
        Paragraph caseType = new Paragraph(getCaseTypeText(data))
                .setFont(stzhongsFont)        // 华文中宋
                .setFontSize(26)              // 一号字
                .setFontColor(DeviceRgb.BLACK) // 字体颜色为黑色
                .setMultipliedLeading(1.5f)   // 1.5倍行距
                .setTextAlignment(TextAlignment.CENTER); // 居中对齐
        document.add(caseType);
        // 添加页眉页脚
        pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new FooterEventHandler(data.getString("case_name"), simkaiFont, simsunFont));

        // 添加案号
        Paragraph caseId = new Paragraph(data.getString("case_id"))
                .setFont(simkaiFont)                // 设置字体为楷体
                .setFontSize(15)                    // 小三字号
                .setFontColor(DeviceRgb.BLACK)      // 字体颜色为黑色
                .setFixedLeading(24)                // 固定行距 24磅
                .setMarginTop(12)                   // 段前一行(24磅,等于固定行距)
                .setMarginBottom(24)                // 段后一行(24磅,等于固定行距)
                .setTextAlignment(TextAlignment.RIGHT); // 右对齐
        document.add(caseId);
        // 添加页眉页脚
        pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new FooterEventHandler(data.getString("case_name"), simkaiFont, simsunFont));

        // 添加内容段落
        List<String> contentList = JsonUtil.getList(data, "content", String.class);
        float indent = 15 * 2;
        for (String content : contentList) {
            Paragraph contentPara = new Paragraph(content)
                    .setFont(simkaiFont)                // 设置字体为楷体
                    .setFontSize(15)                    // 小三字号
                    .setFontColor(DeviceRgb.BLACK)      // 设置字体颜色为黑色
                    .setFixedLeading(24)                // 设置固定行距为24磅
                    .setFirstLineIndent(indent)         // 设置首行缩进为2个字符
                    .setMultipliedLeading(1.5f)   // 1.5倍行距
                    //.setWidth(300.51f)                  // 设置每行宽度
                    .setTextAlignment(TextAlignment.LEFT); // 左对齐
            document.add(contentPara);
            // 添加页眉页脚
            pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new FooterEventHandler(data.getString("case_name"), simkaiFont, simsunFont));
        }

        // 添加落款内容
        List<String> signatureList = JsonUtil.getList(data, "signature", String.class);
        for (String signature : signatureList) {
            Paragraph signaturePara = new Paragraph(signature)
                    .setFont(simkaiFont)                // 设置字体为楷体
                    .setFontSize(15)                    // 小三字号
                    .setFontColor(DeviceRgb.BLACK)      // 设置字体颜色为黑色
                    .setFixedLeading(24)
                    .setTextAlignment(TextAlignment.RIGHT); // 右对齐
            document.add(signaturePara);
            // 添加页眉页脚
            pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new FooterEventHandler(data.getString("case_name"), simkaiFont, simsunFont));
        }

        // 添加页眉页脚
        pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new FooterEventHandler(data.getString("case_name"), simkaiFont, simsunFont));

        // 关闭文档
        document.close();
    }

docker 服务 字体文件找不到问题

java 复制代码
  服务名:   # 我这里是微服务 整合了 docker-compose
    build:
      dockerfile: # Dockerfile 位置
      context: .
    image: 镜像名
    container_name: 容器名
    environment:
      JVM_PARAM: ${JVM_PARAM} # jvm启动参数
      BOARDING_HOST_IP: ${BOARDING_HOST_IP} # 宿主机IP
      BOARDING_HOST_PORT: ${BOARDING_HOST_PORT} # 宿主机IP
    restart: always
    ports: # 端口映射
      - "${BOARDING_HOST_PORT}:${BOARDING_HOST_PORT}"
    volumes: # 数据卷  挂载文件目录
      - /home/fonts:/usr/local/fonts
相关推荐
折哥的程序人生 · 物流技术专研27 分钟前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
researcher-Jiang1 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
西门吹-禅3 小时前
java springboot N+1问题
java·开发语言·spring boot
DLYSB_3 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
weixin_BYSJ19873 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
AI小码3 小时前
LLM 应用的缓存工程:当每次 API 调用都在燃烧成本
java·人工智能·spring·计算机·llm·编程·api
Hui Baby4 小时前
Spring Security
java·后端·spring
IT笔记4 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
我才是银古5 小时前
构建 Java GIS 工具库:从碎片化 API 到统一抽象的设计实践
java·gis·geotools·gdal·esri
TPBoreas5 小时前
配置信息防泄露方案:.env 环境隔离详解(dotenv-java)
java·开发语言