2025-03-16
工具运维
0

目录

x-easypdf 是什么?
核心特性
简单易用
功能丰富
AI 加持
安装与配置
Maven 依赖
fop 模块
使用步骤
完整示例
pdfbox 模块
使用步骤
创建文档
编辑文档
使用 AI 解析文档内容
实际应用场景
总结

作为一名 Java 开发者,我在日常工作中经常需要处理 PDF 文档。无论是生成报告、合同,还是对现有 PDF 进行编辑,一个简单易用的工具能极大提升开发效率。今天给大家介绍一款 Java 语言简化处理 PDF 的框架——x-easypdf,它最近发布了具有 AI 加持的 3.3.0 版本,让我们一起来看看它的强大功能吧。

x-easypdf 是什么?

x-easypdf 是一个专为简化 PDF 处理而设计的 Java 框架,提供了一套简单易用的 API 接口。它包含两个核心模块:

  • fop 模块:专注于 PDF 文档创建,基于 xsl-fo 模板生成 PDF 文档,支持多种数据源进行模板渲染

  • pdfbox 模块:专注于 PDF 文档编辑,在标准的 Apache PDFBox 基础上进行扩展,添加了大量实用功能

在 3.3.0 版本中,x-easypdf 更是加入了 AI 能力,可以智能解析文档内容,为 PDF 处理带来了全新可能。

官网地址:https://x-easypdf.cn/

项目地址:https://gitee.com/dromara/x-easypdf

Mavan仓库:https://central.sonatype.com/artifact/org.dromara/x-easypdf/overview

fop 模块与 pdfbox 模块如何选择?

fop 模块基于 xsl-fo 模板生成 pdf 文档,仅适用于文档创建。 pdfbox 模块支持文档的创建、解析、提取与处理,适用范围更广。

核心特性

简单易用

x-easypdf 的设计理念就是简化 PDF 操作流程,仅需一行代码,便可完成多种 PDF 操作。它通过组件化的形式进行 PDF 构建,极大降低了使用门槛。

功能丰富

  • 创建 PDF 文档:轻松创建新的 PDF 文档

  • 编辑 PDF 文档:添加文本、图像、表格等元素

  • 操作 PDF 文档:支持合并、分割、加密和解密 PDF 文档

  • 生成 PDF 表单:创建包含可填写字段的 PDF 表单

  • 自动换行与分页:当内容超过页面宽度或高度时自动处理

  • 内置中文支持:支持华为鸿蒙字体,中文处理更加自然

AI 加持

3.3.0 版本新增了大模型解析文档的支持,包括:

  • 月之暗面(Kimi)AI 解析器

  • 讯飞(Spark)AI 解析器

  • 腾讯 AI 解析器

这些 AI 功能可以智能解析 PDF 中的文本和图像内容,实现更高级的文档处理能力。

安装与配置

Maven 依赖

根据需求,可以选择引入全功能模块或特定模块:

全功能模块(pdfbox + fop)

xml
<dependency> <groupId>org.dromara</groupId> <artifactId>x-easypdf</artifactId> <version>版本号</version> </dependency>

仅 pdfbox 模块

xml
<dependency> <groupId>org.dromara</groupId> <artifactId>x-easypdf-pdfbox</artifactId> <version>版本号</version> </dependency>

仅 fop 模块

xml
<dependency> <groupId>org.dromara</groupId> <artifactId>x-easypdf-fop</artifactId> <version>版本号</version> </dependency>

fop 模块

使用步骤

以 freemarker 数据源为例

  1. 添加数据源依赖
xml
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>版本号</version> </dependency>
  1. 创建模板对象
java
Template template = TemplateHandler.Template.build();
  1. 设置 fop 配置文件路径
java
template.setConfigPath(configPath);
  1. 设置数据源,并设置 xsl-fo 模板路径与模板数据
java
template.setDataSource( TemplateHandler.DataSource.Freemarker.build() .setTemplateName("template.fo") .setTemplateData(data) );
  1. 执行转换
template.transform(outputPath);

完整示例

以 freemarker 数据源为例

