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中替换文字的全部内容。本文完结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/46683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024可信数据库发展大会|存算分离架构驱动电信数据平台革新

7 月 16 日 - 17 日&#xff0c;由中国通信标准化协会和中国信息通信研究院主办&#xff0c;大数据技术标准推进委员会承办&#xff0c;InfoQ 联合主办的「2024 可信数据库发展大会」&#xff08;TDBC&#xff09;在北京召开。 酷克数据解决方案架构师吴昊受邀参与“电信行业数…

算法-计数质数

题目&#xff1a; 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 思路&#xff1a; 使用埃式筛法 当n大于等于2时&#xff0c;如果当前遍历的数 i 是质数&#xff0c;那么从 i*i 开始&#xff0c;直到 n 为止&#xff0c;把 i 的倍数都标记为合数 代码&a…

为什么提示词写作技能会让生成式AI工程师更上一层楼?

欢迎来到云闪世界。 “为什么我的经理对我的文章吹毛求疵&#xff1f;把措辞从 X 改为 Y 有什么区别&#xff1f;” 当你看到你的经理在你的文档中提出了无数建议时&#xff0c;你可能发现自己有这样的想法&#xff1b;我知道我有过。事实上&#xff0c;我曾经认为写作是数据科…

npm安装依赖包报错,npm ERR! code ENOTFOUND

一、报错现象&#xff1a; npm WARN registry Unexpected warning for https://registry.npmjs.org/: Miscellaneous Warning ETIMEDOUT: request to https://registry.npmjs.org/vue failed, reason: connect ETIMEDOUT 104.16.23.35:443 npm WARN registry Using stale data…

“点点通“餐饮点餐小程序-计算机毕业设计源码11264

"点点通"餐饮点餐小程序 XXX专业XX级XX班&#xff1a;XXX 指导教师&#xff1a;XXX 摘要 随着中国经济的飞速增长&#xff0c;消费者的智能化水平不断提高&#xff0c;许多智能手机和相关的软件正在得到更多的关注和支持。其中&#xff0c;微信的餐饮点餐小程序更…

《Exploring Aligned Complementary Image Pair for Blind Motion Deblurring》

