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

如何将PyMuPDF中的矩形位置转换为页码?

问题分析与解决

原代码的核心问题是:doc.select() 需要传入页码索引列表(从0开始),但你传入了文本搜索得到的矩形坐标列表,这就导致了 ValueError: bad page number(s) 错误。同时代码逻辑还存在其他问题:比如 doc.select() 和 doc.save() 放在了遍历PDF文件的循环外,只会处理最后一个打开的PDF,且没有收集需要保留的页码。

修正步骤

  1. 针对每个PDF文件,单独收集包含目标文本的页码索引
  2. 确保 doc.select() 和保存操作在单个PDF文件的处理循环内
  3. 避免覆盖原文件,给处理后的PDF设置新文件名

修正后的代码

from pathlib import Path
import fitz

directory = "pdfs"
target_text = "Exam"

# 遍历目录下所有PDF文件
for file in Path(directory).glob('*.pdf'):
    doc = fitz.open(file)
    keep_pages = []  # 保存需要保留的页码索引(从0开始)
    
    for page in doc:
        text_instances = page.search_for(target_text)
        if text_instances:  # 当前页面找到目标文本
            keep_pages.append(page.number)  # 记录页码索引
            # 高亮目标文本
            for inst in text_instances:
                highlight = page.add_highlight_annot(inst)
                highlight.update()
    
    if keep_pages:  # 仅当找到目标文本时才保存结果
        doc.select(keep_pages)
        # 生成不重复的输出文件名
        output_file = Path(directory) / f"filtered_{file.name}"
        doc.save(output_file, garbage=4, deflate=True, clean=True)
    doc.close()  # 关闭文档释放资源

关键说明

  • page.number 获取的是当前页面的索引(PyMuPDF中页码从0开始,完全匹配doc.select()的参数要求)
  • 仅将找到目标文本的页面加入保留列表,避免生成空文档
  • 遍历文件时明确筛选.pdf后缀,防止打开非PDF文件引发错误
  • 每个PDF处理完成后关闭文档,避免资源泄漏

内容的提问来源于stack exchange,提问作者GCIreland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:20:38