java
// 定义fop配置文件路径 String configPath = "E:\\pdf\\template\\fop.xconf"; // 定义xsl-fo模板路径(目录) String templatePath = "E:\\pdf\\template\\freemarker"; // 定义pdf输出路径 String outputPath = "E:\\pdf\\test\\fo\\Freemarker.pdf"; // 设置模板路径 TemplateHandler.DataSource.Freemarker.setTemplatePath(templatePath); // 定义数据map Map<String, Object> data = new HashMap<>(); // 定义数据list List<String> list = new ArrayList<>(2); list.add("hello"); list.add("world"); // 设置值 data.put("list", list); data.put("str", "hello world"); // 转换pdf TemplateHandler.Template.build().setConfigPath(configPath).setDataSource( // 构建数据源 TemplateHandler.DataSource.Freemarker.build() // 设置模板名称(模板路径下的文件名称) .setTemplateName("template.fo") // 设置模板数据 .setTemplateData(data) ).transform(outputPath);

fop 配置文件

xml
<?xml version="1.0"?> <!-- fop版本 --> <fop version="1.0"> <!-- 当前路径(项目所在路径) --> <base>.</base> <!-- 默认源图像 dpi(每英寸点数像素) --> <source-resolution>72</source-resolution> <!-- 默认目标图像 dpi(每英寸点数像素),默认: 72dpi --> <target-resolution>72</target-resolution> <!-- 默认页面宽度与高度(A4) --> <default-page-settings width="21cm" height="29.7cm"/> <!-- 渲染器 --> <renderers> <!-- pdf 渲染器 --> <renderer mime="application/pdf"> <!-- 过滤器 --> <filterList> <!-- 默认使用 flate 依赖压缩 --> <value>flate</value> </filterList> <!-- 字体 --> <fonts> <!-- 自动扫描系统全部字体 --> <auto-detect/> </fonts> </renderer> </renderers> </fop>

xsl-fo 配置文件

xml
<?xml version="1.0" encoding="utf-8"?> <!--根标签--> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <!--页面模板--> <fo:layout-master-set> <!--单页面模板--> <fo:simple-page-master master-name="A4"> <!--页面区域主体--> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <!--页面序列--> <fo:page-sequence master-reference="A4"> <!--页面流--> <fo:flow flow-name="xsl-region-body"> <#list list as data> <fo:block>${data}</fo:block> </#list> <#if str??> <fo:block>${str}</fo:block> <#else> <fo:block font-family="微软雅黑">为空</fo:block> </#if> </fo:flow> </fo:page-sequence> </fo:root>

提示

使用中文时,需设置支持中文的字体名称

pdfbox 模块

使用步骤

创建文档

以添加文本为例

  1. 创建文档对象
java
Document document = PdfHandler.getDocumentHandler().create();
  1. 创建页面对象
java
Page page = new Page(document);
  1. 创建组件对象
java
Textarea textarea = new Textarea(page);
  1. 渲染组件
java
textarea.render();
  1. 添加页面
java
document.appendPage(page);
  1. 保存文档
java
document.save(outputPath);
  1. 关闭文档
java
document.close();

完整示例

java
// 定义pdf输出路径 String outputPath = "E:\\PDF\\pdfbox\\test.pdf"; // 创建文档 Document document = PdfHandler.getDocumentHandler().create(); // 设置字体 document.setFontName("微软雅黑"); // 创建页面 Page page = new Page(document); // 创建文本域 Textarea textarea = new Textarea(page); // 设置文本 textarea.setText("Hello World!"); // 渲染文本 textarea.render(); // 添加页面 document.appendPage(page); // 保存文档 document.save(outputPath); // 关闭文档 document.close();

编辑文档

以第一页添加文本为例

  1. 读取文档
java
Document document = PdfHandler.getDocumentHandler().load(sourcePath);
  1. 获取页面对象
java
Page page = document.getPage(0);
  1. 创建组件对象
java
Textarea textarea = new Textarea(page);
  1. 渲染组件
java
textarea.render();
  1. 保存文档
java
document.save(outputPath);
  1. 关闭文档
java
document.close();

完整示例