这篇论文的标题《Exploring Aligned Complementary Image Pair for Blind Motion Deblurring》可以翻译为《探索对齐的互补图像对用于盲运动去模糊》。从标题可以推断,论文的焦点在于开发一种算法或技术,利用成对的图像来解决运动模糊问题,特别是在不知道模糊核(即造成模糊…

wifi preamble code, 前导码

WiFi packets 很神奇&#xff0c;自从802.11 协议诞生以来 就对信息传输 产生了无尽的影响&#xff0c; 闲来无事 看看wireless 空口包 发现 前导码 非常奇怪。 为什么前导码有两部分组成&#xff0c; 1. radiotap header 2. 802.11 radio information 并且 radiotap 是有在…

AIGC工具:IPAdapter和ControlNet 指导控制生成工具

ControlNet强调对生成过程的直接控制,如通过线条、边缘、形状等信息;而IPAdapter侧重于风格迁移和内容的间接引导。 IPAdapter 它专注于通过迁移图片风格来生成新的图像内容。IPAdapter的强项在于能够将一张图片的风格迁移到另一张图片上,实现风格融合,甚至可以进行多图风格…

CS110L(Rust)

1.Rust 语法总结 数值类型 有符号整数: i8, i16, i32, i64无符号整数: u8, u16, u32, u64 变量声明 声明变量: let i 0; // 类型推断let n: i32 1; // 显式类型声明 可变变量: let mut n 0; n n 1; 字符串 注意&#xff0c;let s: str "Hello world";…

React@16.x(62)Redux@4.x(11)- 中间件2 - redux-thunk

目录 1&#xff0c;介绍举例 2&#xff0c;原理和实现实现 3&#xff0c;注意点 1&#xff0c;介绍 一般情况下&#xff0c;action 是一个平面对象&#xff0c;并会通过纯函数来创建。 export const createAddUserAction (user) > ({type: ADD_USER,payload: user, });这…

WEB前端07-DOM对象

DOM模型 1.DOM概念 文档对象模型属于BOM的一 部分&#xff0c;用于对BOM中的核心对象document进行操作&#xff0c;它是一种与平台、语言无关的接口&#xff0c;允许程序和脚本动态地访问或更新HTML、XML文档的内容、结构和样式&#xff0c;且提供了一系列的函数和对象来实现…

工作边界感

工作边界 **明确工作边界****尊重他人的工作边界**&#xff1a;**建立有效的沟通机制**&#xff1a;**制定明确的规则和流程**&#xff1a;**保持开放和包容的心态**&#xff1a;**寻求专业支持**&#xff1a; 在程序员的日常工作中&#xff0c;会遇到很多边界问题。如果这些边…

【人工智能大模型】文心一言介绍以及基本使用指令

目录 一、产品背景与技术基础 二、主要功能与特点 基本用法 指令的使用 注意事项 文心一言&#xff08;ERNIE Bot&#xff09;是百度基于其文心大模型技术推出的生成式AI产品。以下是对文心一言的详细介绍&#xff1a; 一、产品背景与技术基础 技术背景&#xff1a;百度…

NOMAD: Non-Exclusive Memory Tiering via Transactional Page Migration——论文泛读

OSDI 2024 Paper CXL论文阅读笔记整理 问题 随着可字节寻址存储设备的出现&#xff0c;如CXL内存、持久内存和存储类内存&#xff0c;分层存储系统已成为现实&#xff0c;不同层具有不同的特性&#xff0c;如速度、大小、功耗和成本。分层内存管理的核心是操作系统&#xff0…

vmware虚拟机中,Centos安装Docker,解决国内无法访问

背景 本文主要解决了centos 的yum源 无法更新 和 docker的 源 国内无法访问的问题。 本文环境&#xff1a;windows宿主机装了vmware虚拟机&#xff0c;虚拟机中安装了Centos&#xff0c;centos内装docker。其实可以直接在window装docker desktop for windows&#xff0c;但…

VS C#类文件自动生成头部注释

VS C#类文件自动生成头部注释&#xff08;以VS2019为例&#xff09; 1、更新位置 E:\VS2019\vs_2019\Common7\IDE\ItemTemplates\CSharp\Code\2052\Class 2、替换Class 原始文件 using System; using System.Collections.Generic; $if$ ($targetframeworkversion$ > 3.5…

【代码随想录】【算法训练营】【第58天 3】 [卡码103]水流问题 [卡码104]建造最大岛屿

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 58&#xff0c;周四&#xff0c;ding~ 题目详情 [卡码103] 水流问题 题目描述 卡码103 水流问题 LeetCode类似题目417 太平洋大西洋水流问题 解题思路 前提&#xff1a; 思路&#xff1a; 重…

Qt 制作安装包

记录使用Qt工具制作一个安装包的过程 目录 1.准备工作 1.1检查Qt Installer Frameworks是否安装 1.2.安装Qt Installer Frameworks 1.3准备release出来的exe dll等文件 2.创建打包工程所需要的文件及目录 2.1创建子目录 2.2 创建工程文件 2.3 创建config/config.xml …

创建鸿蒙手机模拟器(HarmonyOS Emulator)

文 | Promise Sun 一.前提条件&#xff1a; 鸿蒙项目开发需要使用模拟器进行开发测试&#xff0c;但目前想在DevEco Studio开发工具中使用模拟器就必须到华为官网进行报名申请&#xff0c;参加“鸿蒙模拟器&#xff08;HarmonyOS Emulator&#xff09;Beta活动申请”。 申请审…

计算机课设——基于Java web的超市管理系统

smbms_java_web 基于Java web的超市管理系统&#xff0c;数据库课程设计 1.引言 是一个基于Java Web连接MySQL的小项目。 超市管理系统(smbms)作为每个计算机专业的大学生都是一个很好的练手项目&#xff0c;逻辑层次分明&#xff0c;基础功能包括用户的登录和注销&#xff…