Java在PDF中替換文字詳解及可能遇到的問(wèn)題
前言
PDF文檔中的信息隨時(shí)間的推移可能會(huì)發(fā)生變化,比如產(chǎn)品價(jià)格、聯(lián)系方式等。為了確保PDF文檔保持最新,我們需要對(duì)這些信息進(jìn)行更新。通過(guò)編程方式替換PDF中的相應(yīng)文字,可以實(shí)現(xiàn)批量化處理,大大提高工作效率。這篇博客將探討幾種使用Java在PDF中替換文字的不同方式,以及可能出現(xiàn)的問(wèn)題和解決方案。
使用工具
在PDF中替換文字,可以使用Spire.PDF for Java庫(kù)。
Spire.PDF for Java是一款專門為Java開(kāi)發(fā)人員設(shè)計(jì)的PDF文檔處理庫(kù)。它支持在Java應(yīng)用程序中創(chuàng)建、讀取、編輯、轉(zhuǎn)換和打印PDF文檔。你可以使用以下代碼來(lái)從Maven倉(cāng)庫(kù)安裝它:
<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中替換特定文字的所有實(shí)例
Spire.PDF for Java提供了PdfTextReplacer.replaceAllText()方法,支持替換PDF頁(yè)面中特定文字的所有實(shí)例。具體步驟如下:
- 創(chuàng)建PdfDocument類的實(shí)例。
- 使用PdfDocument.loadFromFile()方法加載PDF文檔。
- 遍歷PDF文檔中的頁(yè)面。
- 為每個(gè)頁(yè)面創(chuàng)建一個(gè)PdfTextReplacer實(shí)例,并將當(dāng)前頁(yè)面對(duì)象作為參數(shù)傳入該類的構(gòu)造函數(shù)。
- 使用PdfTextReplacer.replaceAllText()方法將頁(yè)面上特定文字的所有實(shí)例替換為新文字。
- 使用PdfDocument.saveToFile() 方法保存結(jié)果文檔。
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) {
// 創(chuàng)建PdfDocument類的實(shí)例
PdfDocument pdf = new PdfDocument();
// 加載PDF文件
pdf.loadFromFile("什么是Python.pdf");
// 遍歷PDF文件的頁(yè)面
for (PdfPageBase page : (Iterable<? extends PdfPageBase>) pdf.getPages()) {
// 創(chuàng)建PdfTextReplacer類的實(shí)例,并將當(dāng)前頁(yè)面對(duì)象作為參數(shù)傳遞至該類的構(gòu)造函數(shù)
PdfTextReplacer textReplacer = new PdfTextReplacer(page);
// 將當(dāng)前頁(yè)面上的特定文本的所有實(shí)例替換為新文本
textReplacer.replaceAllText("Python", "Golang");
}
// 將結(jié)果文件保存為一個(gè)新的PDF
pdf.saveToFile("替換所有實(shí)例.pdf");
pdf.close();
}
}

