当前位置: 首页 > news >正文

Java 在PDF中替换文字(详解)

目录

使用工具

Java在PDF中替换特定文字的所有实例

Java在PDF中替换特定文字的第一个实例

Java在PDF中使用正则表达式替换特定文字

其他替换条件设置

可能出现的问题及解决方案


PDF文档中的信息随时间的推移可能会发生变化,比如产品价格、联系方式等。为了确保PDF文档保持最新,我们需要对这些信息进行更新。通过编程方式替换PDF中的相应文字,可以实现批量化处理,大大提高工作效率。这篇博客将探讨几种使用Java在PDF中替换文字的不同方式,以及可能出现的问题和解决方案。

使用工具

在PDF中替换文字,可以使用Spire.PDF for Java库。

Spire.PDF for Java是一款专门为Java开发人员设计的PDF文档处理库。它支持在Java应用程序中创建、读取、编辑、转换和打印PDF文档。你可以使用以下代码来从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>10.6.2</version></dependency>
</dependencies>

Java在PDF中替换特定文字的所有实例

Spire.PDF for Java提供了PdfTextReplacer.replaceAllText()方法,支持替换PDF页面中特定文字的所有实例。具体步骤如下:

  • 创建PdfDocument类的实例。
  • 使用PdfDocument.loadFromFile()方法加载PDF文档。
  • 遍历PDF文档中的页面。
  • 为每个页面创建一个PdfTextReplacer实例,并将当前页面对象作为参数传入该类的构造函数。
  • 使用PdfTextReplacer.replaceAllText()方法将页面上特定文字的所有实例替换为新文字。
  • 使用PdfDocument.saveToFile() 方法保存结果文档。
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");}// 将结果文件保存为一个新的PDFpdf.saveToFile("替换所有实例.pdf");pdf.close();}
}

Python 替换PDF中特定文本的所有实例

Java在PDF中替换特定文字的第一个实例

要替换PDF页面中特定文字的第一个实例,可以使用PdfTextReplacer.replaceText() 方法。具体步骤如下:

  • 创建PdfDocument类的实例。
  • 使用PdfDocument.loadFromFile()方法加载PDF文档。
  • 遍历PDF文档中的页面。
  • 为每个页面创建一个PdfTextReplacer实例,并将当前页面对象作为参数传入该类的构造函数。
  • 使用PdfTextReplacer.replaceText() 方法将页面上特定文字的第一个实例替换为新文字。
  • 使用PdfDocument.saveToFile() 方法保存结果文档。
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");}// 将结果文件保存为一个新的PDFpdf.saveToFile("替换第一个实例.pdf");pdf.close();}
}

Java在PDF中使用正则表达式替换特定文字

Spire.PDF for Java提供了PdfTextReplaceOptions类,用于指定文字替换模式。你可以通过该类的setReplaceType() 方法指定文本替换模式为使用正则表达式替换。然后使用 PdfTextReplacer.setOptions() 方法应用该文字替换模式。具体步骤如下:

  • 创建PdfDocument类的实例。
  • 使用PdfDocument.loadFromFile()方法加载PDF文档。
  • 创建PdfTextReplaceOptions类的实例,并使用PdfTextReplaceOptions.setReplaceType() 方法指定文本替换模式为使用正则表达式替换。
  • 遍历PDF文档中的页面。
  • 为每个页面创建一个PdfTextReplacer实例,并将当前页面对象作为参数传入该类的构造函数。
  • 使用 PdfTextReplacer.setOptions() 方法应用正则表达式替换模式。
  • 将正则表达式和新文本作为参数传入PdfTextReplacer.replaceAllText()方法来将页面上正则表达式匹配到的文本替换为新文本。
  • 使用PdfDocument.saveToFile() 方法保存结果文档。
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, "显示器");}// 将结果文件保存为一个新的PDFpdf.saveToFile("正则表达式替换.pdf");pdf.close();}
}

Python 使用正则表达式替换PDF中的文本

其他替换条件设置

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");}// 将结果文件保存为一个新的PDFpdf.saveToFile("其他替换条件.pdf");pdf.close();}
}

可能出现的问题及解决方案

当使用 PdfTextReplacer类的方法进行文本替换时,默认情况下,替换后的新文本会使用PDF文档中原始文本的字体来绘制。如果原始文本所使用的字体不支持新文本所使用的语言,那么新文本就无法正确地显示出来。这种情况通常会出现在需要替换不同语言的文本时。比如,原文是英文,需要替换为中文,但是英文字体可能不支持显示中文字符。为解决这个问题,可以考虑以下2种方法:

  1. 文档使用能够兼容原文本和新文本的语言的字体。
  2. 采用另一种方法替换文本:通过在原始文本上绘制矩形覆盖它,然后在矩形内绘制新文本,注意这种方式不能保留原始文本的样式,需要自己设置新文本的样式,效果没有使用PdfTextReplacer方法好。具体代码如下:
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<PdfTextFragment> 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);}}// 将结果文件保存为一个新的PDFpdf.saveToFile("覆盖文本.pdf");pdf.close();}
}

以上就是使用Java在PDF中替换文字的全部内容。本文完结。

相关文章:

  • Google资深工程师深度讲解Go语言-课程笔记
  • 一个简单的springboot应用搭建过程
  • 第2部分:物联网模式在行动
  • Vue进阶之Vue无代码可视化项目(七)
  • 口袋奇兵游戏攻略:云手机辅助战锤入侵策略指南!
  • 防御综合实验作业2
  • Web开发:<br>标签的作用
  • 裸金属服务器
  • Java:Bean实体对象和Map互相转换
  • 内容长度不同的div如何自动对齐展示
  • C/C++蓝屏整人代码
  • npm install时报错 reason: certificate has expired
  • PCB(印制电路板)制造涉及的常规设备
  • 阿里云DSW实例中安装并运行Neo4J
  • 万界星空科技MES系统生产计划管理的功能
  • JavaScript-如何实现克隆(clone)函数
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Angular 2 DI - IoC DI - 1
  • avalon2.2的VM生成过程
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • dva中组件的懒加载
  • JAVA 学习IO流
  • JavaScript中的对象个人分享
  • Java小白进阶笔记(3)-初级面向对象
  • linux学习笔记
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • vue-router的history模式发布配置
  • 力扣(LeetCode)965
  • 使用Gradle第一次构建Java程序
  • 硬币翻转问题,区间操作
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 我们雇佣了一只大猴子...
  • 正则表达式-基础知识Review
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (3)llvm ir转换过程
  • (C)一些题4
  • (LeetCode 49)Anagrams
  • (poj1.2.1)1970(筛选法模拟)
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (未解决)macOS matplotlib 中文是方框
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .jks文件(JAVA KeyStore)
  • .md即markdown文件的基本常用编写语法
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net core 管理用户机密
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Micro Framework初体验
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)