整理报名资料、培训讲义或活动附件时,经常会遇到页序不对、某一页横过来、合并以后漏页等问题。与其反复手工拖动再凭感觉保存,可以让 PDF Skill 按明确规则协助处理,并留下可复查的页序清单。

本文用三页虚构的活动资料练习:输入依次是封面、检查清单、附件,附件带有顺时针 90 度的页面旋转属性。目标是输出“封面、附件、检查清单”,并让附件恢复正常方向。你会得到一份不覆盖原文件的页序调整脚本,以及页数、内容和方向的验收方法。

下面的 Python 处理与文件检查已在原创样本上运行,使用 pypdf 6.21.4;没有调用大模型,也不声称安装插件后所有 PDF 都能自动处理。复杂表单、电子签章和损坏文档不属于本练习范围。

一、PDF Skill 具体负责什么

Anthropic 官方仓库中的 skills/pdf 提供 PDF 任务的说明与辅助资料,覆盖阅读、提取、合并、拆分、旋转、表单及扫描件 OCR 等场景。它帮助支持技能机制的工具选择处理步骤,不是一个双击即可运行的 PDF 编辑器。

实际处理仍要依靠环境中的库和命令。本例仅使用 pypdf 调整页序与页面旋转,不需要启动 Web 服务、不需要数据库,也不需要为了三页练习安装整个 OCR 工具链。缺少依赖时应明确安装哪一个,而不是复制执行仓库里所有脚本。

阅读技能入口后,表单任务再看相应表单文档,进阶任务再看参考资料。下载包里有这些文件,不代表每次都需要加载全部内容;先明确任务范围,反而更容易检查输出。

二、安装入口与下载包说明

在支持插件的 Claude Code 中,可按官方 README 添加市场并安装文档技能插件:

/plugin marketplace add anthropics/skills
/plugin install document-skills@anthropic-agent-skills

安装后按工具提示启用,开始新会话时明确要求使用 PDF Skill。若环境不能识别上述命令,先核对工具和插件支持情况,不要把插件命令粘贴到普通 PowerShell 当作系统命令执行。

本文资料表的百度下载入口复用本站已核验的 Anthropic Skills 完整源码包,不是新制作的 PDF 独立安装器。解压后定位 skills-HEAD/skills/pdf/SKILL.md,保留同目录的许可证、参考文档和脚本。包内 PDF 技能说明与本次核对的官方内容一致。

源码包版本与 Python 库版本是两件事。资料表显示包的真实来源版本;运行脚本时另外记录 pypdf 版本,不能把“技能包更新”当成“全部依赖自动升级”。PDF 目录的许可证随包保留,其他目录和第三方依赖应分别查阅,不能用一个目录的许可概括所有文件。

三、给智能体一个可执行的任务边界

先创建测试目录,把一份有权处理的普通 PDF 命名为 input.pdf。本例严格要求三页,目的是避免把教学页码规则误套到其他文件。真实资料应先列出页标题和目标顺序,再修改规则。

没有合适材料时,可以下载本站原创三页练习样本与脚本。它包含 input.pdf、reorder_pdf.py 和使用说明,不含客户资料,也不是 Skill 安装包。解压到独立目录,先阅读脚本,再按下文安装 pypdf 并运行;三页样本已经设置好本文要求的旋转属性。

请使用 PDF Skill,先检查 input.pdf,不修改原文件。
本例必须正好三页,且第三页的页面旋转属性为90度。
输出顺序是原第1页、原第3页、原第2页。
只把原第3页顺时针再转270度,输出到 review-copy.pdf。
如果输出文件已存在、页数或旋转属性不符合约定,就停止。
完成后报告输入输出页数、每页标题、方向和原文件校验值。
不要声称已检查电子签章、表单或所有阅读器兼容性。

这段要求包含输入、前置条件、操作、输出与停止条件。没有事先约定页序,智能体即使生成了能打开的文件,也无法证明它符合你的资料要求。

PDF三页资料从原始顺序到目标顺序并修正附件方向的示意

四、准备 Python 环境

如果电脑已经有 Python,可在单独的练习目录建立虚拟环境。Windows PowerShell 示例:

python -m venv .venv
.\.venv\Scripts\python.exe -m pip install pypdf
.\.venv\Scripts\python.exe -c "import pypdf; print(pypdf.__version__)"

这里直接调用虚拟环境中的解释器,不要求改变 PowerShell 执行策略。安装发生在该环境中;如果网络或组织策略阻止安装,应按环境规定处理,不关闭安全设置绕过限制。

确认 input.pdf 与下面保存的 reorder_pdf.py 位于同一目录。先用阅读器查看三页标题与当前方向,再关闭占用输出文件的窗口。若样本没有第三页旋转属性,不要强行运行后把报错当作故障;它是在提醒输入与约定不符。

五、运行一个不覆盖原件的脚本

下面代码由本站为教学任务编写,不是要求运行下载包里的未知脚本。它读取固定的单个文件,不扫描文件夹、不上传资料,也不删除任何文件。

from pathlib import Path
import hashlib
from pypdf import PdfReader, PdfWriter

