如何将PyMuPDF中的矩形位置转换为页码?
问题分析与解决
原代码的核心问题是:doc.select() 需要传入页码索引列表(从0开始),但你传入了文本搜索得到的矩形坐标列表,这就导致了 ValueError: bad page number(s) 错误。同时代码逻辑还存在其他问题:比如 doc.select() 和 doc.save() 放在了遍历PDF文件的循环外,只会处理最后一个打开的PDF,且没有收集需要保留的页码。
修正步骤
- 针对每个PDF文件,单独收集包含目标文本的页码索引
- 确保
doc.select()和保存操作在单个PDF文件的处理循环内 - 避免覆盖原文件,给处理后的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
相关产品推荐
相关产品推荐

