• 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仓库安装它:

    1. com.e-iceblue
    2. e-iceblue
    3. https://repo.e-iceblue.cn/repository/maven-public/
    4. e-iceblue
    5. spire.pdf
    6. 10.6.2

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

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

    • 创建PdfDocument类的实例。
    • 使用PdfDocument.loadFromFile()方法加载PDF文档。
    • 遍历PDF文档中的页面。
    • 为每个页面创建一个PdfTextReplacer实例,并将当前页面对象作为参数传入该类的构造函数。
    • 使用PdfTextReplacer.replaceAllText()方法将页面上特定文字的所有实例替换为新文字。
    • 使用PdfDocument.saveToFile() 方法保存结果文档。
    1. import com.spire.pdf.PdfDocument;
    2. import com.spire.pdf.PdfPageBase;
    3. import com.spire.pdf.texts.PdfTextReplacer;
    4. public class ReplaceAllFoundText {
    5. public static void main(String[] args) {
    6. // 创建PdfDocument类的实例
    7. PdfDocument pdf = new PdfDocument();
    8. // 加载PDF文件
    9. pdf.loadFromFile("什么是Python.pdf");
    10. // 遍历PDF文件的页面
    11. for (PdfPageBase page : (Iterableextends PdfPageBase>) pdf.getPages()) {
    12. // 创建PdfTextReplacer类的实例,并将当前页面对象作为参数传递至该类的构造函数
    13. PdfTextReplacer textReplacer = new PdfTextReplacer(page);
    14. // 将当前页面上的特定文本的所有实例替换为新文本
    15. textReplacer.replaceAllText("Python", "Golang");
    16. }
    17. // 将结果文件保存为一个新的PDF
    18. pdf.saveToFile("替换所有实例.pdf");
    19. pdf.close();
    20. }
    21. }

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

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

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

    • 创建PdfDocument类的实例。
    • 使用PdfDocument.loadFromFile()方法加载PDF文档。
    • 遍历PDF文档中的页面。
    • 为每个页面创建一个PdfTextReplacer实例,并将当前页面对象作为参数传入该类的构造函数。
    • 使用PdfTextReplacer.replaceText() 方法将页面上特定文字的第一个实例替换为新文字。
    • 使用PdfDocument.saveToFile() 方法保存结果文档。
    1. import com.spire.pdf.PdfDocument;
    2. import com.spire.pdf.PdfPageBase;
    3. import com.spire.pdf.texts.PdfTextReplacer;
    4. public class ReplaceFirstFoundText {
    5. public static void main(String[] args) {
    6. // 创建PdfDocument类的实例
    7. PdfDocument pdf = new PdfDocument();
    8. // 加载PDF文件
    9. pdf.loadFromFile("什么是Python.pdf");
    10. // 遍历PDF文件的页面
    11. for (PdfPageBase page : (Iterableextends PdfPageBase>) pdf.getPages()) {
    12. // 创建PdfTextReplacer类的实例,并将当前页面对象作为参数传递至该类的构造函数
    13. PdfTextReplacer textReplacer = new PdfTextReplacer(page);
    14. // 将当前页面上的特定文本的第一个实例替换为新文本
    15. textReplacer.replaceText("Python", "Golang");
    16. }
    17. // 将结果文件保存为一个新的PDF
    18. pdf.saveToFile("替换第一个实例.pdf");
    19. pdf.close();
    20. }
    21. }

    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() 方法保存结果文档。
    1. import com.spire.pdf.PdfDocument;
    2. import com.spire.pdf.PdfPageBase;
    3. import com.spire.pdf.texts.PdfTextReplaceOptions;
    4. import com.spire.pdf.texts.PdfTextReplacer;
    5. import com.spire.pdf.texts.ReplaceActionType;
    6. import java.util.EnumSet;
    7. public class ReplaceTextWithRegex {
    8. public static void main(String[] args) {
    9. // 创建PdfDocument类的实例
    10. PdfDocument pdf = new PdfDocument();
    11. // 加载PDF文件
    12. pdf.loadFromFile("模板.pdf");
    13. // 创建PdfTextReplaceOptions类的实例,并指定文本替换模式为使用正则表达式替换
    14. PdfTextReplaceOptions replaceOptions = new PdfTextReplaceOptions();
    15. replaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.Regex));
    16. // 遍历PDF文件的页面
    17. for (PdfPageBase page : (Iterableextends PdfPageBase>) pdf.getPages()) {
    18. // 创建PdfTextReplacer类的实例,并将当前页面对象作为参数传递至该类的构造函数
    19. PdfTextReplacer textReplacer = new PdfTextReplacer(page);
    20. // 应用正则表达式替换模式
    21. textReplacer.setOptions(replaceOptions);
    22. // 设置正则表达式来匹配以 “#” 开头的文本
    23. String regularExpression = "\\#\\w+\\b";
    24. // 将页面上正则表达式匹配到的文本替换为新文本
    25. textReplacer.replaceAllText(regularExpression, "显示器");
    26. }
    27. // 将结果文件保存为一个新的PDF
    28. pdf.saveToFile("正则表达式替换.pdf");
    29. pdf.close();
    30. }
    31. }

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

    其他替换条件设置

    Spire.PDF for Java还支持设置其他替换条件,如不区分大小写全词匹配。具体代码如下:

    1. import com.spire.pdf.PdfDocument;
    2. import com.spire.pdf.PdfPageBase;
    3. import com.spire.pdf.texts.PdfTextReplaceOptions;
    4. import com.spire.pdf.texts.PdfTextReplacer;
    5. import com.spire.pdf.texts.ReplaceActionType;
    6. import java.util.EnumSet;
    7. public class OtherReplacementSettings {
    8. public static void main(String[] args) {
    9. // 创建PdfDocument类的实例
    10. PdfDocument pdf = new PdfDocument();
    11. // 加载PDF文件
    12. pdf.loadFromFile("什么是Python.pdf");
    13. // 创建PdfTextReplaceOptions类的实例,并指定文本替换模式为不区分大小写或全词匹配
    14. PdfTextReplaceOptions replaceOptions = new PdfTextReplaceOptions();
    15. replaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.IgnoreCase));
    16. replaceOptions.setReplaceType(EnumSet.of(ReplaceActionType.WholeWord));
    17. // 遍历PDF文件的页面
    18. for (PdfPageBase page : (Iterableextends PdfPageBase>) pdf.getPages()) {
    19. // 创建PdfTextReplacer类的实例,并将当前页面对象作为参数传递至该类的构造函数
    20. PdfTextReplacer textReplacer = new PdfTextReplacer(page);
    21. // 应用文本替换模式
    22. textReplacer.setOptions(replaceOptions);
    23. // 将页面上特定文本替换为新文本
    24. textReplacer.replaceAllText("Python", "Golang");
    25. }
    26. // 将结果文件保存为一个新的PDF
    27. pdf.saveToFile("其他替换条件.pdf");
    28. pdf.close();
    29. }
    30. }

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

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

    1. 文档使用能够兼容原文本和新文本的语言的字体。
    2. 采用另一种方法替换文本:通过在原始文本上绘制矩形覆盖它,然后在矩形内绘制新文本,注意这种方式不能保留原始文本的样式,需要自己设置新文本的样式,效果没有使用PdfTextReplacer方法好。具体代码如下:
    1. import com.spire.pdf.*;
    2. import com.spire.pdf.graphics.*;
    3. import com.spire.pdf.texts.*;
    4. import java.awt.*;
    5. import java.awt.geom.Rectangle2D;
    6. import java.util.List;
    7. public class ReplaceTextByDrawingRectangle {
    8. public static void main(String[] args) {
    9. // 创建PdfDocument类的实例
    10. PdfDocument pdf = new PdfDocument();
    11. // 加载PDF文件
    12. pdf.loadFromFile("Adobe Acrobat.pdf");
    13. // 定义字体(如果字体已安装在系统中)
    14. PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋体", Font.PLAIN, 11));
    15. // 如果字体未安装在系统中,使用以下代码
    16. // PdfTrueTypeFont font = new PdfTrueTypeFont("字体文件.ttf", 11);
    17. PdfStringFormat format = new PdfStringFormat();
    18. format.setLineLimit(false);
    19. List results = null;
    20. // 遍历PDF文件的页面
    21. for (PdfPageBase page : (Iterableextends PdfPageBase>) pdf.getPages()) {
    22. // 创建 PdfTextFinder 实例
    23. PdfTextFinder finder = new PdfTextFinder(page);
    24. // 查找特定文本
    25. results = finder.find("Adobe Acrobat");
    26. // 遍历找到的所有实例
    27. for (PdfTextFragment text : results) {
    28. // 获取文本所在的矩形区域
    29. Rectangle2D rect = text.getBounds()[0];
    30. // 在该区域画一个新的矩形覆盖原来的文本
    31. page.getCanvas().drawRectangle(PdfBrushes.getWhite(), rect);
    32. // 在新的矩形中绘制新文本
    33. page.getCanvas().drawString("PDF编辑器", font, PdfBrushes.getDarkBlue(), rect, format);
    34. }
    35. }
    36. // 将结果文件保存为一个新的PDF
    37. pdf.saveToFile("覆盖文本.pdf");
    38. pdf.close();
    39. }
    40. }

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

  • 相关阅读:
    6月适配进展|优炫数据库与40余款产品完成兼容认证
    54. 螺旋矩阵
    Spring MVC 和 Spring Boot 的区别
    卖家应该如何应对亚马逊多账号操作呢?
    第3部分 静态路由
    幸福里 C 端 iOS 编译优化实践-优化 40% 耗时
    URLDNS利用链
    pip工具的使用:基本+高级用法
    【Office】Microsoft Office下载地址合集(微软官方原版离线安装下载)
    【Jmeter】基于JMeter开展性能测试(插件、监控、分布式压测)!
  • 原文地址:https://blog.csdn.net/nuclear2011/article/details/140445097