source = Path("input.pdf")
target = Path("review-copy.pdf")
before = hashlib.sha256(source.read_bytes()).hexdigest()
reader = PdfReader(source)
if reader.is_encrypted:
    raise ValueError("本练习不处理加密文件")
if len(reader.pages) != 3:
    raise ValueError("本练习要求输入正好三页")
if reader.pages[2].rotation % 360 != 90:
    raise ValueError("第三页旋转属性与约定不符")

writer = PdfWriter()
order = [0, 2, 1]
for source_index in order:
    page = writer.add_page(reader.pages[source_index])
    if source_index == 2:
        page.rotate(270)

with target.open("xb") as stream:
    writer.write(stream)

after = hashlib.sha256(source.read_bytes()).hexdigest()
if before != after:
    raise RuntimeError("原文件校验值发生变化,请停止检查")
output = PdfReader(target)
print("输入页数:", len(reader.pages))
print("输出页数:", len(output.pages))
print("原文件SHA256:", after)
for number, page in enumerate(output.pages, 1):
    text = (page.extract_text() or "").strip()
    print(number, "旋转:", page.rotation % 360,
          "文字预览:", text[:60].replace("\n", " / "))

保存后执行:

.\.venv\Scripts\python.exe reorder_pdf.py

人们说“第 1 页”时,Python 列表对应索引 0,因此 [0, 2, 1] 表示原第 1、3、2 页。rotate(270) 是在现有旋转基础上继续顺时针旋转;本例先确认原值为 90,合计后等效为 0。不要把它理解为对所有歪斜扫描图像进行自动校正。

xb 表示只创建新文件。若 review-copy.pdf 已存在,脚本应报错而不是覆盖。重新练习时更换输出名称或手工保留旧结果,不需要添加自动删除逻辑。

六、验收不能只看“成功保存”

先看程序报告:输入和输出都是三页,原文件校验值一致,输出旋转依次为 0、0、0。本例原创样本的页面文字标识依次应为 COVER、APPENDIX、CHECKLIST。这些是便于核对的英文教学标签,真实材料应使用你自己的页标题。

再用阅读器逐页查看输出。检查封面是否完整、附件有没有倒置、清单是否被裁掉、页面尺寸是否意外变化。文字提取能用于定位标题,但不能证明印章、图片、细线和排版都正确。程序检查与视觉检查要同时保留。

本站对该三页样本检查了页序、方向、文字标识和原件哈希,并把结果渲染成图片检查。没有据此宣称所有带表单、目录书签或签章的文档也能完整保留。本代码创建的是基础页面副本,不承担复杂文档结构迁移。

PDF输出的页数页序方向与原件保留四项验收清单示意

七、把失败当作可解释的检查结果

输入少一页或多一页,应该停止并重新确认页码,而不是截取前三页假装任务成功。第三页旋转属性不为 90,也应停止:视觉横向可能来自页面内容本身,不是页面旋转属性;这两类问题的处理不同。

输出已存在时,保留原有结果。输入是加密文件时,本练习不会尝试破解或移除保护;有授权的真实任务也应另外明确密码提供和处理范围。路径错误则检查当前工作目录、扩展名和文件是否实际存在,不让工具遍历整台电脑找资料。

如果 PDF 能打开但提取文字为空,可能是图片页。调整页序本身不需要先 OCR;只有后续需要搜索或提取文字时,才另外评估识别步骤。OCR 的准确性也不属于“页数和方向通过”能够证明的事情。

若写出过程中异常留下不完整副本,应把它标记为失败产物,不交付。保留原件、异常信息和运行版本后,再由操作者决定怎样清理;不要用“文件存在”作为成功信号。

八、从三页练习迁移到实际工作

真实任务先建立页序清单,写明原页号、原页标题、目标页号与是否需要旋转。长文档可以分段处理,但每一段都要能回到同一份源文件;不同版本资料不能混用页码。

还要事先决定文件命名方式。例如用“活动资料-页序复核版-01”标明处理目的,用运行记录保存日期与来源,不把多个结果都叫“最终版”。先把新副本放到待审核目录,检查完成后再转交,不让尚未验收的文件混进正式资料。

验收记录不需要很复杂,可以逐行填写“原第几页到了新第几页、标题是否一致、方向是否正常、是否发现裁切”。三页都通过再把整份文档标记为通过。如果其中一页不合格,记录具体页号与问题,重新生成后复查全部三页,避免只盯着修过的那页。

哈希值用于确认两次读取到的原件字节一致,不能证明文件来源可信,也不能代替恶意文件检查。对来自不明来源的附件,应先按现有安全流程判断能否打开,不因它有一个校验值就降低警惕。处理规则、输出与核验记录要一起保存,才能让下一位操作者明白这份文件是怎样产生的。

交付时至少保留原件、输出副本、规则与检查记录。多人协作还应确认谁批准页序、谁检查视觉内容、谁可以发送最终文件。涉及签章、交互表单和可访问性结构时,另选适合的专门流程与验证工具,不把本练习扩展成未验证的万能方案。

官方参考资料