目录
PDF文档中的信息随时间的推移可能会发生变化,比如产品价格、联系方式等。为了确保PDF文档保持最新,我们需要对这些信息进行更新。通过编程方式替换PDF中的相应文字,可以实现批量化处理,大大提高工作效率。这篇博客将探讨几种使用Java在PDF中替换文字的不同方式,以及可能出现的问题和解决方案。
在PDF中替换文字,可以使用Spire.PDF for Java库。
Spire.PDF for Java是一款专门为Java开发人员设计的PDF文档处理库。它支持在Java应用程序中创建、读取、编辑、转换和打印PDF文档。你可以使用以下代码来从Maven仓库安装它:
-
-
com.e-iceblue -
e-iceblue -
https://repo.e-iceblue.cn/repository/maven-public/ -
-
-
e-iceblue -
spire.pdf -
10.6.2 -
Spire.PDF for Java提供了PdfTextReplacer.replaceAllText()方法,支持替换PDF页面中特定文字的所有实例。具体步骤如下:
- import com.spire.pdf.PdfDocument;
- import com.spire.pdf.PdfPageBase;
- import com.spire.pdf.texts.PdfTextReplacer;
-
- public class ReplaceAllFoundText {
- public static void main(String[] args) {
- // 创建PdfDocument类的实例
- PdfDocument pdf = new PdfDocument();
- // 加载PDF文件
- pdf.loadFromFile("什么是Python.pdf");
-
- // 遍历PDF文件的页面
- for (PdfPageBase page : (Iterable extends PdfPageBase>) pdf.getPages()) {
- // 创建PdfTextReplacer类的实例,并将当前页面对象作为参数传递至该类的构造函数
- PdfTextReplacer textReplacer = new PdfTextReplacer(page);
- // 将当前页面上的特定文本的所有实例替换为新文本
- textReplacer.replaceAllText("Python", "Golang");
- }
-
- // 将结果文件保存为一个新的PDF
- pdf.saveToFile("替换所有实例.pdf");
- pdf.close();
- }
- }
要替换PDF页面中特定文字的第一个实例,可以使用PdfTextReplacer.replaceText() 方法。具体步骤如下:
- import com.spire.pdf.PdfDocument;
- import com.spire.pdf.PdfPageBase;
- import com.spire.pdf.texts.PdfTextReplacer;
-
- public class ReplaceFirstFoundText {
- public static void main(String[] args) {
- // 创建PdfDocument类的实例
- PdfDocument pdf = new PdfDocument();
- // 加载PDF文件
- pdf.loadFromFile("什么是Python.pdf");
-
- // 遍历PDF文件的页面
- for (PdfPageBase page : (Iterable extends PdfPageBase>) pdf.getPages()) {
- // 创建PdfTextReplacer类的实例,并将当前页面对象作为参数传递至该类的构造函数
- PdfTextReplacer textReplacer = new PdfTextReplacer(page);
- // 将当前页面上的特定文本的第一个实例替换为新文本
- textReplacer.replaceText("Python", "Golang");
- }
-
- // 将结果文件保存为一个新的PDF
- pdf.saveToFile("替换第一个实例.pdf");
- pdf.close();
- }
- }
Spire.PDF for Java提供了PdfTextReplaceOptions类,用于指定文字替换模式。你可以通过该类的setReplaceType() 方法指定文本替换模式为使用正则表达式替换。然后使用 PdfTextReplacer.setOptions() 方法应用该文字替换模式。具体步骤如下:
- import com.spire.pdf.PdfDocument;
- import com.spire.pdf.PdfPageBase;
- import com.spire.pdf.texts.PdfTextReplaceOptions;
- import com.spire.pdf.texts.PdfTextReplacer;
- import com.spire.pdf.texts.ReplaceActionType;
-
- import java.util.EnumSet;
-
- public class ReplaceTextWithRegex {
- public static void main(String[] args) {
- // 创建PdfDocument类的实例
- PdfDocument pdf = new PdfDocument();
- // 加载PDF文件
- pdf.loadFromFile("模板.pdf");
-
- // 创建PdfTextReplaceOptions类的实例,并指定文本替换模式为使用正则表达式替换
- PdfTextReplaceOptions replaceOptions = new PdfTextReplaceOptions();
- replaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.Regex));
-
- // 遍历PDF文件的页面
- for (PdfPageBase page : (Iterable extends PdfPageBase>) pdf.getPages()) {
- // 创建PdfTextReplacer类的实例,并将当前页面对象作为参数传递至该类的构造函数
- PdfTextReplacer textReplacer = new PdfTextReplacer(page);
- // 应用正则表达式替换模式
- textReplacer.setOptions(replaceOptions);
-
- // 设置正则表达式来匹配以 “#” 开头的文本
- String regularExpression = "\\#\\w+\\b";
- // 将页面上正则表达式匹配到的文本替换为新文本
- textReplacer.replaceAllText(regularExpression, "显示器");
- }
-
- // 将结果文件保存为一个新的PDF
- pdf.saveToFile("正则表达式替换.pdf");
- pdf.close();
- }
- }
Spire.PDF for Java还支持设置其他替换条件,如不区分大小写和全词匹配。具体代码如下:
- import com.spire.pdf.PdfDocument;
- import com.spire.pdf.PdfPageBase;
- import com.spire.pdf.texts.PdfTextReplaceOptions;
- import com.spire.pdf.texts.PdfTextReplacer;
- import com.spire.pdf.texts.ReplaceActionType;
-
- import java.util.EnumSet;
-
- public class OtherReplacementSettings {
- public static void main(String[] args) {
- // 创建PdfDocument类的实例
- PdfDocument pdf = new PdfDocument();
- // 加载PDF文件
- pdf.loadFromFile("什么是Python.pdf");
-
- // 创建PdfTextReplaceOptions类的实例,并指定文本替换模式为不区分大小写或全词匹配
- PdfTextReplaceOptions replaceOptions = new PdfTextReplaceOptions();
- replaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.IgnoreCase));
- replaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.WholeWord));
-
- // 遍历PDF文件的页面
- for (PdfPageBase page : (Iterable extends PdfPageBase>) pdf.getPages()) {
- // 创建PdfTextReplacer类的实例,并将当前页面对象作为参数传递至该类的构造函数
- PdfTextReplacer textReplacer = new PdfTextReplacer(page);
- // 应用文本替换模式
- textReplacer.setOptions(replaceOptions);
-
- // 将页面上特定文本替换为新文本
- textReplacer.replaceAllText("Python", "Golang");
- }
-
- // 将结果文件保存为一个新的PDF
- pdf.saveToFile("其他替换条件.pdf");
- pdf.close();
- }
- }
当使用 PdfTextReplacer类的方法进行文本替换时,默认情况下,替换后的新文本会使用PDF文档中原始文本的字体来绘制。如果原始文本所使用的字体不支持新文本所使用的语言,那么新文本就无法正确地显示出来。这种情况通常会出现在需要替换不同语言的文本时。比如,原文是英文,需要替换为中文,但是英文字体可能不支持显示中文字符。为解决这个问题,可以考虑以下2种方法:
- import com.spire.pdf.*;
- import com.spire.pdf.graphics.*;
- import com.spire.pdf.texts.*;
-
- import java.awt.*;
- import java.awt.geom.Rectangle2D;
- import java.util.List;
-
- public class ReplaceTextByDrawingRectangle {
- public static void main(String[] args) {
- // 创建PdfDocument类的实例
- PdfDocument pdf = new PdfDocument();
- // 加载PDF文件
- pdf.loadFromFile("Adobe Acrobat.pdf");
-
- // 定义字体(如果字体已安装在系统中)
- PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋体", Font.PLAIN, 11));
- // 如果字体未安装在系统中,使用以下代码
- // PdfTrueTypeFont font = new PdfTrueTypeFont("字体文件.ttf", 11);
-
- PdfStringFormat format = new PdfStringFormat();
- format.setLineLimit(false);
-
- List
results = null; - // 遍历PDF文件的页面
- for (PdfPageBase page : (Iterable extends PdfPageBase>) pdf.getPages()) {
- // 创建 PdfTextFinder 实例
- PdfTextFinder finder = new PdfTextFinder(page);
- // 查找特定文本
- results = finder.find("Adobe Acrobat");
- // 遍历找到的所有实例
- for (PdfTextFragment text : results) {
- // 获取文本所在的矩形区域
- Rectangle2D rect = text.getBounds()[0];
- // 在该区域画一个新的矩形覆盖原来的文本
- page.getCanvas().drawRectangle(PdfBrushes.getWhite(), rect);
- // 在新的矩形中绘制新文本
- page.getCanvas().drawString("PDF编辑器", font, PdfBrushes.getDarkBlue(), rect, format);
- }
- }
-
- // 将结果文件保存为一个新的PDF
- pdf.saveToFile("覆盖文本.pdf");
- pdf.close();
- }
- }
以上就是使用Java在PDF中替换文字的全部内容。本文完结。