Python实现PDF文本提取与关键词高亮功能技术求助
PDF关键词高亮解决方案(适配技术规范文档)
问题背景
我正在编写一个程序,需实现从PDF中提取文本、搜索关键词并高亮显示,最终生成带有高亮关键词的新PDF。不确定是要先提取文本再重新生成PDF,还是可直接在原PDF中高亮关键词,且需保留原文本格式。曾尝试使用reportlab,但提取文本后丢失了原格式。我是编程新手,可能问题不难解决,但缺乏相关技能。
我是一名电气工程师,需要阅读大量如IEC或NBR(巴西版IEC)这类技术规范文档,该程序将对我帮助很大。
以下是我目前编写的代码:
import PyPDF2 # 打开PDF文件 pdf_file = r"C:\Users\pietro\Desktop\Projects\espectest.pdf" words = ["Teste"] # 创建PDF读取器和写入器对象 pdf_reader = PyPDF2.PdfReader(pdf_file) pdf_writer = PyPDF2.PdfWriter() # 获取PDF总页数 num_pages = len(pdf_reader.pages) # 创建空列表存储页面 pages=[] # 遍历每一页提取文本并添加到写入器 for i in range(num_pages): page=pdf_reader.pages[i] texto = pdf_reader.pages[i].extract_text() pages.append(page) pdf_writer.add_page(page) # 此处需实现关键词高亮并写入新文件 # 保存新PDF pdf_writer.write("especteste123.pdf") # 我试过的库:PyPDF2、reportlab、Fitz、PDFPlumber
解决方案
直接在原PDF页面上添加高亮标注是唯一能完整保留原格式的方案,重新生成PDF(如reportlab的方式)必然会丢失排版、字体等关键信息。推荐使用PyMuPDF(即你试过的Fitz),它能精准定位文本坐标并添加高亮,完全不破坏原文档结构。
完整可运行代码
import fitz # 导入PyMuPDF库,别名fitz # 配置参数 pdf_path = r"C:\Users\pietro\Desktop\Projects\espectest.pdf" output_pdf = "especteste123.pdf" target_words = ["Teste"] highlight_rgb = (1, 1, 0) # 高亮颜色:黄色(RGB值范围0-1,可自行调整) # 打开原PDF文档 doc = fitz.open(pdf_path) # 遍历每一页处理 for page in doc: # 逐个处理要高亮的关键词 for word in target_words: # 查找页面中所有匹配关键词的位置(返回坐标矩形) text_boxes = page.search_for(word) # 为每个匹配位置添加高亮 for box in text_boxes: # 创建高亮标注 highlight = page.add_highlight_annot(box) # 设置高亮颜色 highlight.set_colors(stroke=highlight_rgb) # 应用修改 highlight.update() # 保存修改后的新PDF doc.save(output_pdf) doc.close()
关键说明
- 精准定位文本:
page.search_for(word)会返回关键词在页面上的所有坐标矩形,确保高亮位置准确 - 保留原格式:所有操作基于原PDF页面,不会修改原有排版、字体、图片等元素
- 颜色自定义:
highlight_rgb可自行调整,比如(1,0,0)为红色,(0,1,0)为绿色 - 忽略大小写匹配:如果需要不区分大小写搜索,可替换搜索逻辑为:
import re for word in target_words: # 用正则匹配忽略大小写的关键词 matches = re.finditer(re.escape(word), page.get_text(), re.IGNORECASE) for match in matches: # 获取匹配文本的坐标矩形 box = page.get_textbox(match.span()) highlight = page.add_highlight_annot(box) highlight.set_colors(stroke=highlight_rgb) highlight.update()
安装依赖
执行以下命令安装PyMuPDF:
pip install pymupdf
内容的提问来源于stack exchange,提问作者Pietro
相关产品推荐
相关产品推荐

