Java 使用 itextpdf 自定义 生成 pdf

embedded/2024/10/25 5:13:34/

Java 使用 itextpdf 自定义 生成 pdf

  • maven 依赖
  • 实现
  • 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-composebuild:dockerfile: # Dockerfile 位置context: .image: 镜像名container_name: 容器名environment:JVM_PARAM: ${JVM_PARAM} # jvm启动参数BOARDING_HOST_IP: ${BOARDING_HOST_IP} # 宿主机IPBOARDING_HOST_PORT: ${BOARDING_HOST_PORT} # 宿主机IPrestart: alwaysports: # 端口映射- "${BOARDING_HOST_PORT}:${BOARDING_HOST_PORT}"volumes: # 数据卷  挂载文件目录- /home/fonts:/usr/local/fonts

http://www.ppmy.cn/embedded/132247.html

相关文章

软考:缓存分片和一致性哈希

缓存分片技术是一种将数据分散存储在多个节点上的方法&#xff0c;它在分布式缓存系统中尤为重要。这项技术的核心目的是提高系统的性能和可扩展性&#xff0c;同时确保数据的高可用性。以下是缓存分片技术的一些关键点&#xff1a; 数据分片&#xff1a;缓存分片涉及将数据分成…

Axios 基本使用

Axios 是一个异步请求技术,核心作用就是用来在页面中发送异步请求,并获取对应数据在页面中渲染 页面局部更新技术 Ajax 中文网站:https://www.kancloud.cn/yunye/axios/234845 安装: <script src"https://unpkg.com/axios/dist/axios.min.js"></script&g…

Android 10.0 截屏流程

通常未通过特殊定制的 Android 系统&#xff0c;截屏都是经过同时按住音量下键和电源键来截屏。本篇文章就只讨论使用这些特殊按键来进行截屏。 这里我们就要明白事件是在哪里进行分发拦截的。通过源码的分析&#xff0c;我们发现是在PhoneWindowManager.java 中。 PhoneWindow…

Vue项目实战-新能源汽车可视化(一)(持续更新中)

一.项目代码 1.App.vue <template><!-- 模板--><div id"wrapper"><div style"width: 100%"><el-tabs v-model"activeName" id"tabs"> <!-- 标签栏里包含了三个标签面板&#xff0c;分别是研发与维…

css动画烟花秀__烟花效果

先看效果 CSS烟花秀 这是一个在HTML5页面&#xff0c;实现烟花效果的例子 以下为实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…

多模态大语言模型(MLLM)-Blip3/xGen-MM

论文链接&#xff1a;https://www.arxiv.org/abs/2408.08872 代码链接&#xff1a;https://github.com/salesforce/LAVIS/tree/xgen-mm 本次解读xGen-MM (BLIP-3): A Family of Open Large Multimodal Models 可以看作是 [1] Blip: Bootstrapping language-image pre-training…

太速科技-426-基于XC7Z100+TMS320C6678的图像处理板卡

基于XC7Z100TMS320C6678的图像处理板卡 一、板卡概述 板卡基于独立的结构&#xff0c;实现ZYNQ XC7Z100DSP TMS320C6678的多路图像输入输出接口的综合图像处理&#xff0c;包含1路Camera link输入输出、1路HD-SDI输入输出、1路复合视频输入输出、2路光纤等视频接口&#xff0c;…

CZX前端秘籍2

vue生命周期&#xff08; 组件从创建到销毁的过程就是它的生命周期&#xff09; 创建前 beforeCreat&#xff08; 在这个阶段属性和方法都不能使用&#xff09; 创建时 created&#xff08; 这里时实例创建完成之后&#xff0c; 在这里完成了数据监测&#xff0c; 可以使用数…