如何用Python给PDF标记关键词并排除指定词汇?
基于PyMuPDF实现PDF关键词高亮并排除指定词汇的解决方案
核心思路
- 从关键词PDF提取词汇后,通过排除集合过滤掉不需要标记的功能词(如the、for等)
- 采用完整单词匹配规则,避免部分匹配导致的误高亮(比如避免"the"在"there"中被标记)
- 遍历原始PDF每页,对过滤后的关键词逐一执行高亮操作并保存结果
完整代码实现
import fitz import string def extract_filtered_keywords(keyword_pdf_path, exclude_words): """从关键词PDF提取词汇并过滤排除词""" keywords = set() doc = fitz.open(keyword_pdf_path) for page in doc: # 提取页面文本并分割为单词 text = page.get_text() # 清理标点并转小写(可选,根据需求调整大小写匹配规则) words = [word.strip(string.punctuation).lower() for word in text.split()] # 过滤排除词,加入关键词集合(自动去重) keywords.update([word for word in words if word not in exclude_words and len(word) > 0]) doc.close() return list(keywords) def highlight_keywords_in_pdf(original_pdf_path, keywords, output_path): """在原始PDF中高亮指定关键词并保存""" doc = fitz.open(original_pdf_path) # 搜索标志:完整单词匹配 + 忽略大小写(可根据需求调整) search_flags = fitz.TEXT_SEARCH_WHOLE_WORD | fitz.TEXT_SEARCH_CASELESS for page in doc: for keyword in keywords: # 查找当前页中所有匹配的关键词位置 matches = page.search_for(keyword, flags=search_flags) # 对每个匹配位置添加高亮 for match in matches: highlight = page.add_highlight_annot(match) # 设置高亮颜色(可选,默认黄色) highlight.set_colors(stroke=[1, 1, 0]) highlight.update() doc.save(output_path) doc.close() if __name__ == "__main__": # 配置参数 KEYWORD_PDF = "keywords.pdf" ORIGINAL_PDF = "original.pdf" OUTPUT_PDF = "markedwords.pdf" # 定义需要排除的功能词集合 EXCLUDE_WORDS = {"the", "for", "and", "but", "a", "an", "of", "in", "on", "at"} # 执行流程 filtered_keywords = extract_filtered_keywords(KEYWORD_PDF, EXCLUDE_WORDS) highlight_keywords_in_pdf(ORIGINAL_PDF, filtered_keywords, OUTPUT_PDF) print(f"高亮完成,结果已保存至 {OUTPUT_PDF}")
关键细节说明
- 排除集合的优势:使用
set存储排除词,查询效率远高于列表,当关键词数量较多时能显著提升性能 - 完整单词匹配:通过
fitz.TEXT_SEARCH_WHOLE_WORD标志确保只匹配独立的单词,避免误匹配包含目标词的长单词 - 大小写处理:添加
fitz.TEXT_SEARCH_CASELESS标志实现大小写不敏感匹配,若需要严格大小写匹配可移除该标志 - 标点清理:提取关键词时用
strip(string.punctuation)清除词汇两端的标点,避免因标点导致的匹配失败
内容的提问来源于stack exchange,提问作者Furk276
相关产品推荐
相关产品推荐

