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

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参数对报错无影响,其余参数为必需项无法修改。
  • 推测问题可能与重复脱敏同一坐标有关,但部分同类情况并未触发报错。

复现步骤

  1. 将脱敏脚本redact_pdf.py与待脱敏文件test_file.pdf放在同一目录
  2. 执行命令: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:00:52