PyMuPDF的deflate参数与Adobe Acrobat Reader兼容问题
PyMuPDF脱敏PDF与Adobe Acrobat兼容问题
背景
我使用PyMuPDF开发PDF敏感信息脱敏程序,为避免脱敏后文件过大,保存时使用以下参数:
doc.save( file_path, permissions=fitz.PDF_PERM_PRINT, owner_pw="owner", encryption=fitz.PDF_ENCRYPT_AES_256, garbage=3, deflate=True )
脱敏后的PDF需用Adobe Acrobat Reader 2021.007.20099版本打开。
问题现象
用Acrobat打开部分脱敏文件时,会弹出错误提示:
此页面存在错误。Acrobat可能无法正确显示页面。
请联系创建此PDF文档的人员以解决问题。
点击“确定”后文件可正常查看,但用浏览器打开无异常。由于无法修改默认打开方式,必须解决该兼容问题。
调试发现
- 将
deflate参数设为False可消除报错,但脱敏后文件大小有时会增至原文件的10倍,不符合需求。 - 根据PyMuPDF官方文档,
deflate用于压缩未压缩流;garbage参数对报错无影响,其余参数为必需项无法修改。 - 推测问题可能与重复脱敏同一坐标有关,但部分同类情况并未触发报错。
复现步骤
- 将脱敏脚本
redact_pdf.py与待脱敏文件test_file.pdf放在同一目录 - 执行命令:
python redact_pdf.py test_file.pdf
脱敏脚本代码(redact_pdf.py)
import sys import fitz def redact_pdf(file_path: str) -> None: """ 本脚本会将所有包含"XX"的文本块脱敏:删除原文本,并用黑色矩形覆盖其所在的边界框。 脱敏后的PDF文件命名规则为原文件名+"_ANON.pdf"。 参数: file_path: 待脱敏文件的路径,通过命令行参数传入 返回: None """ try: doc = fitz.open(file_path) redacted = False for page in doc: page.wrap_contents() blocks = page.get_text("blocks") for block in blocks: if "XX" in block[4]: page.add_redact_annot(block[:4], fill=(0, 0, 0)) if page.apply_redactions(images=fitz.PDF_REDACT_IMAGE_REMOVE): redacted = True if redacted: file_path = file_path.replace(".pdf", "_ANON.pdf") doc.save( file_path, permissions=fitz.PDF_PERM_PRINT, owner_pw="owner", encryption=fitz.PDF_ENCRYPT_AES_256, garbage=4, deflate=True ) print("脱敏文件已生成:", file_path) else: print("未检测到需脱敏内容") except BaseException as err: exc_type, exc_obj, exc_tb = sys.exc_info() print(f"{type(err)} (第 {exc_tb.tb_lineno} 行): {err}") if __name__ == "__main__": redact_pdf(sys.argv[1])
内容的提问来源于stack exchange,提问作者junsuzuki
相关产品推荐
相关产品推荐

