Skills Directory 收录的技能 scan-to-vector,在其 SKILL.md 里把用途写成:把扫描或拍照的页面(作业纸、表格、图表、流程图、手册、书页、多页文档)重建为一份新排版 PDF。文字是真实、可搜索的文字,图表走矢量,版式跟原件对齐,并且不虚构内容。同一份说明把「完成」收成四项检查,并给出从草稿、校对、差异图到重建交付的固定步骤。
SKILL.md 写明,报告成功之前要核对全部四项:
说明把这样做的理由分成三点。草稿负责它所谓的机械部分:一条命令把照片压平、把页面摆正、把光线拉匀,并把文字读两遍;每个词按测到的位置、字号和字重摆放,规则线、阴影和填充被画出来,其余的线、箭头、轮廓和图表序列被描成矢量形状。人要做的是脚本判断不了的事:读 OCR 存疑的词,以及核对。草稿会把每个存疑词裁出来放大,集中到该页的一张图上,避免对着整页小字猜测。它还强调「看起来对」不等于「就是对」:每次重建都要和扫描件比较,报告会列出缺了什么、放错了什么。
SKILL.md 把运行环境写成:PY 是装有 PyMuPDF、Pillow、numpy、scipy 的 Python,并且系统里要有 tesseract 命令。S 是该技能所在文件夹。
第一步是一次给所有页面出草稿,命令为 PY S/scripts/draft.py page1.jpg [page2.jpg ...] --out work --pdf out/rebuilt.pdf。它为每一页写出 work/pNN/,并写出 work/report.md,文字按阅读顺序、分栏排列。照片会被压平并对齐到最接近的标准纸张尺寸;页面上若有方形复选框,会用来校正。若报告说某页比例含糊,应先核对一个已知比例的形状再校对,必要时只用 --paper 3=letter 这类参数重做该页。书、收据和其他非常规尺寸要加上 --paper none。
第二步按页打开 work/pNN/compare/words.png。每个裁剪都带编号,下面是当前读数。读错了,把正确文字按编号写入 work/pNN/fixes.json;若该读数根本不是文字,用 "" 删掉。标记为 ?、表示墨迹尚未画出时,如果它是文字,就按报告里框的位置补上:x 为左缘,baseline 为不含下伸部分的字母底部,字号取相邻行在 probe.json 里的 size_px。SKILL.md 给出的修正示例同时包含改词、删读数和新增文字(可带斜体)。无法辨认的文字不得猜测,应保留原读数并列为不确定。
第三步看 work/pNN/compare/diff.png。红色表示扫描上有、图上没画;蓝色表示画了、但扫描对应处是空白。不是文字的红或蓝要放大看,命令是 PY S/scripts/zoom.py work/pNN/deskewed.png X0 Y0 X1 Y1 --grid 50 --out work/zoom.png。描出的形状、填充和规则线在 draft.json 的 shapes、fills、rules 里,斑点和阴影这类杂线在这里删。若希望轮廓更好编辑,可以用干净的 c.line、c.ellipse 或 c.polyline 替换描线。仍然缺失的内容,用网格放大图上的坐标,写进 build.py 里标出的绘制区。绘制调用以该页 deskewed.png 的像素为坐标,包括文字、直线、折线、矩形、圆、椭圆、箭头、复选框和圆弧;颜色应从 deskewed.png 取样。内置字体没有的字形用 c.add_font(name, path) 注册 TTF。测到的字号和线宽要保留,把数值「取整变整齐」会偏离原件。
第四步用 PY S/scripts/draft.py --rebuild work --pdf out/rebuilt.pdf 重建。停止条件是每一页都是 PASS,并且每一张校对图都看过;说明要求不要在此之外再打磨。报告里的 check 行只是建议。若某一页经过三轮仍未达 PASS,就停止并注明剩余问题。
交付物是这份 PDF,外加 3–6 行说明:有哪些页、哪些是文字和矢量、有哪些栅格裁剪、哪些词仍不确定。
SKILL.md 把书、多文件和可续跑的项目指到 references/long-documents.md(页台账、检查点、并行)。图表当数据、以及描线处理不了的照片和版画,见 references/figures.md。分页、链接和发布见 references/render-and-release.md。scripts/pdf_tool.py 用来检查成品 PDF 里的字体、图像和链接。单页工具仍可用:probe.py、canvas.py、compare.py。
同一份说明也划了一条边界:若只是给未改动的扫描件加一层隐藏 OCR 文字,应改用 OCR 工具。