java
// 定义pdf源路径 String sourcePath = "E:\\PDF\\pdfbox\\test.pdf"; // 定义pdf输出路径 String outputPath = "E:\\PDF\\pdfbox\\newTest.pdf"; // 读取文档 Document document = PdfHandler.getDocumentHandler().load(sourcePath); // 获取页面 Page page = document.getPage(0); // 创建文本域 Textarea textarea = new Textarea(page); // 设置X轴起始坐标 textarea.setBeginX(100F); // 设置Y轴起始坐标 textarea.setBeginY(100F); // 设置文本 textarea.setText("Hello World!"); // 渲染文本 textarea.render(); // 保存文档 document.save(outputPath); // 关闭文档 document.close();

实战

  1. 基础 PDF 创建
java
// 创建文档 Document document = PdfHandler.getDocumentHandler().create(); // 设置使用字体 document.setFontName("微软雅黑"); // 创建页面 Page page = new Page(document); // 创建文本域 Textarea textarea = new Textarea(page); // 设置文本 textarea.setText("Hello World!"); // 渲染文本 textarea.render(); // 添加页面 document.appendPage(page); // 保存文档 /Users/zhangni/liushiGong // 关闭文档 document.close();
  1. 多张图片合并为 PDF
java
public static File imagesToPdf(List<File> imageFiles, File targetPdfFilePath) { if (CollUtil.isNotEmpty(imageFiles) && targetPdfFilePath != null) { XEasyPdfDocument document = XEasyPdfHandler.Document.build(); imageFiles.stream().forEachOrdered(imageFile -> { XEasyPdfComponent xEasyPdfImage = toEasyPdfImage(imageFile); XEasyPdfPage newPage = customNewPageByImage(imageFile); newPage.addComponent(xEasyPdfImage); document.addPage(newPage); }); document.save(new FileOutputStream(targetPdfFilePath)).close(); return targetPdfFilePath; } return null; }

使用 AI 解析文档内容

3.3.0 版本的 AI 功能为文档解析带来了革命性变化:

java
// 解析图像示例 @Test public void parseImageWithPageTest() { String ak = System.getenv("ak"); String sk = System.getenv("sk"); Document document = PdfHandler.getDocumentHandler().load("E:\\\\PDF\\\\pdfbox\\\\allTest.pdf"); TencentAIParser parser = PdfHandler.getDocumentAIParser(document).getTencentAI(ak, sk, false); AIParseInfo info = parser.parseImageWithPage( "根据'这是一张XXX地点XXX的图片'的格式描述图片展示的内容,说出具体的城市,使用中文回答", 0, 1 ); log.info("返回内容:\n" + info.getResult()); document.close(); } // 解析文本示例 @Test public void parseTextWithDocumentTest() { String ak = System.getenv("ak"); String sk = System.getenv("sk"); Document document = PdfHandler.getDocumentHandler().load("E:\\PDF\\pdfbox\\allTest.pdf"); TencentAIParser parser = PdfHandler.getDocumentAIParser(document).getTencentAI(ak, sk, true); AIParseInfo info = parser.parseTextWithDocument("提取表格内容,以json格式返回"); log.info("返回内容:\n" + info.getResult()); document.close(); }

实际应用场景

x-easypdf 在实际应用中能帮助开发人员快速构建和编辑 PDF 文件,特别适用于以下场景:

  • 生成大量 PDF 文档:如报表、合同等文档

  • 数据分析报告:自动化生成标准化的分析报告

  • 运维巡检报告:定期生成系统巡检文档

  • 资源统计报告:将资源数据可视化输出

  • 性能测试报告:自动化生成测试结果报告

总结

x-easypdf 作为一款 高效易用的 PDF 构建工具,通过简化 PDF 操作流程,提供了丰富的 API 接口和功能。3.3.0 版本加入的 AI 能力 更是让其如虎添翼,为 PDF 文档处理开辟了新的可能性。

主要优势:

  • 简单易用的 API 设计,降低学习成本

  • 组件化架构,灵活扩展

  • 强大的模板支持,满足多样化需求

  • AI 加持,智能解析文档内容

  • 活跃的社区和持续的更新

如果你正在寻找一个功能强大、易于使用的 Java PDF 处理方案,x-easypdf 绝对值得一试。无论是简单的文档生成,还是复杂的批量处理,它都能成为你开发工作中的得力助手。

本文作者:柳始恭

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!