pdf-processor
PDF 处理工具,支持扫描件预处理、OCR 双层 PDF、页码添加、PDF 合并、解密、水印去除和压缩。本技能应在用户需要一键处理、优化或整理 PDF 文档时使用。不要用于:纯文本 PDF 内容编辑、PDF 阅读与批注、电子签名、非压缩目的的格式转换。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
PDF 处理工具,支持扫描件预处理、OCR 双层 PDF、页码添加、PDF 合并、解密、水印去除和压缩。本技能应在用户需要一键处理、优化或整理 PDF 文档时使用。不要用于:纯文本 PDF 内容编辑、PDF 阅读与批注、电子签名、非压缩目的的格式转换。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Multica 工作区 Skill 批量同步工具。按来源清单(GitHub / ClawHub / skills.sh / 本地文件)把 skill 批量导入或更新到 Multica skill 数据库,支持 init / update / plan 三种模式。同步目标是 Multica 数据库,不是本地 `.codebuddy/skills/`。
本技能应在 GitHub 项目发布新版本时使用,覆盖版本号管理、CHANGELOG 同步、Release Notes 撰写、tag 创建、CI 构建监控、发布验证和历史清理全流程。适用于桌面应用、CLI 工具、Web 应用、库/SDK 等任何基于 GitHub 的软件项目。当用户提到"发布"、"release"、"打 tag"、"新版本"、"更新版本号"、"写 release notes"、"发布失败了"、"CI 挂了"、"Actions 配额告急"、"短时间内多次发版"、"monorepo"、"批量打包"、"多 skill 发布"、"skill zip"时触发。也用于拒绝把 release 当作 CI 验证机制("打 tag 看一下")的反模式场景。不要用于非 GitHub 项目(如纯 GitLab / Gitea 项目)或无需 CI 的手动发布场景。
钉钉 AI 听记(妙记)读取封装。当用户要查询/读取 AI 听记的列表、摘要、语音转写原文(逐字稿)、关键词、待办或音频地址时使用。基于 dws CLI(钉钉官方 Workspace CLI)。写文档走 dingtalk-doc,建待办走 dingtalk-todo,日程走 dingtalk-calendar。
WorkBuddy 每日积分自动签到。自动解密本地登录令牌,调用官方签到 API 完成每日积分领取(100 积分/天,连续第 7 天 1000 积分),并支持配置定时任务。触发词:WorkBuddy 签到、每日积分、check-in、credits。
本技能应在用户需要基于案件材料、咨询材料、合同资料、证据材料或检索结果进行法律分析、案件研判、风险评估、诉讼策略、刑事案件研判与审查起诉分析、非诉风险判断、客户说明或法律分析报告时使用。它是法律任务的前置分析引擎,不要求每次都生成正式报告。不要用于:单纯 OCR、单纯法条案例检索、单纯 Word 排版转换、仅需包装服务方案且无需新增法律分析的文档生成。
智能 Git 批量提交快捷按钮。触发词:"git 提交"、"批量提交"、"拆分提交"、"整理提交",或用户明确要把已暂存变更拆成多个聚焦 commit 时使用。只负责 commit 拆分和提交信息生成;分支、PR、push、merge、Issue 关闭语义以 git-workflow 为准。提交完成后,若仓库内存在 clawhub-sync 或 subtree-publish 配置,本技能会提示是否将涉及版本更新的技能同步发布到 ClawHub/SkillHub 或推送 subtree 独立仓库——这些发布/推送动作均需用户显式确认。
| name | pdf-processor |
| homepage | https://github.com/cat-xierluo/legal-skills |
| author | 杨卫薪律师(微信ywxlaw) |
| version | 2.10.2 |
| description | PDF 处理工具,支持扫描件预处理、OCR 双层 PDF、页码添加、PDF 合并、解密、水印去除和压缩。本技能应在用户需要一键处理、优化或整理 PDF 文档时使用。不要用于:纯文本 PDF 内容编辑、PDF 阅读与批注、电子签名、非压缩目的的格式转换。 |
| license | MIT |
本技能是 PDF 处理的统一入口,覆盖扫描件预处理、OCR 双层 PDF 生成、页码添加、PDF 合并、解密、水印去除和压缩。优先保护原始文件,按用户意图选择最短可用流程。
核心职责:
本技能不做纯文本 PDF 内容编辑、PDF 阅读批注、电子签名、非压缩目的的格式转换。
_1、_2 等序号。ocrmypdf 默认直接保留原 PDF,只有 MinerU 或显式图像处理请求才走统一栅格预处理。auto 在已配置时默认优先 PaddleOCR API,再尝试 MinerU,最后回退本地 ocrmypdf;明确禁止外传的材料必须使用 --local-only。--force-raster-preprocess。--preprocess-only。python3 scripts/pdf-preprocess-ocr.py --input input.pdf --output output.pdf
auto 选中已配置的 PaddleOCR 时,默认把原 PDF 直接送给 PP-OCRv6,跳过统一栅格化和 OCR 前压缩,以保留扫描分辨率、图像层和 API 坐标空间;实际后端确定为本地 ocrmypdf 时同样保留原扫描页,并使用 OCRmyPDF 自带的方向检测、纠偏和清理。MinerU 或显式预处理路径仍以 medium 的 200 DPI、JPEG 质量 72、色度子采样 1 为目标,并以 25MP 保护异常大画布。确需裁剪或统一重栅格化时使用 --enable-crop 或 --force-raster-preprocess。电子/混合 PDF 自动保留原有层。文件大小限制很严时使用:
python3 scripts/pdf-preprocess-ocr.py --input input.pdf --output output.pdf --compress-level high
确需保留超大栅格时可显式调高上限;--max-preprocess-megapixels 0 会关闭保护,但可能显著增加内存占用和 OCR 跳页风险。
敏感材料用统一入口但禁止外传:
python3 scripts/pdf-preprocess-ocr.py --input input.pdf --output output.pdf --local-only
页面方向已正确的大批量扫描件可提速:
python3 scripts/pdf-preprocess-ocr.py --input input.pdf --output output.pdf \
--skip-coarse-rotation --preprocess-jobs 6 --preprocess-chunk-pages 80
python3 scripts/pdf-preprocess-ocr.py --input input.pdf --output output.pdf --preprocess-only
只做页面矫正、不压缩、不 OCR:
python3 scripts/pdf-preprocess-ocr.py --input input.pdf --output output.pdf \
--preprocess-only --no-compress
python3 scripts/pdf-ocr.py --input input.pdf --output output.pdf
默认后端为 auto:已配置 PaddleOCR 时先用 PP-OCRv6 的行级坐标生成文字层,再按 OCR_API_ORDER 尝试 MinerU;外部服务失败或未配置时回退本地 ocrmypdf。该默认路径会上传完整 PDF,不允许外传时使用:
python3 scripts/pdf-ocr.py -i input.pdf -o output.pdf --local-only
--allow-external-upload 仅为旧命令兼容参数,不再控制后端选择。Paddle 的服务端方向矫正和去畸变默认关闭,避免 OCR 坐标与原图空间不一致。
# 强制本地兜底
python3 scripts/pdf-ocr.py -i input.pdf -o output.pdf --backend local_ocrmypdf
# 强制 PaddleOCR API;PP-OCRv6 是双层 PDF 默认模型
python3 scripts/pdf-ocr.py -i input.pdf -o output.pdf \
--backend paddle_api --paddle-model PP-OCRv6
# 干净扫描件/表格可试 PP-StructureV3 的 overall_ocr_res 行级坐标
python3 scripts/pdf-ocr.py -i input.pdf -o output.pdf \
--backend paddle_api --paddle-model PP-StructureV3
# 强制 MinerU API
python3 scripts/pdf-ocr.py -i input.pdf -o output.pdf --backend mineru_api
# 显式保存 OCR 可读文本和运行元数据;默认不归档案件材料
python3 scripts/pdf-ocr.py -i input.pdf -o output.pdf --archive-results
后端选择、API 配置和协议细节见 references/ocr-backend-guide.md、references/paddleocr-api-guide.md、references/mineru-api-guide.md。
PaddleOCR-VL-1.5/1.6 也可解析,但只提供块级坐标,文字层定位粒度低于 PP-OCRv5/v6 / PP-StructureV3。本技能不接入 Qwen/GLM 等视觉识别链路,也不宣称云端结果含字符级坐标。
PP-OCRv6 文字模型默认开启 --actualtext:文字层生成后再调一次 PP-StructureV3 拿版面,融合出自然段并以 /ActualText marked-content 写入 PDF,让从 PDF 复制的文字按段落连续而非按物理行断行。--no-actualtext 可关闭;--layout-dump FILE 复用已有版面 dump 避免二次 API 调用。阅读器兼容性见下文第 4 节。
双层 PDF 的文字层按行叠层(保护选区坐标精度),直接从 PDF 复制会按物理行断行。解决方式有两条:
默认:/ActualText + 独立 Markdown。 --actualtext(默认开启)把自然段写入 PDF 的 /ActualText marked-content,同时保留行级字形坐标。实测各阅读器支持:
| 提取方式 | 从 PDF 复制的段落连续性 |
|---|---|
Poppler(pdftotext -raw、pdftotext 默认) | ✅ 整段连续,无换行 |
| PyMuPDF、pypdf、macOS 预览(PDFKit) | ❌ 仍按物理行断行 |
因此 Poppler 用户能直接从 PDF 拿到段落级文本;macOS 预览用户复制仍会断行,需用独立 Markdown(pdf_ocr_paragraphs.py 输出的 clean.md)作为段落文本交付。个别自然段若跳过被排除的行(如印章碎片),因物理行不连续无法包裹,会降级为行级(文字不丢失,仅该段复制按行断行)。
需要解决复制文本中的段内回车、多余空行和印章文字时,采用两模型分工:PP-OCRv6 提供主要行级文字及坐标,PP-StructureV3 提供阅读顺序、区域类型和 seal 区域。只有 v6 行置信度低于 0.80、Structure 对应行置信度不低于 0.90、双方坐标高度重合且后者至少高 0.10 时,才采用 Structure 的行级文字兜底;始终不读取版面块文字,也不调用大语言模型。
Structure 的块边界只作为候选而非强制段界:融合器先合并同一视觉行的碎片,在 text 区域内按行距、缩进和右边界恢复物理换行,再依据句末标点和条款编号跨相邻文本块连接正文;table 区域按视觉行保留单元格次序并用 | 分隔。这样可处理 Structure 高覆盖但正文块过度切碎的页面。
需要独立 Markdown、自定义 dump 审查或复用已有版面 dump 时,用以下四步法(主流程已默认自动完成等价工作):
# 1. 获取文字真值(--dump-and-pdf 同时出 dump 和双层 PDF)
python3 scripts/pdf-ocr.py -i input.pdf -o output.pdf \
--backend paddle_api --paddle-model PP-OCRv6 \
--ocr-dump /tmp/text.json --dump-and-pdf
# 2. 获取版面结构
python3 scripts/pdf-ocr.py -i input.pdf -o unused.pdf \
--backend paddle_api --paddle-model PP-StructureV3 --ocr-dump /tmp/layout.json
# 3. 生成自然段文本,同时输出不含正文的诊断和已过滤文字层 dump
python3 scripts/pdf_ocr_paragraphs.py \
--text-dump /tmp/text.json --layout-dump /tmp/layout.json \
--output /tmp/clean.md --diagnostics /tmp/paragraphs.json \
--filtered-dump /tmp/text-filtered.json
# 4. 用过滤后的行级坐标生成双层 PDF
python3 scripts/pdf-ocr.py -i input.pdf -o output.pdf \
--backend paddle_api --ocr-resume /tmp/text-filtered.json
诊断中的 layout_coverage 低于 0.75 时自动退回纯几何规则;同时查看 structure_text_fallbacks 和 layout_boundary_merges,确认低置信替换与跨块合并均可审计。只有 Structure 明显漏块、区域类型错误或阅读顺序错误,且纯几何回退仍不能恢复时,才另测 PaddleOCR-VL-1.5 作为 --layout-dump;VL-1.6 不作为默认兜底。全文、dump 与账号等敏感信息继续只放临时目录,除非用户明确要求归档。
# 手动旋转
python3 scripts/pdf-rotate.py --input input.pdf --output output.pdf --angle 90
# 解密
python3 scripts/pdf-decrypt.py --input input.pdf --output output.pdf
python3 scripts/pdf-decrypt.py --input input.pdf --output output.pdf --password 123456
# 去水印
python3 scripts/pdf-remove-watermark.py --input input.pdf --output output.pdf
# 压缩
python3 scripts/pdf-compress.py -i input.pdf -o output.pdf --level medium
# 加页码
python3 scripts/pdf-add-page-numbers.py -i input.pdf -o output.pdf
# 合并
python3 scripts/pdf-merge.py -i file1.pdf file2.pdf file3.pdf -o merged.pdf
python3 scripts/pdf-merge.py -i file1.pdf file2.pdf -o merged.pdf --add-numbers --continuous
页码、合并、压缩等详细参数见 references/pdf-workflows.md。
pip install pymupdf pypdf pillow numpy opencv-python pdf2image
macOS:
brew install poppler
Linux:
sudo apt-get install poppler-utils
pip install ocrmypdf
macOS:
brew install tesseract tesseract-lang
Linux:
sudo apt-get install tesseract-ocr tesseract-ocr-chi-sim
完整可选依赖清单见 references/optional-dependencies.txt。历史保留的本地 Paddle 双层实现已拆到 scripts/pdf_ocr_paddle_local.py,不属于默认生产链路;需要实验时再安装 paddleocr paddlepaddle 并单独接入。
python3 scripts/pdf-ocr-quality-check.py \
-i input.pdf -o output.pdf --keywords 合同,法院
python3 scripts/pdf-ocr-benchmark.py \
-i input.pdf \
--backend local_ocrmypdf \
--sample-pages 5 \
--skip-coarse-rotation \
--preprocess-jobs 6 \
--preprocess-chunk-pages 80
关键词门禁会先做 NFKC、大小写和空白归一化,避免中文 OCR 在汉字间插入空格后被误判为未命中;CER 仍按独立参考文本计算。
常见问题见 references/troubleshooting.md。