Java 实现 PDF 中文文本查找与高亮的四种方法

在实际开发中,PDF 文档几乎无处不在,从报告、合同到教材、试卷都有广泛应用。在处理这些文档时,常常需要对文本进行搜索和高亮,例如标记报告中的关键术语、合同条款,或者提取特定内容进行分析。手动处理不仅费时,还容易遗漏关键内容,因此自动化的文本查找和高亮就显得非常必要。

本文将通过四个示例,详细介绍如何在 Java 中实现 PDF 中文文本的查找与高亮操作:

  1. 单页文本查找与高亮

  2. 指定区域内文本查找与高亮

  3. 整篇文档文本查找与高亮

  4. 使用正则表达式查找并高亮

库安装

本文示例使用 Spire.PDF for Java 来处理 PDF 文档,它提供了完整的 PDF 操作接口,包括加载、查找、编辑和高亮文本。你可以通过官网下载 JAR 包并引入项目,也可以通过 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>12.4.4</version>
    </dependency>
</dependencies>

安装好库之后,就可以在 Java 中对 PDF 文档进行操作,无需依赖 Adobe Acrobat 等第三方软件。

示例一:在单页中查找并高亮中文文本

有时候,我们只需要对 PDF 中某一页进行查找,例如查找第一页报告中的关键术语"数据库"。这种场景适用于快速标注或页面内容审阅。

完整代码示例如下:

java 复制代码
import com.spire.ms.System.Collections.Generic.List;
import com.spire.pdf.FileFormat;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.texts.PdfTextFinder;
import com.spire.pdf.texts.PdfTextFragment;
import com.spire.pdf.texts.TextFindParameter;

import java.awt.*;
import java.util.EnumSet;

public class FindAndHighlightTextInPage {

    public static void main(String[] args) {

        PdfDocument doc = new PdfDocument();
        doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\示例文档.pdf");

        PdfPageBase page = doc.getPages().get(0);
        PdfTextFinder finder = new PdfTextFinder(page);

        // 设置查找选项:全字匹配且忽略大小写
        finder.getOptions().setTextFindParameter(EnumSet.of(TextFindParameter.WholeWord));
        finder.getOptions().setTextFindParameter(EnumSet.of(TextFindParameter.IgnoreCase));

        // 查找文本"数据库"
        List<PdfTextFragment> results = finder.find("数据库");

        // 高亮找到的文本
        for (PdfTextFragment textFragment : results) {
            textFragment.highLight(Color.LIGHT_GRAY);
        }

        doc.saveToFile("output/HighlightTextInPage.pdf", FileFormat.PDF);
        doc.dispose();
    }
}

适用场景:单页注释、报告审阅、快速查找某页重要内容。

示例二:在指定矩形区域内查找并高亮文本

有些时候,我们只希望查找 PDF 页面中的特定区域,如页眉、页脚或表格区域,避免对整页内容无差别高亮。此时可以使用 setFindArea() 方法指定矩形区域。

示例代码:

java 复制代码
import java.awt.geom.Rectangle2D;

finder.getOptions().setFindArea(new Rectangle2D.Float(0, 0, 841, 180)); // 页眉区域
List<PdfTextFragment> results = finder.find("报告");

for (PdfTextFragment textFragment : results) {
    textFragment.highLight(Color.LIGHT_GRAY);
}

在完整项目中,你可以结合示例一的页面加载逻辑,将矩形区域限定在顶部页眉、底部页脚或任意自定义区域。这样不仅可以提高查找效率,还能避免误高亮文档中其他部分的相同词汇。

适用场景:合同页眉高亮、报告章节标题标注、表格内容查找。

示例三:在整个文档中查找并高亮文本

对于需要处理整篇文档的需求,例如在合同集合、教材或报告中查找"合同条款",可以遍历每一页进行查找和高亮。

示例代码:

java 复制代码
for (Object pageObj : doc.getPages()) {
    PdfPageBase page = (PdfPageBase) pageObj;
    PdfTextFinder finder = new PdfTextFinder(page);

    finder.getOptions().setTextFindParameter(EnumSet.of(TextFindParameter.WholeWord));
    finder.getOptions().setTextFindParameter(EnumSet.of(TextFindParameter.IgnoreCase));

    List<PdfTextFragment> results = finder.find("合同条款");
    for (PdfTextFragment textFragment : results) {
        textFragment.highLight(Color.LIGHT_GRAY);
    }
}

通过这种方式,可以一次性处理整个文档,无需手动翻页查找,大幅节省人工操作时间。

适用场景:合同全文审查、批量报告注释、教材关键内容标注。

示例四:使用正则表达式查找并高亮文本

当查找的文本具有一定规律性,例如章节标题、编号或特殊格式时,正则表达式会非常有用。例如查找所有以"第"开头、以"章"结尾的章节标题:

java 复制代码
finder.getOptions().setTextFindParameter(EnumSet.of(TextFindParameter.Regex));
String pattern = "\\b第\\w*章\\b";

List<PdfTextFragment> results = finder.find(pattern);
for (PdfTextFragment textFragment : results) {
    textFragment.highLight(Color.LIGHT_GRAY);
}

正则匹配不仅可以查找固定词汇,还能匹配模式化文本,如编号、日期、序列号等,提高查找灵活性。

适用场景:章节标题标注、序列号提取、敏感信息查找与标注。

总结

通过这四个示例,我们可以看到 Java 中 PDF 中文文本查找与高亮的几种典型场景:

  1. 单页高亮:快速标注指定页面文本。

  2. 矩形区域高亮:精确控制搜索范围,避免误高亮。

  3. 整篇文档高亮:适合批量处理文档内容。

  4. 正则表达式高亮:灵活匹配复杂文本模式。

借助 Spire.PDF,我们可以用简单的代码实现强大的 PDF 文本处理功能,非常适合在合同审查、报告分析、教材标注等场景中使用。

相关推荐
倒流时光三十年1 小时前
PostgreSQL 一次由 string_agg 引发的数据错位 Bug 深度复盘
java·postgresql·string_agg
Gofarlic_OMS1 小时前
Mastercam浮动许可利用率低:软件许可浪费,回收再分配
java·大数据·开发语言·架构·制造
AC赳赳老秦1 小时前
OpenClaw与飞书多维表格联动:自动同步工作数据、生成统计图表,实现高效管理
java·数据库·python·信息可视化·飞书·deepseek·openclaw
开开心心就好1 小时前
带可视化界面的目录文件合并工具
java·运维·科技·游戏·tomcat·自动化·powerpoint
玛卡巴卡ldf1 小时前
【LeetCode 手撕算法】(动态规划)爬楼梯、杨辉三角、打家劫舍、完全平方数、零钱兑换、单词拆分、最长递增子序列、乘积最大子数组、分割等和子集
java·数据结构·算法·leetcode·动态规划·力扣
weelinking1 小时前
2026年三大主流大模型深度对比:GPT-5.5、Claude 4.6与DeepSeek V4谁更值得选择?
java·大数据·人工智能·git·python·gpt·github
橘子海全栈攻城狮1 小时前
【最新源码】基于springboot的快递物流平台的设计与实现C102
java·开发语言·spring boot·后端·spring·web安全
m0_739030001 小时前
mabatis-plus 和mabatis 的区别
java·数据库·mybatis
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 小时前
判断两个集合是不是相同
java