PDF 作为跨平台文档共享的标准格式,在企业级应用开发中具有不可替代的地位。在 Java 生态系统中,高效生成 PDF 文档是发票管理系统、财务报表工具、政务办公软件等各类应用的核心需求。本文将深入解析如何利用 Spire.PDF for Java 库在这三种典型场景下创建 PDF 文档:从零创建、基于模板或 HTML 内容生成。
- 了解 Spire.PDF for Java 库
- 基础概念: PDF 坐标系
- 使用 Java 生成一个简单的 PDF 文档
- 使用 Java 基于模板创建 PDF 文档
- 使用 Java 从 HTML 生成 PDF 文档
- 常见问题(FAQ)
- 结论
了解 Spire.PDF for Java 库
Spire.PDF for Java 是一款高效的 PDF 处理库,无需依赖 Adobe 软件即可实现 PDF 生成,其核心特性包括:
- 跨平台兼容:完美支持 Windows、Linux、macOS 系统。
- 丰富的 PDF 元素:支持添加文本、图片、表格、列表及条形码等。
- 高级安全功能:可设置密码保护、数字签名和 PDF 权限控制。
- 易于集成:与 Java SE 和 EE 环境深度适配。
安装 Java PDF 库
要开始在 Java 中创建 PDF 文档,首先需要将 Spire.PDF for Java 添加到项目中。可从 E-iceblue 官网下载 JAR 文件,或通过 Maven 依赖引入:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>11.7.5</version>
</dependency>
</dependencies>
基础概念: PDF 坐标系
在 Spire.PDF for Java 中,坐标位置决定了元素(文本、图片、形状)在 PDF 页面上的位置。规则如下:
- 原点(0,0):坐标系的原点位于内容区域的左上角。
- X 轴:从左向右水平延伸。
- Y 轴:从上向下垂直延伸。
使用 Java 生成一个简单的 PDF 文档
先从一个简单的示例开始,创建一个仅包含文本的 PDF 文档。Spire.PDF for Java 提供两种文本绘制方式,满足不同场景需求:
- PdfCanvas.drawString():在指定坐标处绘制单行文本。适用于标题、标签或短文本片段。
- PdfTextWidget.draw():用于绘制多行文本,具有自动换行和分页功能。适用于段落、长文本内容。
以下是创建 PDF 文档的 Java 代码:
import com.spire.pdf.*;
import com.spire.pdf.graphics.*;
import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
public class CreatePdfDocument {
public static void main(String[] args) {
// 创建一个 PdfDocument 对象
PdfDocument doc = new PdfDocument();
// 添加一个具有指定大小和边距的页面
PdfPageBase page = doc.getPages().add(PdfPageSize.A4, new PdfMargins(35f));
// 指定页面内容
String titleText = "产品简介";
String paraText = "Spire.PDF for Java 是一款专门对 PDF 文档进行操作的 Java 类库。" +
"该类库的主要功能在于帮助开发人员在 Java 应用程序(J2SE 和 J2EE)中生成 PDF 文档和操作现有 PDF 文档," +
"并且运行环境无需安装 Adobe Acrobat。同时兼容大部分国产操作系统," +
"能够在中标麒麟和中科方德等国产操作系统中正常运行。";
// 创建笔刷和字体
PdfSolidBrush titleBrush = new PdfSolidBrush(new PdfRGBColor(Color.BLUE));
PdfSolidBrush paraBrush = new PdfSolidBrush(new PdfRGBColor(Color.BLACK));
PdfTrueTypeFont titleFont = new PdfTrueTypeFont(new Font("宋体",Font.BOLD,18));
PdfTrueTypeFont paraFont = new PdfTrueTypeFont(new Font("宋体",Font.PLAIN,12));
// 设置文本对齐方式
PdfStringFormat format = new PdfStringFormat();
format.setAlignment(PdfTextAlignment.Center);
// 在页面上绘制标题
page.getCanvas().drawString(titleText, titleFont, titleBrush, new Point2D.Float((float)page.getClientSize().getWidth()/2, 40),format);
// 创建一个 PdfTextWidget 对象来容纳段落内容
PdfTextWidget widget = new PdfTextWidget(paraText, paraFont, paraBrush);
// 创建一个矩形,段落内容将放置在其中
Rectangle2D.Float rect = new Rectangle2D.Float(0, 70, (float)page.getClientSize().getWidth(),(float)page.getClientSize().getHeight());
// 设置内容自动分页
PdfTextLayout layout = new PdfTextLayout();
layout.setLayout(PdfLayoutType.Paginate);
// 在页面上绘制段落文本
widget.draw(page, rect, layout);
// 保存 PDF 文件
doc.saveToFile("创建PDF.pdf");
doc.dispose();
}
}
上述代码生成的 PDF 包含:
- 居中显示的标题
- 自动分页的正文段落(内容超出页面时自动拆分)
生成的 PDF 文件:
除了简单的文本,你还可以向 PDF 中添加其他元素,例如:
在 PDF 中添加图片
在 PDF 页面的指定位置添加JPG、PNG 等格式图片,代码示例:
// 加载图片文件
PdfImage image = PdfImage.fromFile("image.jpg");
// 缩放图片(原尺寸的 50%)
float width = image.getWidth() * 0.50f;
float height = image.getHeight() * 0.50f;
// 在页面指定位置绘制图片
page.getCanvas().drawImage(image, 100f, 60f, width, height);
在 PDF 中创建表格
表格功能适合数据展示,常用于报告生成,代码示例:
// 初始化表格
PdfTable table = new PdfTable();
// 定义表格数据
String[] data = {"洲;国家;人口;世界人口占比;国旗",
"亚洲;中国;1,391,190,000;18.2%; ",
"亚洲;日本;126,490,000;1.66%; ",
"欧洲;英国;65,648,054;0.86%; ",
"欧洲;德国;82,665,600;1.08%; ",
"北美洲; 加拿大; 37,119,000; 0.49%; ",
"北美洲; 美国; 327,216,000; 4.29%; "
};
String[][] dataSource = new String[data.length][];
for (int i = 0; i < data.length; i++) {
dataSource[i] = data[i].split("[;]", -1);
}
// 绑定数据并配置表头
table.setDataSource(dataSource);
table.getStyle().setHeaderSource(PdfHeaderSource.Rows);
table.getStyle().setHeaderRowCount(1);
table.getStyle().setShowHeader(true);
// 在页面指定位置绘制表格
table.draw(page, new Point2D.Float(0, 30));
使用 Java 基于模板创建 PDF 文档
这段 Java 代码演示了如何通过动态替换预先设计的 PDF 模板中的占位符来生成 PDF 文档。常见的应用场景包括生成电子邮件、报告、发票或合同。
import com.spire.pdf.*;
import com.spire.pdf.texts.PdfTextReplaceOptions;
import com.spire.pdf.texts.PdfTextReplacer;
import com.spire.pdf.texts.ReplaceActionType;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;
public class GeneratePdfFromTemplate
{
public static void main(String[] args)
{
// 创建一个 PdfDocument 对象
PdfDocument pdf = new PdfDocument();
// 加载模板文件
pdf.loadFromFile("模板.pdf");
// 创建一个 PdfTextReplaceOptions 对象
PdfTextReplaceOptions textReplaceOptions = new PdfTextReplaceOptions();
// 配置替换规则(忽略大小写、全字匹配)
textReplaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.IgnoreCase));
textReplaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.WholeWord));
// 获取第一页
PdfPageBase page = pdf.getPages().get(0);
// 创建一个 PdfTextReplacer 对象
PdfTextReplacer textReplacer = new PdfTextReplacer(page);
// 设置替换选项
textReplacer.setOptions(textReplaceOptions);
// 定义占位符与替换值映射
Map<String, String> replacements = new HashMap<>();
replacements.put("{姓名}", "张三");
replacements.put("{日期}", "2023-10-05");
replacements.put("{号码}", "510001265");
replacements.put("{地址}", "北京市朝阳区");
// 执行批量替换
for (Map.Entry<String, String> entry : replacements.entrySet())
{
textReplacer.replaceAllText(entry.getKey(), entry.getValue());
}
// 保存结果
pdf.saveToFile("基于模板生成PDF.pdf");
pdf.dispose();
}
}
核心方法:
- PdfTextReplaceOptions:定义替换规则(不区分大小写、全字匹配等)。
- PdfTextReplacer:表示 PDF 页面上的文本替换操作。
- replaceAllText():批量替换文档中所有匹配的占位符。
输出文件:
使用 Java 从 HTML 生成 PDF 文档
Spire.PDF for Java 还提供了直接的 API 接口用于将网页 URL、本地 HTML 文件或 HTML 字符串转换为 PDF 文件。详细的实现教程请参考:
Java 将 HTML 转换为 PDF – 网页 URL、 HTML 字符串及文件
通过掌握 HTML 到 PDF 的转换,Java 开发人员可以从网页模板自动生成发票、报告,或者将网页存档为可搜索的 PDF 文档。
常见问题(FAQs)
问题 1:Spire.PDF for Java 是免费的吗?
答:Spire.PDF for Java 提供商业版和免费版(有使用限制)。你可以申请 30 天免费试用授权来测试商业版,没有任何限制。
问题 2:支持绘制其他语言吗(如英文、日语)?
答:支持,使用目标语言对应的字体即可。例如:
// 要显示英文,使用像 “Calibri” 或 “Times New Roman” 这样的字体
PdfTrueTypeFont titleFont = new PdfTrueTypeFont(new Font("Times New Roman",Font.BOLD,18));
// 要显示日语文本,使用像 “MS Gothic” 或 “Yu Gothic” 这样的字体
PdfTrueTypeFont font = new PdfTrueTypeFont (new Font ("MS Gothic", Font.PLAIN, 12));
问题 3:如何加密生成的 PDF 文档?
答:设置打开密码和权限密码:
// 创建一个PdfPasswordSecurityPolicy 对象,并传入打开密码和权限密码
PdfSecurityPolicy securityPolicy = new PdfPasswordSecurityPolicy ("openPwd", "permissionPwd");
// 设置加密算法为 AES 256 位
securityPolicy.setEncryptionAlgorithm (PdfEncryptionAlgorithm.AES_256);
// 对 PDF 文件进行加密
pdf.encrypt (securityPolicy);
结论
Spire.PDF for Java 为 PDF 生成提供了灵活高效的解决方案,无论是基础文档、模板替换还是 HTML 转换场景均能胜任。通过本文示例,开发者可快速在 Java 项目中集成专业级 PDF 生成功能,提升文档处理效率。