一个基于 PyMuPDF 的命令行工具,用于从 PDF 文件中删除指定作者的所有批注(高亮、下划线、注释等),同时保留其他作者的批注与表单控件。
- 🎯 按作者名精确删除批注(大小写不敏感)
- 📁 支持单个 PDF 文件或整个文件夹批量处理
- 🔒
-r/--replace模式采用「临时文件 + 原子替换」,避免中途失败损坏原文件 - 🛡️ 自动跳过表单控件(
Widget),不影响 PDF 可填写表单 - 📄 无匹配批注时不改写文件,并给出清晰提示
- 💬 中文友好的命令行输出与错误提示
- Python 3.10+
- PyMuPDF ≥ 1.20
安装依赖:
pip install PyMuPDFpython script.py [选项] <作者名> <输入路径> [输出路径]
| 选项 | 说明 | 语法 |
|---|---|---|
-n, --new |
(默认) 输出模式:把清洗后的 PDF 输出到目标位置 | [input_path] [output_path] |
-r, --replace |
替换模式:直接在输入位置覆盖原文件 | [input_path] |
-h, --help |
显示帮助信息 | — |
| 参数 | 说明 |
|---|---|
author |
要删除的批注作者名(存储在批注的 title 字段中) |
input_path |
输入 PDF 文件或文件夹路径 |
output_path |
输出文件或文件夹路径(仅 -n/--new 模式需要) |
# 1. 单个文件 → 输出到指定文件(默认模式)
python script.py john ./in.pdf ./out/out.pdf
# 2. 处理整个文件夹 → 输出到目标文件夹(自动创建,文件名加 _cleaned 后缀)
python script.py --new john ./pdfs ./cleaned
# 3. 直接替换原文件(原子替换,安全)
python script.py -r john ./pdfs💡 提示:批量输入文件夹时,输出文件夹中会生成
<原文件名>_cleaned.pdf;若输入为单个文件且output_path以💡 提示:文件夹模式仅处理顶层目录中的 PDF 文件,不会递归扫描子目录。
PDF 批注的作者名由 PyMuPDF 存放在 annot.info["title"] 字段中。脚本遍历每一页的批注链表,对作者名匹配(lower() 后比较)的批注调用 page.delete_annot() 删除:
- 只处理真正的批注对象(
fitz.Annot),跳过表单控件(fitz.Widget) - 遍历时先保存下一个节点的引用,防止删除后丢失链表
- 保存时使用
garbage=3清理无用对象并压缩输出
⚠️ 注意:delete_annot()只删除批注标记(高亮、下划线、注释框等),不会删除被标记的正文文字。若需抹除 PDF 中的实际文字内容,请使用支持 redaction(红action/涂抹)功能的工具。另外,garbage=3会全量重写文件,可能破坏已有的数字签名,且对大型文件较慢。
pdf_specific_author_annotation_remover/
├── script.py # CLI 主脚本
├── README.md
├── LICENSE # MIT 许可证
└── .gitignore