Java 使用 itextpdf 自定义 生成 pdf

Java 使用 itextpdf 自定义 生成 pdf

  • maven 依赖
  • 实现
  • docker 服务 字体文件找不到问题

maven 依赖

<!-- 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>

实现

    /*** 生成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 服务 字体文件找不到问题

  服务名:   # 我这里是微服务 整合了 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.rhkb.cn/news/455260.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

求助帖:ubuntu22.10 auto install user-data配置了为何还需要选择语言键盘(如何全自动)

0-现象&#xff1a;配置好autoinstll的PXE与user-data文件安装过程仍然要人工选语言、键盘等&#xff0c;非全自动&#xff1b;—— 1.硬件环境&#xff1a;x86_64机器 U盘&#xff08;/dev/sda&#xff09;&#xff1b; 2.软件环境&#xff1a;DHCPPXE启动做好grub与pxe的aut…

【AI绘画】Midjourney进阶:留白构图详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;什么是构图为什么Midjourney要使用构图 &#x1f4af;留白构图特点使用场景提示词书写技巧测试 &#x1f4af;小结 &#x1f4af;前言 【AI绘画】Midjourney进阶&…

Springboot 的手动配置操作讲解

1.创建新项目: 手动创建使用maven 项目 并选择骨架: quickstart 骨架用来搭建spingboot 2.手动输入pom.xml依赖: 要想创建springboot 首先继承springboot 的父类 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo…

算法的学习笔记—两个链表的第一个公共结点(牛客JZ52)

&#x1f600;前言 在链表问题中&#xff0c;寻找两个链表的第一个公共结点是一个经典问题。这个问题的本质是在两个单链表中找到它们的相交点&#xff0c;或者说它们开始共享相同节点的地方。本文将详细讲解这个问题的解题思路&#xff0c;并提供一种高效的解决方法。 &#x…

python 爬虫抓取百度热搜

实现思路&#xff1a; 第1步、在百度热搜页获取热搜元素 元素类名为category-wrap_iQLoo 即我们只需要获取类名category-wrap_为前缀的元素 第2步、编写python脚本实现爬虫 import requests from bs4 import BeautifulSoupurl https://top.baidu.com/board?tabrealtime he…

[手机Linux PostmarketOS]七, Linux使用selenium爬虫

一&#xff0c;selenium安装 # 用pip 安装 selenium pip3 install selenium --break-system-packages 二&#xff0c;安装浏览器Chrome Alpine Linux 环境中没有google Chrome&#xff0c; 使用 Chromium 浏览器作为 Chrome 的替代品&#xff0c;Chromium 是 Chrome 的开源版本…

定时任务使用kafka

定时任务使用kafka 在上述业务场景中使用 Kafka 而不是直接定时执行任务有以下几个重要原因&#xff1a; 一、解耦 任务触发与执行分离&#xff1a; 使用 XXL-JOB 定时触发任务并将任务消息发送到 Kafka&#xff0c;实现了任务触发端&#xff08;通常是调度系统&#xff09;和…

数字后端零基础入门系列 | Innovus零基础LAB学习Day5

###Module 12 RC参数提取和时序分析 数字后端零基础入门系列 | Innovus零基础LAB学习Day4 数字后端零基础入门系列 | Innovus零基础LAB学习Day3 数字后端零基础入门系列 | Innovus零基础LAB学习Day2 数字后端零基础入门系列 | Innovus零基础LAB学习Day1 ###LAB12-1 这个章节…

机器学习与神经网络:科技的星辰大海

前提 近日&#xff0c;2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者&#xff0c;这是历史上首次出现这样的情况。这项奖项原本只授予对自然现象和物质的物理学研究作出重大贡献的科学家&#xff0c;如今却将全球范围内对机器学习和神经网络的研究和开发作为了一…

kotlin 入门总结

目录 1、构造函数 2、数据类 data class&#xff0c; 3、object 单例类&#xff0c;相当于java线程安全的懒加载 4、companion object 伴生对象&#xff0c;类似于包装静态值的一个区域块 5、解构 6、空安全 7、条件语句 8、集合 9 属性和支持属性 属性 支持属性 10 …

kali的下载与配置

kali.org官网下载 选择VMware的版本下载&#xff0c;并解压&#xff0c;复制解压后的路径 在虚拟机中&#xff0c;点击文件&#xff0c;打开 默认的账户密码均为kali 修改密码 sudo passwd root 切换root用户 su root 查看IP ip addr IP:192.168.184.131 粘贴复制shiftinsert…

从图像识别到聊天机器人:Facebook AI的多领域应用

随着人工智能技术的快速发展&#xff0c;Facebook已在多个领域内广泛应用AI技术&#xff0c;以提升用户体验、提高效率并推动创新。从图像识别到聊天机器人&#xff0c;Facebook的AI应用涵盖了社交媒体的方方面面&#xff0c;下面我们将深入探讨这些应用的具体实现及其对用户生…

ecmp观察

文章目录 简述选路策略实验说明开始验证 简述 ECMP&#xff08;Equal Cost Multi Path&#xff09;等价多路径&#xff0c;又称等价路由。指到达同一个目的IP或者目的网段存在多条COST值相等的不同路由路径。在具有多条到达同一目的地的网络链路的环境中&#xff0c;传统路由技…

2.1 > Shell 是什么、如何更熟练的使用 Bash Shell

Shell 基础知识 Shell是计算机操作系统中的一个命令行解释器&#xff0c;由C语言编写&#xff0c;用于用户与操作系统之间进行交互。用户可以通过Shell输入命令&#xff0c;操作系统接收到这些命令后执行相应的操作。Shell一般还提供了编程语言的基本功能&#xff0c;允许用户…

在 VS Code 中轻松绘图:Draw.io Integration 插件详解

文章目录 在 VS Code 中轻松绘图&#xff1a;Draw.io Integration 插件详解一、什么是 Draw.io Integration 插件&#xff1f;二、插件安装指南1. 安装步骤2. 配置插件 三、如何使用 Draw.io Integration 插件&#xff1f;1. 创建新绘图文件2. 编辑现有图表3. 常用功能与技巧 四…

网安加·百家讲坛 | 徐一丁:金融机构网络安全合规浅析

作者简介&#xff1a;徐一丁&#xff0c;北京小西牛等保软件有限公司解决方案部总监&#xff0c;网络安全高级顾问。2000年开始从事网络安全工作&#xff0c;主要领域为网络安全法规标准研究、金融行业安全咨询与解决方案设计、信息科技风险管理评估等。对国家网络安全法规标准…

【数据结构与算法】《布隆过滤器:高效数据筛选的魔法工具》

标题&#xff1a;《布隆过滤器&#xff1a;高效数据筛选的魔法工具》 摘要&#xff1a;本文将带你深入了解布隆过滤器这一神奇的数据结构。从研究推荐系统中的已读内容排除和重复内容去重问题引入&#xff0c;详细介绍布隆过滤器的产生契机、设计思想、优缺点及用途。通过阅读…

机器视觉运动控制一体机在DELTA并联机械手视觉上下料应用

市场应用背景 DELTA并联机械手是由三个相同的支链所组成&#xff0c;每个支链包含一个转动关节和一个移动关节&#xff0c;具有结构紧凑、占地面积小、高速高灵活性等特点&#xff0c;可在有限的空间内进行高效的作业&#xff0c;广泛应用于柔性上下料、包装、分拣、装配等需要…

MyBatis 基础知识:配置文件、映射器与 SQL 示例详解

本篇博客将深入探讨 MyBatis 的基础知识&#xff0c;包括配置文件的设置、映射器的使用以及实际的 SQL 示例。 文章目录 前言 准备工作 根据主键删除 日志输出 ​编辑 预编译SQL SQL注入 ​编辑 参数占位符 新增员工 主键返回 更新 查询&#xff08;根据ID查询&#x…

世界前沿思想升命学说:鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪

在当今哲学的前沿探索中&#xff0c;山东济南的名人颜廷利教授的《升命学说》一书以其独到的见解和深刻的洞察力&#xff0c;为我们揭示了十二生肖背后的象征意义。这些生肖包括鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗以及猪&#xff0c;每一种动物都承载着独特的文化寓意…