DeepTutor PDF 技能
在 Agent 沙箱中读写、提取、合并、加密 PDF 的办公技能:模型直接写 Python 脚本处理 .pdf 文件,覆盖文本/表格提取到水印、表单填写和页面渲染。
技能在沙箱 shell 中运行,仅依赖预装库,明确禁止 pip install 和网络 OCR,数据流透明(读输入 PDF、写相对路径输出),无凭据或外部副作用;扣分点:无显式用户确认环节、无回滚说明、发布方未经注册表验证、加密示例中的口令处理未涉及敏感信息提示。
指令自洽,按任务选库的决策树清晰,含失败诊断指引(读 stderr、换策略、不盲目重试)、验证步骤(重开输出确认字段/字数);扣分点:纯静态评审未执行,边界用例(损坏 PDF、超 大文件、多子字体 ttc 兼容)未经测试佐证,失败反馈质量仅有文档声明。
触发条件明确(用户上传 .pdf 或要求生成/编辑/抽取),能力边界罕见地诚实声明:无 OCR、网络关闭、soffice/pandoc 通常缺失时的降级路径;中文场景有专门的 CJK 字体注册方案(wqy 等 TrueType 路径)。扣分点:核心功能依赖沙箱预装字体和库,未验证在目标沙箱环境的实际可用性;frontmatter 的 requires 声明较简略。
结构分层良好:按任务分节、渐进披露、代码示例充分、已知限制(无 OCR、CFF 字体不支持、缺转换器)主动披露;依赖在 pyproject 中显式声明(pypdf/pdfplumber/reportlab/PyMuPDF),Apache-2.0 许可清晰。扣分点:SKILL.md 本身无版本号或变更记录,已知限制散落在正文中而非汇总 FAQ,维护责任仅能追溯到仓库整体。
覆盖 PDF 工作流的主要任务(抽取、建表、合并、加密、表单、渲染),示例可直接复用,对中文输出、扫描件、扁平表单等难点给出可操作方案,边际价值明显;扣分点:静态评审无法验证输出质量,示例假定库版本行为,输出仍需运行核验,比较收益仅有推理依据。
代码示例具体、可审计,依赖声明与 pyproject 交叉印证,仓库含 CI 工作流和测试目录但未见覆盖本技能关键路径的测试;扣分点:所有 claims 均为作者编写,无第三方执行证据,扫描件行为、字体回退等关键声明无法静态复现,静态上限 5。
- 静态评审未执行任何代码;示例(尤其表单填充和 CJK 字体注册)依赖沙箱内库与字体版本,使用前应在目标环境验证。
- 扫描版 PDF 无法 OCR 是硬性边界,含扫描页的文件只能得到部分结果,请提前确认输入类型。
- encrypt/decrypt 示例使用明文口令参数,敏感文档加密时注意口令不落入日志或会话记录。
- SKILL.md 无版本号与变更记录,升级 DeepTutor 时示例 API 行为可能随依赖版本变化。
这个 Skill 能做什么,适合哪些场景?
这是 DeepTutor 仓库内置的 PDF 处理技能(位于 deeptutor/skills/builtin/pdf/SKILL.md),属于其内置办公技能套件(docx/pdf/pptx/xlsx)之一。它本身不含可执行代码,而是一份指导文档:教模型按任务选择沙箱中预装的 Python 库——pdfplumber 提取文本/表格,pypdf 做合并、拆分、旋转、水印、加密和表单填写,reportlab 从零生成 PDF,PyMuPDF(fitz)把页面渲染成图片。只要用户上传 .pdf 或要求生成、编辑、抽取 PDF 数据,该技能就会被触发。它明确要求沙箱 shell 环境,且注明无 OCR、无网络,遇到扫描件应如实告知而非编造内容。
当用户上传或要求处理 .pdf 时,模型通过 exec 工具运行完整的 Python 脚本,产出文件或数据:用 pdfplumber 提取布局感知文本和表格(含导出 Excel、处理混乱表格的策略参数);用 pypdf 合并、按页拆分、旋转、裁剪、读取元数据、加/解密和打水印;检测 AcroForm 可填字段并填表,或对平铺表单用 FreeText 注释按坐标叠加文字;用 reportlab 的 Platypus 或 Canvas 从零生成带表格样式的报告,并注册 CJK TrueType 字体避免中日韩文字变豆腐块;用 PyMuPDF 把每页渲染为 PNG。技能还要求验证输出(如核对字数、重开文件确认表单值已写入),失败时诊断 stderr 并换策略,不得原样重试或擅自缩小任务范围。
- 研究者或学生上传带数据表的 PDF 报告,需要把表格批量抽取到 Excel 工作簿中做后续分析。
- 行政或财务人员需要合并多个 PDF、按页拆分、旋转页面或给文件加密码后分发。
- 需要填写政府或机构表单的用户:先检测是否为可填 AcroForm,否则在正确坐标上叠加文字。
- 内容创作者要求生成带标题、表格样式的中文报告 PDF,技能会先注册 CJK 字体避免乱码。
- 开发者或教师想把 PDF 页面转成图片,交给后续支持图像输入的步骤处理。
- 遇到扫描件(无可提取文本)时,技能指导模型如实说明无法 OCR,而不是编造内容。
这个 Skill 有哪些优点和局限?
- 按任务精确指派库(pdfplumber/pypdf/reportlab/PyMuPDF),避免模型乱选工具或重复安装。
- 覆盖 PDF 生命周期的常见操作:读、提取、建、合、拆、转、水印、加解密、填表、渲染成图。
- 对 CJK 字体、扫描件、平坦表单坐标换算等真实陷阱给出明确处理规则,强调不编造内容。
- 要求验证输出(核对字数、重开文件确认表单值),失败时换策略而非盲重试。
- 无 OCR 能力且沙箱无网络:扫描版 PDF 的文字完全无法提取,这是硬限制。
- 依赖沙箱预装的特定 Python 库;在其他环境使用时需自行安装 pdfplumber、pypdf、reportlab、PyMuPDF。
- Markdown/HTML 转 PDF 所需的外部转换器(soffice/pandoc)通常缺失,需降级用 reportlab 重建。
- 仅是一份指导文档,无打包脚本或测试;实际效果取决于宿主 LLM 遵循指令的能力。
如何安装这个 Skill?
该技能随 DeepTutor 主项目分发,无需单独安装:从源码克隆仓库(git clone https://github.com/HKUDS/DeepTutor.git)或 pip install -U deeptutor 后,内置技能位于 deeptutor/skills/builtin/pdf/。DeepTutor 的技能也可通过 deeptutor skill 命令或 Learning Space → Skills 从 EduHub 等中心管理。仓库未提供把这个单独技能复制到 Claude Code 等其他客户端的安装说明;由于它是标准 SKILL.md 格式,理论上可手动放入兼容客户端的技能目录,具体路径因客户端而异,源文档未说明。
如何使用这个 Skill?
在 DeepTutor 中,直接在聊天里上传 .pdf 或说"把这个 PDF 的表格导出成 Excel""合并这两个 PDF 并加密",技能即被触发;模型会用 exec 工具运行 Python 脚本并返回下载链接。前提是代码执行沙箱可用——本地/容器部署默认启用受限制的子进程沙箱,docker-compose 部署路由到加固的 runner sidecar;若设置 sandbox_allow_subprocess 为 false,办公技能将无法产出文件。表格转 Excel 示例:pdfplumber 逐页 extract_tables(),再用 openpyxl 每张表建一个工作表写入 tables.xlsx。