Java在PDF中替換特定文字的第一個(gè)實(shí)例
要替換PDF頁(yè)面中特定文字的第一個(gè)實(shí)例,可以使用PdfTextReplacer.replaceText() 方法。具體步驟如下:
- 創(chuàng)建PdfDocument類的實(shí)例。
- 使用PdfDocument.loadFromFile()方法加載PDF文檔。
- 遍歷PDF文檔中的頁(yè)面。
- 為每個(gè)頁(yè)面創(chuàng)建一個(gè)PdfTextReplacer實(shí)例,并將當(dāng)前頁(yè)面對(duì)象作為參數(shù)傳入該類的構(gòu)造函數(shù)。
- 使用PdfTextReplacer.replaceText() 方法將頁(yè)面上特定文字的第一個(gè)實(shí)例替換為新文字。
- 使用PdfDocument.saveToFile() 方法保存結(jié)果文檔。
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) {
// 創(chuàng)建PdfDocument類的實(shí)例
PdfDocument pdf = new PdfDocument();
// 加載PDF文件
pdf.loadFromFile("什么是Python.pdf");
// 遍歷PDF文件的頁(yè)面
for (PdfPageBase page : (Iterable<? extends PdfPageBase>) pdf.getPages()) {
// 創(chuàng)建PdfTextReplacer類的實(shí)例,并將當(dāng)前頁(yè)面對(duì)象作為參數(shù)傳遞至該類的構(gòu)造函數(shù)
PdfTextReplacer textReplacer = new PdfTextReplacer(page);
// 將當(dāng)前頁(yè)面上的特定文本的第一個(gè)實(shí)例替換為新文本
textReplacer.replaceText("Python", "Golang");
}
// 將結(jié)果文件保存為一個(gè)新的PDF
pdf.saveToFile("替換第一個(gè)實(shí)例.pdf");
pdf.close();
}
}
Java在PDF中使用正則表達(dá)式替換特定文字
Spire.PDF for Java提供了PdfTextReplaceOptions類,用于指定文字替換模式。你可以通過(guò)該類的setReplaceType() 方法指定文本替換模式為使用正則表達(dá)式替換。然后使用 PdfTextReplacer.setOptions() 方法應(yīng)用該文字替換模式。具體步驟如下:
- 創(chuàng)建PdfDocument類的實(shí)例。
- 使用PdfDocument.loadFromFile()方法加載PDF文檔。
- 創(chuàng)建PdfTextReplaceOptions類的實(shí)例,并使用PdfTextReplaceOptions.setReplaceType() 方法指定文本替換模式為使用正則表達(dá)式替換。
- 遍歷PDF文檔中的頁(yè)面。
- 為每個(gè)頁(yè)面創(chuàng)建一個(gè)PdfTextReplacer實(shí)例,并將當(dāng)前頁(yè)面對(duì)象作為參數(shù)傳入該類的構(gòu)造函數(shù)。
- 使用 PdfTextReplacer.setOptions() 方法應(yīng)用正則表達(dá)式替換模式。
- 將正則表達(dá)式和新文本作為參數(shù)傳入PdfTextReplacer.replaceAllText()方法來(lái)將頁(yè)面上正則表達(dá)式匹配到的文本替換為新文本。
- 使用PdfDocument.saveToFile() 方法保存結(jié)果文檔。
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) {
// 創(chuàng)建PdfDocument類的實(shí)例
PdfDocument pdf = new PdfDocument();
// 加載PDF文件
pdf.loadFromFile("模板.pdf");
// 創(chuàng)建PdfTextReplaceOptions類的實(shí)例,并指定文本替換模式為使用正則表達(dá)式替換
PdfTextReplaceOptions replaceOptions = new PdfTextReplaceOptions();
replaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.Regex));
// 遍歷PDF文件的頁(yè)面
for (PdfPageBase page : (Iterable<? extends PdfPageBase>) pdf.getPages()) {
// 創(chuàng)建PdfTextReplacer類的實(shí)例,并將當(dāng)前頁(yè)面對(duì)象作為參數(shù)傳遞至該類的構(gòu)造函數(shù)
PdfTextReplacer textReplacer = new PdfTextReplacer(page);
// 應(yīng)用正則表達(dá)式替換模式
textReplacer.setOptions(replaceOptions);
// 設(shè)置正則表達(dá)式來(lái)匹配以 “#” 開(kāi)頭的文本
String regularExpression = "\\#\\w+\\b";
// 將頁(yè)面上正則表達(dá)式匹配到的文本替換為新文本
textReplacer.replaceAllText(regularExpression, "顯示器");
}
// 將結(jié)果文件保存為一個(gè)新的PDF
pdf.saveToFile("正則表達(dá)式替換.pdf");
pdf.close();
}
}

