PyMuPDF(fitz)操作PDF插入关键词图片报Document无searchFor属性错误
报错根因
searchFor是PyMuPDF库中单页Page对象的文本搜索方法,你的代码中把整个Document文档对象赋值给page变量后直接调用方法,自然找不到对应属性。另外新版PyMuPDF已经将驼峰格式的旧APIsearchFor重命名为蛇形格式的search_for,旧方法在高版本中已经被移除。- 原有代码存在多处逻辑错误:遍历PDF路径字符串而非文档内页、提前搜索空字符串再固定判断文本值、输出路径未指向原文件所在目录、未做文件选中校验容易触发空路径报错。
修正后完整代码
import os import fitz from tkinter import filedialog # 弹出文件选择框选PDF main_win.sourceFile = filedialog.askopenfilename( parent=main_win, initialdir="/", title="请选择要处理的PDF文件", filetypes=[("PDF文件", "*.pdf")] ) # 未选择文件直接终止流程 if not main_win.sourceFile: exit() # 加载选中的PDF文档 document = fitz.open(main_win.sourceFile) # 配置项:印章路径、插入位置、输出文件名 orange_stamp = "Orange county stamp.png" hillsborough_stamp = "Hillsborough county stamp.png" # 图片放置的矩形区域坐标,可根据印章实际尺寸调整 stamp_rect = fitz.Rect(55, 28, 180, 390) # 拼接原文件所在目录下的输出路径 source_dir = os.path.dirname(main_win.sourceFile) output_path = os.path.join(source_dir, "处理完成.pdf") # 逐页扫描处理 for page in document: # 检测当前页是否包含目标关键词 has_orange = page.search_for("Orange County") has_hillsborough = page.search_for("Hillsborough county") if has_orange: page.insert_image(stamp_rect, filename=orange_stamp) if has_hillsborough: page.insert_image(stamp_rect, filename=hillsborough_stamp) # 保存文件并释放资源 document.save(output_path) document.close()
使用注意事项
- 运行前先安装依赖:执行命令
pip install pymupdf,不要单独安装名为fitz的第三方包,会出现API冲突。 - 两个印章图片请和脚本放在同一目录下,或者填写图片的完整绝对路径,否则会触发文件找不到错误。
- 如果需要忽略关键词大小写匹配,可以先提取页面全量文本转小写后再做匹配,比如用
page_text = page.get_text().lower()判断关键词小写是否在文本内即可。 - 若同一页同时包含两个关键词,代码会在该页插入两个印章,如有优先级需求可自行调整判断逻辑。
内容的提问来源于stack exchange,提问作者Zac
相关产品推荐
相关产品推荐

