如何使用Java生成pdf报告
文章目录
- 一、环境准备与Maven依赖说明
- 二、核心代码解析
- 1. 基础文档创建
- 2. 中文字体处理
- 3. 复杂表格创建
- 4. 图片插入
- 三、完整代码示例
- 四、最终效果
这篇主要说一下如何使用Java生成pdf,包括标题,文字,图片,表格的插入和调整等相关内容。
一、环境准备与Maven依赖说明
这里我使用的是iTextPDF,依次添加下面的依赖
核心依赖说明:
<!-- pdf:start --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.11</version></dependency><!-- 支持中文 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><!-- 支持css样式渲染 --><dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf-itext5</artifactId><version>9.1.16</version></dependency><!-- 转换html为标准xhtml包 --><dependency><groupId>net.sf.jtidy</groupId><artifactId>jtidy</artifactId><version>r938</version></dependency><dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.5.3</version></dependency><!-- Jetty WebSocket支持 --><dependency><groupId>org.eclipse.jetty.websocket</groupId><artifactId>javax-websocket-server-impl</artifactId><version>9.4.44.v20210927</version></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-webapp</artifactId><version>9.4.44.v20210927</version></dependency><!-- Apache HttpClient --><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>
二、核心代码解析
1. 基础文档创建
文档的创建:
// 创建A4文档,设置页边距(左、右、上、下)
Document document = new Document(PageSize.A4, 40, 40, 40, 40);
PdfWriter writer = PdfWriter.getInstance(document, outputStream);// 必须显式打开文档
document.open();
2. 中文字体处理
字体调整:
// 使用内置STSong-Light字体
BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font bodyFont = new Font(bf, 12);// 推荐做法:使用外部字体文件
BaseFont externalFont = BaseFont.createFont("fonts/SourceHanSansCN-Regular.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
3. 复杂表格创建
表格创建:
// 创建5列表格,设置列宽比例
float[] colWidths = {2f, 1.5f, 1.5f, 1.5f, 1.5f};
PdfPTable table = new PdfPTable(colWidths);// 设置表格占页面宽度的100%
table.setWidthPercentage(100);// 添加表头
addTableHeader(table, new String[]{"指标", "Q1", "Q2", "Q3", "Q4"}, headerFont);// 添加数据行
addTableRow(table, new String[]{"响应时间(ms)", "230", "180", "150", "120"}, bodyFont);
4. 图片插入
插入本地图片:
// 推荐使用相对路径
String imagePath = "src/main/resources/charts/tech_trend.png";// 自动缩放适应宽度
Image image = Image.getInstance(imagePath);
image.scaleToFit(document.getPageSize().getWidth() - 80, Float.MAX_VALUE);
image.setAlignment(Image.ALIGN_CENTER);// 添加图片描述
Paragraph caption = new Paragraph("图1 2023年季度性能趋势对比", captionFont);
caption.setAlignment(Element.ALIGN_CENTER);
document.add(caption);
document.add(image);
三、完整代码示例
下面是完整的代码示例,可以直接调整使用
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.LineSeparator;
import com.ruoyi.RuoYiApplication;
import com.ruoyi.common.utils.http.HttpUtils;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.io.*;
import java.text.ParseException;@RunWith(SpringRunner.class)
@SpringBootTest(classes= RuoYiApplication.class)
public class pdfDemoTest5 {/*** PDF生成- 公司年度技术报告*/@Testpublic void generateDemoPdf() throws Exception {// 文档设置(调整页边距)Document document = new Document(PageSize.A4, 40, 40, 40, 40);PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("tech_report_demo.pdf"));// 创建中文字体BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 定义字体样式Font redTitleFont = new Font(bf, 20, Font.BOLD, BaseColor.RED);Font programFont = new Font(bf, 16, Font.BOLD);Font sectionFont = new Font(bf, 14, Font.BOLD);Font bodyFont = new Font(bf, 12);Font tableHeaderFont = new Font(bf, 12, Font.BOLD);Font contactFont = new Font(bf, 11, Font.BOLD);document.open();// ========== 标题区块 ==========Paragraph program = new Paragraph();program.add(new Chunk("2023年度技术发展报告\n", programFont));program.add(new Chunk("科技创新与数字化转型", programFont));program.setAlignment(Element.ALIGN_CENTER);program.setSpacingAfter(15f);document.add(program);// 红色主标题(带下划线)Paragraph mainTitle = new Paragraph("技术研发中心年度报告", redTitleFont);mainTitle.setAlignment(Element.ALIGN_CENTER);mainTitle.setSpacingAfter(10f);document.add(mainTitle);// ========== 期号信息 ==========Paragraph issue = new Paragraph();issue.add(new Chunk("[2023]年度报告", bodyFont));issue.add(new Chunk(" ", bodyFont)); // 空格占位issue.add(new Chunk("发布日期:[2024]年[1]月[15]日", bodyFont));issue.setAlignment(Element.ALIGN_RIGHT);document.add(issue);// 添加下划线效果Chunk underline = new Chunk(new LineSeparator(1.5f, 100f, BaseColor.RED, Element.ALIGN_CENTER, -1));document.add(underline);// ========== 报告标题 ==========Paragraph reportTitle = new Paragraph("2023年度技术研发成果与2024年展望",sectionFont);reportTitle.setAlignment(Element.ALIGN_CENTER);reportTitle.setSpacingBefore(15f);reportTitle.setSpacingAfter(20f);document.add(reportTitle);// ========== 正文内容 ==========// 年度总结部分addSection(document, "1. 年度技术成果总结", sectionFont,"2023年,我司在人工智能、大数据分析和云计算领域取得了显著进展。主要成果包括完成了新一代智能分析平台的开发,实现了数据处理效率提升300%;发布了基于机器学习的预测模型,准确率达到行业领先水平;完成了核心系统的云原生改造,系统稳定性提升至99.99%。", bodyFont);// 技术指标部分addSection(document, "2. 关键技术指标", sectionFont, "", bodyFont);// 表格样式优化float[] colWidths = {2f, 1.5f, 1.5f, 1.5f, 1.5f};// 创建表格标题Paragraph tableCaption = new Paragraph("表1 2023年关键技术指标对比", bodyFont);tableCaption.setAlignment(Element.ALIGN_CENTER);tableCaption.setSpacingBefore(10f);tableCaption.setSpacingAfter(5f);document.add(tableCaption);// 创建表格createComparisonTable(document,new String[]{"系统响应时间(ms)", "230", "180", "150", "120"},new String[]{"数据处理量(TB/天)", "5.2", "8.7", "12.4", "15.8"},colWidths, tableHeaderFont, bodyFont);// ========== 技术趋势图 ==========Paragraph imageParagraph = new Paragraph();imageParagraph.setSpacingBefore(20f);imageParagraph.add(new Chunk("图1 2023年技术发展趋势", bodyFont));imageParagraph.setAlignment(Element.ALIGN_CENTER);document.add(imageParagraph);// 插入本地图片(示例)String localImagePath = "D:\\test.jpg";Image localImage = Image.getInstance(localImagePath);localImage.scaleToFit(400, 250);localImage.setAlignment(Image.ALIGN_CENTER);document.add(localImage);// ========== 未来展望 ==========addSection(document, "3. 2024年技术发展规划", sectionFont,"2024年,我们将重点布局以下领域:\n\n" +"• 人工智能:深化自然语言处理技术应用\n" +"• 边缘计算:构建分布式计算网络\n" +"• 数据安全:实施零信任安全架构\n" +"• 云原生:全面容器化改造\n\n" +"预计2024年研发投入将增长30%,重点培养高端技术人才50名。", bodyFont);// ========== 联系方式 ==========Paragraph contacts = new Paragraph();contacts.add(new Chunk("技术咨询:", contactFont));contacts.add(new Chunk(" 400-123-4567 ", bodyFont));contacts.add(new Chunk("电子邮箱:", contactFont));contacts.add(new Chunk("tech@company.com\n", bodyFont));contacts.add(new Chunk("公司地址:", contactFont));contacts.add(new Chunk("北京市海淀区科技园区88号 创新大厦B座", bodyFont));contacts.setSpacingBefore(20f);document.add(contacts);document.close();}// 辅助方法:添加章节private void addSection(Document doc, String title, Font titleFont, String content, Font bodyFont) {try {Paragraph section = new Paragraph(title, titleFont);section.setSpacingBefore(15f);doc.add(section);if(!content.isEmpty()) {Paragraph text = new Paragraph(content, bodyFont);text.setSpacingAfter(15f);doc.add(text);}} catch (DocumentException e) {e.printStackTrace();}}// 辅助方法:创建对比表格private void createComparisonTable(Document doc,String[] row1, String[] row2,float[] colWidths, Font headerFont, Font bodyFont) {try {PdfPTable table = new PdfPTable(colWidths);table.setWidthPercentage(100);table.setSpacingBefore(0f); // 标题与表格的间距由外部控制table.setSpacingAfter(15f);// 表头addTableHeader(table, new String[]{"省份", "河南省", "河北省", "山东省", "江苏省", "安徽省"}, headerFont);// 数据行addTableRow(table, row1, bodyFont);addTableRow(table, row2, bodyFont);doc.add(table);} catch (DocumentException e) {e.printStackTrace();}}// 辅助方法:添加表头private void addTableHeader(PdfPTable table, String[] headers, Font font) {for (String header : headers) {PdfPCell cell = new PdfPCell(new Paragraph(header, font));cell.setBackgroundColor(new BaseColor(240, 240, 240));cell.setPadding(5);cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);}}// 辅助方法:添加表格行private void addTableRow(PdfPTable table, String[] data, Font font) {for (String item : data) {PdfPCell cell = new PdfPCell(new Paragraph(item, font));cell.setPadding(5);cell.setHorizontalAlignment(Element.ALIGN_CENTER);table.addCell(cell);}}}
四、最终效果
这个就是上面代码生成的最终的pdf的效果图
相关文章:

如何使用Java生成pdf报告
文章目录 一、环境准备与Maven依赖说明二、核心代码解析1. 基础文档创建2. 中文字体处理3. 复杂表格创建4. 图片插入 三、完整代码示例四、最终效果 这篇主要说一下如何使用Java生成pdf,包括标题,文字,图片,表格的插入和调整等相关…...
HarmonyOS鸿蒙应用规格开发指南
在鸿蒙生态系统中,应用规格是确保应用符合系统要求的基础。本文将深入探讨鸿蒙应用的规格开发实践,帮助开发者打造符合规范的应用。 应用包结构规范 1. 基本配置要求 包结构规范 符合规范的应用包结构正确的HAP配置文件完整的应用信息 示例配置&…...
【Harmony】【鸿蒙】List列表View如何刷新内部的自定义View的某一个控件
创建自定义View Component export struct TestView{State leftIcon?:Resource $r(app.media.leftIcon)State leftText?:Resource | string $r(app.string.leftText)State rightText?:Resource | string $r(app.string.rightText)State rightIcon?:Resource $r(app.med…...
iisARR负均衡
IIS ARR负载均衡详细配置指南 🎯 什么是ARR(Application Request Routing) ARR是IIS的一个扩展模块,它可以: 负载均衡:将请求分发到多个服务器反向代理:隐藏后端服务器架构健康检查…...
uniapp打包报错:重新在manifest.json中生成自己的APPID
在UniApp开发过程中,打包时可能会遇到报错提示需要在manifest.json中重新生成自己的APPID。以下是解决该问题的具体方法: 检查并生成APPID 打开项目根目录下的manifest.json文件,找到appid字段。如果该字段为空或为默认值,需要重…...

人脸识别备案开启安全防护模式!紧跟《办法》!
国家互联网信息办公室与公安部于 2025 年 3 月 13 日联合公布了《人脸识别技术应用安全管理办法》(以下简称《办法》),并自 2025 年 6 月 1 日起正式施行。其中,人脸识别备案成为了规范技术应用、守护信息安全的关键一环。 一、…...
【爬虫】DrissionPage-7
官方文档: https://www.drissionpage.cn/browser_control/get_page_info/ 1. 页面信息 📌 html 描述:返回当前页面的 HTML 文本。注意:不包含 <iframe> 元素的内容。返回类型:str 示例: html_co…...

新浪《经济新闻》丨珈和科技联合蒲江政府打造“数字茶园+智能工厂+文旅综合体“创新模式
5月14日,新浪网《经济新闻》频道专题报道珈和科技在第十四届四川国际茶业博览会上的精彩亮相,并深度聚焦我司以数字技术赋能川茶产业高质量发展创新技术路径,及在成都市“茶业建圈强链”主题推介会上,珈和科技与蒲江县人民政府就智…...
git 撤销最近的几次push
要实现将远程仓库回退到最近5次push之前的状态,同时保留本地改动,可以按照以下步骤操作: 一、本地分支回退(保留改动) # 1. 查看提交历史确认要回退的提交点 git log --oneline# 2. 回退到5次提交前的状态࿰…...
水滴前端面经及参考答案
盒模型是什么,标准盒模型和 IE 盒模型有什么区别? 盒模型是 CSS 中一个基础概念,它描述了元素在页面中所占的空间大小。每个元素都可以看作是一个矩形盒子,从内到外由内容区(content)、内边距(padding)、边框(border)和外边距(margin)组成。 标准盒模型的宽度和高…...
React 第四十五节 Router 中 useHref() Hook的使用详解及注意事项
前言 React Router 中的 useHref 是一个用于生成完整 URL 路径的钩子, 它可以将相对路径解析为绝对路径,并确保在不同路由层级中正确工作。 它常用于自定义导航组件或需要手动构建链接的场景。 一、useHref核心用途 解析相对路径:自动将相…...

50、js 中var { ipcRenderer } = require(‘electron‘);是什么意思?
在 JavaScript 中,var { ipcRenderer } require(‘electron’); 这行代码的含义是: 1. require(‘electron’) 这是 Node.js 的模块引入语法,用于加载 Electron 的核心模块。electron 是 Electron 框架的主模块,提供了构建桌面…...
LeetCode 438. 找到字符串中所有字母异位词 | 滑动窗口与字符计数数组解法
文章目录 问题描述核心思路:滑动窗口 字符计数数组1. 字符计数数组2. 滑动窗口 算法步骤完整代码实现复杂度分析关键点总结类似问题 问题描述 给定两个字符串 s 和 p,要求找到 s 中所有是 p 的**字母异位词(Anagram)**的子串的起…...
@RequestParam 和 @RequestBody、HttpServletrequest 与HttpServletResponse
在Java Web开发中,RequestParam、RequestBody、HttpServletRequest 和 HttpServletResponse 是常用的组件,它们用于处理HTTP请求和响应。下面分别介绍它们的使用场景和使用方法: 1. RequestParam RequestParam 是Spring MVC框架中的注解&am…...

计算机底层的多级缓存以及缓存带来的数据覆盖问题
没有多级缓存的情况 有多级缓存的情况 缓存带来的操作覆盖问题 锁总线带来的消耗太大了。...

SpringBoot-1-入门概念介绍和第一个Spring Boot项目
文章目录 1 开发JAVA EE应用1.1 EJB1.2 Spring框架1.2.1 IoC(Inversion of Control)控制反转1.2.2 DI(Dependency Injection)依赖注入1.2.3 AOP面向切面编程1.3 Spring Boot1.4 Spring Cloud框架1.5 开发工具2 创建Spring Boot项目2.1 在线项目生成向导2.2 使用IDEA导入项目2.3…...
服务器多用户共享Conda环境操作指南——Ubuntu24.02
1. 使用阿里云镜像下载 Anaconda 最新版本 wget https://mirrors.aliyun.com/anaconda/archive/Anaconda3-2024.02-1-Linux-x86_64.sh bug解决方案 若出现:使用wget在清华镜像站下载Anaconda报错ERROR 403: Forbidden. 解决方案:wget --user-agent“M…...

基于FPGA的电子万年历系统开发,包含各模块testbench
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于FPGA的电子万年历系统开发,包含各模块testbench。主要包含以下核心模块: 时钟控制模块:提供系统基准时钟和计时功能。 日历计算模块:…...
Leetcode刷题 | Day63_图论08_拓扑排序
一、学习任务 拓扑排序代码随想录 二、具体题目 1.拓扑排序117. 软件构建 【题目描述】 某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件依赖于其他文件的内容,这意味着如果文件 A 依…...

MySQL 可观测性最佳实践
MySQL 简介 MySQL 是一个广泛使用的开源关系型数据库管理系统(RDBMS),以其高性能、可靠性和易用性而闻名,适用于各种规模的应用,从小型网站到大型企业级系统。 监控 MySQL 指标是维护数据库健康、优化性能和确保数据…...
系统性能分析基本概念(3) : Tuning Efforts
系统性能调优(Tuning Efforts)是指通过优化硬件、软件或系统配置来提升性能,减少延迟、提高吞吐量或优化资源利用率。以下是系统性能调优的主要努力方向,涵盖硬件、操作系统、应用程序和网络等多个层面,结合实际应用场…...
OceanBase数据库全面指南(函数篇)函数速查表
文章目录 一、数学函数1.1 基本数学函数1.2 三角函数二、字符串函数2.1 基本字符串函数2.2 高级字符串处理函数三、日期时间函数3.1 基本日期时间函数3.2 日期时间计算函数四、聚合函数4.1 常用聚合函数4.2 分组聚合4.3 高级聚合函数五、条件判断函数5.1 基本条件函数5.2 CASE表…...
SpringBoot 对象转换 MapStruct
文章目录 工作原理核心优势为什么不使用 BeanUtils使用步骤添加依赖定义实体类和VO类定义映射接口测试数据 参考 工作原理 基于 Java 的 JSR 269 规范,该规范允许在编译期处理注解,也就是 Java 注解处理器。MapStruct 通过定义的注解处理器,…...
计算机网络——Session、Cookie 和 Token
在 Web 开发中,Session、Cookie 和 Token 是实现用户会话管理和身份验证的核心技术。它们既有联系,也有明显区别。以下从定义、原理、联系、区别和应用场景等方面详细解析。 一、基本定义与原理 1. Cookie 定义: 是浏览器存储在客户端的小…...

01-jenkins学习之旅-window-下载-安装-安装后设置向导
1 jenkins简介 百度百科介绍:Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。 [1] Jenkins官网地址 翻译&…...
Spark,SparkSQL操作Mysql, 创建数据库和表
以下是使用 Spark SQL 在 MySQL 中创建数据库和表的步骤(基于 Scala API): 1. 准备工作 - 添加 MySQL 驱动依赖 同前所述,需在 Spark 环境中引入 MySQL Connector JAR 包(如 mysql-connector-java-8.0.33.jar &#…...
AttributeError: module ‘cv2.dnn‘ has no attribute ‘DictValue‘错误解决方法
源代码如下: # 读取图像 import cv2 im cv2.imread("./test.png", 1) # 1表示3通道彩色,0表示单通道灰度 cv2.imshow("test", im) # 在test窗口中显示图像 print(type(im)) # 打印数据类型 print(im.shape) # 打印图像尺寸 cv2.wai…...
HarmonyOS 鸿蒙应用开发基础:@Watch装饰器详解及与@Monitor装饰器对比分析
在鸿蒙系统的开发中,状态管理和组件之间的通信是至关重要的部分。为此,鸿蒙提供了多种装饰器来帮助开发者监听和处理数据变化。今天我们将深入探讨Watch装饰器,并与新的状态管理组件V2中的Monitor装饰器进行对比。 Watch装饰器详解 基本概念…...
机器人拖动示教控制
机器人拖动示教控制 机器人拖动视角控制与轨迹记录 1. 知识目标 体验ES机器人拖动视角操作体验ES机器人拖动轨迹记录 2. 技能目标 掌握ES机器人拖动视角操作掌握ES机器人拖动轨迹记录 3. ES机器人拖动视角操作 3.1 操作步骤 点击“拖动视角”按钮长按“启用”键约3秒进入…...

免费开放试乘体验!苏州金龙自动驾驶巴士即将上线阳澄数谷
近日,苏州自动驾驶巴士线路——阳澄数谷示范线正式上线,即日起向全民免费开放试乘体验! 在苏州工业园区地铁3号线倪浜•阳澄数谷站外,一辆辆黑、白配色的小巴正在道路上有条不紊地行驶。与普通公交不同的是,小巴造型奇…...