在现代软件开发中,PDF 文件的操作已经成为许多业务场景中的一个重要需求。无论是生成发票、合同还是报告标签等,PDF 文件都以其稳定的格式和良好的可移植性,成为企业日常工作中不可或缺的一部分。但是这次接到的业务是由别人提供而来的pdf进行编辑替换文本,或者移除指定字段数据。这篇博客重点介绍使用aspose库来简单实现替换(编辑)文本。
提供上手即用的工具方法,提供操作步骤,代码实例,助你一臂之力。也可以私信探讨,会持续分享自己有收获的业务+技术,可以关注我,总会用得到。
1.1 开发效率
在业务中,时间就是金钱。使用第三方库如 Aspose,可以大大提高开发效率。Aspose 提供了丰富的 API,使我们可以轻松处理 PDF 文件的创建、修改和转换,而不必从头编写复杂的代码。我们项目其实已经引入了itextpdf但是查阅了下未找到合适的api操作,故决定引入更方便,全面的库操作。
1.2 功能强大
Aspose 库提供了丰富的功能,包括:
- 文本和图像的操作
- 页面内容的修改
- 表单的填充
- PDF 的合并与拆分
- 文件格式的转换
这些功能能够满足我们在业务中几乎所有的 PDF 操作需求。
2. 业务场景
2.1 案例背景
这里简化一下我的业务,就是物流入库需要目的仓库提供的标签(pdf),类似于箱唛(可见下图),但是其在进行报关时由于显示了公司名,个别原因有些风险,故需要屏蔽掉。这里直接提供了一个简易版本,也就是替换掉下图的ID:后面的值,我这里将其文本替换为我指定的值,也可以为空等。
3. 代码示例
以下是一个使用 Aspose 创建 PDF 文件的简单示例代码:
package com.oms.common.utils;
//导入必要的类
import com.aspose.pdf.*;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class AsposePdfUtils {
public static void main(String[] args) throws Exception {
//提取文本
// 打开现有的 PDF 文档
Document pdfDocument = new Document("D:\\wangshenao\\Desktop\\Shipment-32049652-Box-bag-label.pdf");
// 创建 TextAbsorber 对象
TextAbsorber textAbsorber = new TextAbsorber();
// 接受所有页面的吸收器
for (int page = 1; page <= pdfDocument.getPages().size(); page++) {
pdfDocument.getPages().get_Item(page).accept(textAbsorber);
}
// 提取文本
String extractedText = textAbsorber.getText();
System.out.println("提取的文本:");
System.out.println(extractedText);
// String idPattern = "(ID:\\s*\\d+)\\s*(.*)"; // 匹配ID和后面的内容
String idPattern = "(ID:\\s*\\d+)\\s*([^\s]*)"; // 匹配ID及其后面的数字,遇到空格或换行停止
Pattern pattern = Pattern.compile(idPattern);
Matcher matcher = pattern.matcher(extractedText);
// 存储找到的ID及其后面的内容
List<String> matchedIds = new ArrayList<>();
while (matcher.find()) {
String id = matcher.group(1); // 获取 ID
matchedIds.add(id); // 将后面的内容添加到列表中
System.out.println("找到的 ID: " + id);
}
// 替换 ID 的过程
for (String newId : matchedIds) {
// 创建 TextFragmentAbsorber 对象,用于吸收文本
System.out.println("newId = " + newId);
TextFragmentAbsorber textAbsorber2 = new TextFragmentAbsorber(newId);
// 处理每一页
for (int page = 1; page <= pdfDocument.getPages().size(); page++) {
// 在当前页中接受 TextAbsorber
pdfDocument.getPages().get_Item(page).accept(textAbsorber2);
// 获取文本片段并替换每个找到的文本片段
for (TextFragment textFragment : textAbsorber2.getTextFragments()) {
textFragment.setText("ID: 10000"); // 替换为新ID
}
}
}
// 保存修改后的 PDF
pdfDocument.save("D:\\wangshenao\\Desktop\\modified_Shipment50.pdf");
System.out.println("ID 值已成功替换。");
}
}
3.1 代码说明
- 导入依赖,可从官网
PDF 页面操作 |Aspose.PDF Java PDF 处理 API
下载,也可以从阿里云导入maven依赖。
<dependency>
<groupId>com.luhuiguo</groupId>
<artifactId>aspose-pdf</artifactId>
<version>23.1</version>
</dependency>
- 提取,其实我这里多了一步提取功能,也就是把里面的文本信息都给提取了出来,然后正则匹配,是能适配各种场景,不知道里面是什么值,只知道label,但如果你知道要替换的值,可以直接进行替换,不需要提取再替换,下面代码上手即用,可作为工具类。
public static InputStream replaceText(String labelsUrl, String str, String newStr) throws Exception {
InputStream inputStream = toInputStream(labelsUrl);
// 打开现有的 PDF 文档
Document pdfDocument = new Document(inputStream);
// 创建 TextFragmentAbsorber 对象,用于吸收文本
TextFragmentAbsorber textAbsorber = new TextFragmentAbsorber(str);
// 处理每一页
for (int page = 1; page <= pdfDocument.getPages().size(); page++) {
// 在当前页中接受 TextAbsorber
pdfDocument.getPages().get_Item(page).accept(textAbsorber);
// 获取文本片段
// 替换每个找到的文本片段
for (TextFragment textFragment : textAbsorber.getTextFragments()) {
textFragment.setText(newStr);
}
}
return convertDocumentToInputStream(pdfDocument);
}
4. 总结
上述步骤如果遇到问题,或自己的业务场景,可以在下面一起分析实现,一群人抱团!!会持续分享工作中遇到的业务及技术,可以关注一起探讨。(偷感很重的小猿)