You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python给PDF标记关键词并排除指定词汇?

基于PyMuPDF实现PDF关键词高亮并排除指定词汇的解决方案

核心思路

  1. 从关键词PDF提取词汇后,通过排除集合过滤掉不需要标记的功能词(如the、for等)
  2. 采用完整单词匹配规则,避免部分匹配导致的误高亮(比如避免"the"在"there"中被标记)
  3. 遍历原始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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:00:32