其他替換條件設(shè)置
Spire.PDF for Java還支持設(shè)置其他替換條件,如不區(qū)分大小寫(xiě)和全詞匹配。具體代碼如下:
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) {
// 創(chuàng)建PdfDocument類的實(shí)例
PdfDocument pdf = new PdfDocument();
// 加載PDF文件
pdf.loadFromFile("什么是Python.pdf");
// 創(chuàng)建PdfTextReplaceOptions類的實(shí)例,并指定文本替換模式為不區(qū)分大小寫(xiě)或全詞匹配
PdfTextReplaceOptions replaceOptions = new PdfTextReplaceOptions();
replaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.IgnoreCase));
replaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.WholeWord));
// 遍歷PDF文件的頁(yè)面
for (PdfPageBase page : (Iterable<? extends PdfPageBase>) pdf.getPages()) {
// 創(chuàng)建PdfTextReplacer類的實(shí)例,并將當(dāng)前頁(yè)面對(duì)象作為參數(shù)傳遞至該類的構(gòu)造函數(shù)
PdfTextReplacer textReplacer = new PdfTextReplacer(page);
// 應(yīng)用文本替換模式
textReplacer.setOptions(replaceOptions);
// 將頁(yè)面上特定文本替換為新文本
textReplacer.replaceAllText("Python", "Golang");
}
// 將結(jié)果文件保存為一個(gè)新的PDF
pdf.saveToFile("其他替換條件.pdf");
pdf.close();
}
}
可能出現(xiàn)的問(wèn)題及解決方案
當(dāng)使用 PdfTextReplacer類的方法進(jìn)行文本替換時(shí),默認(rèn)情況下,替換后的新文本會(huì)使用PDF文檔中原始文本的字體來(lái)繪制。如果原始文本所使用的字體不支持新文本所使用的語(yǔ)言,那么新文本就無(wú)法正確地顯示出來(lái)。這種情況通常會(huì)出現(xiàn)在需要替換不同語(yǔ)言的文本時(shí)。比如,原文是英文,需要替換為中文,但是英文字體可能不支持顯示中文字符。為解決這個(gè)問(wèn)題,可以考慮以下2種方法:
- 文檔使用能夠兼容原文本和新文本的語(yǔ)言的字體。
- 采用另一種方法替換文本:通過(guò)在原始文本上繪制矩形覆蓋它,然后在矩形內(nèi)繪制新文本,注意這種方式不能保留原始文本的樣式,需要自己設(shè)置新文本的樣式,效果沒(méi)有使用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) {
// 創(chuàng)建PdfDocument類的實(shí)例
PdfDocument pdf = new PdfDocument();
// 加載PDF文件
pdf.loadFromFile("Adobe Acrobat.pdf");
// 定義字體(如果字體已安裝在系統(tǒng)中)
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋體", Font.PLAIN, 11));
// 如果字體未安裝在系統(tǒng)中,使用以下代碼
// PdfTrueTypeFont font = new PdfTrueTypeFont("字體文件.ttf", 11);
PdfStringFormat format = new PdfStringFormat();
format.setLineLimit(false);
List<PdfTextFragment> results = null;
// 遍歷PDF文件的頁(yè)面
for (PdfPageBase page : (Iterable<? extends PdfPageBase>) pdf.getPages()) {
// 創(chuàng)建 PdfTextFinder 實(shí)例
PdfTextFinder finder = new PdfTextFinder(page);
// 查找特定文本
results = finder.find("Adobe Acrobat");
// 遍歷找到的所有實(shí)例
for (PdfTextFragment text : results) {
// 獲取文本所在的矩形區(qū)域
Rectangle2D rect = text.getBounds()[0];
// 在該區(qū)域畫(huà)一個(gè)新的矩形覆蓋原來(lái)的文本
page.getCanvas().drawRectangle(PdfBrushes.getWhite(), rect);
// 在新的矩形中繪制新文本
page.getCanvas().drawString("PDF編輯器", font, PdfBrushes.getDarkBlue(), rect, format);
}
}
// 將結(jié)果文件保存為一個(gè)新的PDF
pdf.saveToFile("覆蓋文本.pdf");
pdf.close();
}
}
以上就是使用Java在PDF中替換文字的全部?jī)?nèi)容。
總結(jié)
到此這篇關(guān)于Java在PDF中替換文字詳解及可能遇到的問(wèn)題的文章就介紹到這了,更多相關(guān)Java在PDF中替換文字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot可執(zhí)行jar包中使用自定義字符集失敗問(wèn)題的原因及解決方案
這篇文章主要介紹了Spring Boot fatjar部署時(shí),因類加載器雙親委托模型與SPI機(jī)制沖突導(dǎo)致自定義字符集無(wú)法加載的問(wèn)題,解決方案是修改代碼使用當(dāng)前線程類加載器或調(diào)整JVM參數(shù),確保字符集實(shí)現(xiàn)被正確識(shí)別,需要的朋友可以參考下2025-07-07
Java動(dòng)態(tài)循環(huán)隊(duì)列是如何實(shí)現(xiàn)的
今天帶大家學(xué)習(xí)java隊(duì)列的相關(guān)知識(shí),文章圍繞著如何實(shí)現(xiàn)Java動(dòng)態(tài)循環(huán)隊(duì)列展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
MyBatis實(shí)現(xiàn)分頁(yè)全過(guò)程
MyBatis分頁(yè)有三種方式:手動(dòng)SQL分頁(yè)(性能高但需處理數(shù)據(jù)庫(kù)差異)、RowBounds(簡(jiǎn)單但不推薦)、PageHelper分頁(yè)插件(自動(dòng)改寫(xiě)SQL,推薦生產(chǎn)環(huán)境),PageHelper適合百萬(wàn)級(jí)數(shù)據(jù)優(yōu)化,是終極解決方案2025-08-08
mybatis多數(shù)據(jù)源動(dòng)態(tài)切換的完整步驟
這篇文章主要給大家介紹了關(guān)于mybatis多數(shù)據(jù)源動(dòng)態(tài)切換的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
java實(shí)現(xiàn)在SSM下使用支付寶掃碼支付功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)在SSM下使用支付寶掃碼支付功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
Spring?Boot?集成并開(kāi)發(fā)?Sa-token示例詳解
Sa-token是一款高可用的權(quán)限認(rèn)證框架,他帶我們用最簡(jiǎn)化的配置完成用?spring?security?需要進(jìn)行大量配置的才能完成的工作,這篇文章主要介紹了Spring?Boot?集成并開(kāi)發(fā)?Sa-token,需要的朋友可以參考下2023-06-06

