Python PDF文本查找与高亮标注的固定匹配和正则匹配方案
在PDF内容审核、数据提取和文档自动化处理中,常常需要把指定的关键词或者符合格式规则的文本找出来并添加高亮。手动翻阅PDF不仅耗时,而且容易漏项。Free Spire.PDF for Python提供了一套简洁的封装,通过PdfDocument、PdfTextFinder等类型即可完成页面遍历、文本匹配和颜色标注,不用处理复杂的PDF底层结构。该免费版仅支持处理10页以内的PDF,适合日常轻量调试和少量文档的自动化标注。需要先安装依赖:
pip install spire.pdf.free
一、固定关键词全局匹配高亮
如果目标文本是明确的,例如要在整个PDF中集中标注“云服务器”这一关键词,可以使用逐页遍历加精准查找的方式。核心流程为:加载文档、循环每一页、创建PdfTextFinder检索器、调用Find方法取得匹配对象、调用HighLight给文本上色。
完整脚本如下:
from spire.pdf import *
from spire.pdf.common import *
pdf = PdfDocument()
pdf.LoadFromFile("示例.pdf")
for i in range(pdf.Pages.Count):
page = pdf.Pages.get_Item(i)
pdfTextFinder = PdfTextFinder(page)
result = pdfTextFinder.Find("云服务器")
for find in result:
find.HighLight(Color.get_Cyan())
pdf.SaveToFile("output/查找并突出显示.pdf")
pdf.Close()
这段代码中,PdfDocument.LoadFromFile用于读取本地PDF文件;pdf.Pages.Count取得总页数,确保每个页面都不会漏检。PdfTextFinder每次基于当前页面实例化,Find方法返回的是所有匹配文本片段的对象集合,而非简单布尔值。遍历集合后统一调用HighLight,即可将匹配文本背景设置为青色。Color.get_Cyan()可以替换成其他颜色常量,比如Color.get_DeepPink()。
需要特别提醒的是,保存路径中的output目录必须存在,否则SaveToFile会报目录不存在的错误。建议在脚本开头加入自动建目录逻辑:
import os
os.makedirs("output", exist_ok=True)
二、正则表达式模糊匹配高亮
在很多业务中,目标文本没有固定内容,但存在统一格式,例如数字、小数、百分比、手机号、日期等。此时可以开启正则匹配模式,通过一条表达式批量命中格式相近的文本。
下面的示例匹配整数、小数和百分数三种数值形式:
from spire.pdf import *
from spire.pdf.common import *
pdf = PdfDocument()
pdf.LoadFromFile("示例.pdf")
page = pdf.Pages.get_Item(0)
pdfTextFinder = PdfTextFinder(page)
pdfTextFinder.Options.Parameter = TextFindParameter.Regex
pattern = r'\d+(?:\.\d+)?%?'
result = pdfTextFinder.Find(pattern)
for find in result:
find.HighLight(Color.get_DeepPink())
pdf.SaveToFile("output/查找并突出显示.pdf")
pdf.Close()
该脚本的要点在于,通过将Options.Parameter指定为TextFindParameter.Regex,PdfTextFinder会把Find方法传入的字符串当作正则表达式处理。示例中的r'\d+(?:\.\d+)?%?'可拆解为:\d+匹配纯整数;(?:\.\d+)?匹配可选的小数部分;%?匹配可选的百分号。因此10、99.9、50%这类数据都会被高亮。
上述代码只对第一页执行检索,页码索引由get_Item(0)决定。如果需要全文匹配,只需参考场景一中的循环逻辑,把正则查找和上色逻辑放到每一页的遍历中执行即可。
三、常见问题与使用建议
1. 文档保存失败:如果输出目录不存在,写入文件会抛出路径异常。先执行os.makedirs("output", exist_ok=True)可以避免这个问题。
2. 超出页数限制:免费组件限制只能处理10页以内的PDF。超过10页的文档可以提前拆分成多个子文件,再分别执行查找高亮操作。
3. 高亮精准度:默认匹配会覆盖包含目标文本片段的搜索结果。如果业务要求整词匹配或者区分大小写,可以继续配置检索器的Options参数,调整匹配模式后再执行Find。
PDF文本查找与高亮标注的两种方案,分别适合明确关键词检索和规则化文本检索。代码量小,没有冗余的外部依赖,适合集成在文档处理脚本中。对于短篇幅PDF的内容标注、数据提取预处理和人工审阅辅助,这套方法能够明显减少重复操作时间。
Re: Python PDF文本查找与高亮标注的固定匹配和正则匹配方案
感谢分享,这个方案对日常PDF关键词标注确实很实用。固定匹配和正则匹配正好覆盖了两种常见需求,代码也比较简洁。特别是正则那段,直接就能把数字、百分数这类带格式的内容高亮出来,省得手写一堆判断。 有个小点想确认下:如果PDF里同一行文本被拆成多个片段,比如“云服务器”三个字分在两次文本块里,`PdfTextFinder`是按底层文本片段查找还是能跨片段识别?这个会直接影响高亮的完整性,之前用其他库遇到过类似问题。另外保存路径的自动建目录那段建议提得好,不然首次运行确实容易报错。Re: Python PDF文本查找与高亮标注的固定匹配和正则匹配方案
感谢分享,正好最近在整理一批PDF合同,需要按规则高亮一些关键词和金额/日期。这个方案看起来比之前用PyMuPDF要简洁一些,回头试试看。 有几个小疑问想请教一下: 1. 正则匹配那部分,如果文本跨行(比如关键词被换行符拆开了),PdfTextFinder能命中吗?还是要预处理文本? 2. 免费版的10页限制是指加载的PDF总页数,还是每次查找操作只能扫10页?如果拆分成多个子文件,用完之后需要每次重新加载再释放资源吗? 3. 高亮的颜色在普通阅读器里都能正常显示吧?有时候用第三方库高亮完,在Adobe里需要重新打开才看得到。 另外,如果PDF本身就是扫描件、没有文字层,楼主有没有推荐的处理方式?直接上OCR会不会破坏原本的排版?期待后续能分享更多实战经验。Re: Python PDF文本查找与高亮标注的固定匹配和正则匹配方案
感谢分享,这个封装确实方便,之前用PyPDF2想要高亮文本还得自己操作注释,比较麻烦。您提到的固定关键词和正则匹配两种场景基本覆盖了日常需求,尤其是正则匹配对批量标注格式化的日期、金额很有用。 补充一点个人经验:如果PDF是扫描件或者文字被切割成单个字符,PdfTextFinder的匹配可能会不理想,这时需要先做OCR或文本提取确认。另外,正则模式如果涉及中文或特殊字符,注意编码和转义问题,实际使用中建议先用小段样本测试再应用到全文档。 另外,关于免费版10页限制,您提到的拆分PDF再处理是个思路,不过也要注意拆分后页数和总容量限制。如果只在命令行环境下用,这个库的依赖也比较干净,适合集成到自动化流程里。感谢您的代码示例,收藏了。
页:
[1]