夜雨聆风学习资料网

ARTICLE · 1093052

一张扫描件的申请表,逼我自己写了个 PDF 转 Word 工具

一张扫描件的申请表,逼我自己写了个 PDF 转 Word 工具
工具笔记

梁英俊  Liang Yingjun · 工具笔记

网址在这儿:peterinblue.github.io/demo/09

不用注册,不用登录,打开就能用,手机上也能开。文件不上传,转换在你自己浏览器里跑完。普通 PDF 和扫描件都能转,出来是能直接编辑的 Word。

赶时间的话看到这里就够了,下面交代一下这东西怎么来的。

一为什么要自己做一个

起因是一张申请表。

单位发来的资源申请表,扫描件,一整个 PDF 就一张图。我当时想得很简单,在上面改一下不就行了。

不行。扫描件本质上是一张照片,改一个字等于重做整张表。抬头编号、一排方框勾选、几处签字栏、底下那段说明,一个都跑不掉。

那就找在线转换。搜出来一大把,我试了两个,都卡在同一件事上:先把文件传上去。

那张表上有单位公章,有同事的姓名和手机号。这种东西往别人的服务器上传,就算页面上写着「转换完成一小时后自动删除」,我也下不去手。

第三个问题是我后来才发现的,比前两个还麻烦。这类工具靠读 PDF 里的文字层干活,而扫描件里压根没有文字层,只有像素。传到哪儿都没用,要么给你一堆乱码,要么干脆不认。

那还有什么好说的,自己写一个。前提两条:跑在本地,能认图。

说实话,为了一张表去写个工具,我自己也觉得有点轴。后来发现这种表不止一张,就来劲了。

二怎么做的

做法本身不复杂。一个 HTML 文件,双击就打开,不用装任何东西,代码全内联在里面。麻烦的都在「转得准」上。

这套东西不是我手写的,是拿 AI 磨出来的——平台 WorkBuddy,模型 DeepSeek V4.1 Flash。我负责说清楚要什么、跑一遍、指出哪儿不对,它负责改代码。下面这些坑,基本都是这么一回合一个回合磨出来的。

图 1|两条路径:有文字层的 PDF 走上面,扫描件走下面

普通 PDF:光把字抠出来没用

一般人以为 PDF 转 Word 就是提取文字。真动手才发现,只有文字等于什么都没有:标题加粗丢了、这行什么颜色丢了、表头是白字配深蓝底这件事也丢了,字号比正文大一号同样丢了。这些凑在一起,文档才叫原来是那个样子。

我后来干脆不读文字了,改去读 PDF 的绘图指令。它每画一段字,都会先声明用哪个字体、什么颜色、多大,然后才画。把这些记下来,写 Word 的时候照着写回去。

坑在这儿:绘图指令的顺序和文字的顺序经常对不上。一段话可能被拆成好几次绘制,也可能一次绘制里塞了好几段。按顺序一一对应,错一个字后面全跟着错。

最后的办法是不看顺序,看坐标。每条文字去找离它最近的那次绘制记录,取那次的颜色。位置不会骗人。

表格:得还原成真表格

只提取文字的话,Word 里会得到几十个位置乱飘的短句,边框一根没有,还得自己画回去。

PDF 画表格,说穿了就是画一堆矩形。把横线竖线找出来,按坐标还原成行列,再往格子里填字,出来就是 Word 的真表格:能插行,能拉列宽,表头合并的格子也还在。

「哪几格是合并的」这个判断,依据是那条竖线有没有贯穿这一行。听着挺合理吧。我一开始按聚类后的中心位置去采样,中心偏一点点,采样窗口就整条落空,结果所有线都判成没贯穿,表格被压成一排小窄格。改成用聚类之前的原始区间去采样才对上。

图 2|合并单元格不靠猜,靠那条竖线有没有走完整行

扫描件:把线找出来擦掉,再认字

这轮最耗时间的就是这块。

扫描件里没有文字,只有一张图,所以要 OCR。但直接把图扔给 OCR,出来是一片按行排的文字流,表格碎掉,数字串位,基本没法用。

我的顺序是这样:先把页面渲染成一张足够清楚的图;再判断哪些像素是墨、哪些是红章(按颜色和亮度分开,红章单独处理);然后用投影找表格的横竖线;接着把线擦掉,把章也擦掉,这两样都会干扰认字;剩下干净的画面才交给 OCR;最后按每个字在画面上的位置,把字填回刚才算出来的格子里。

顺序不能换。先认字再拼表格,等于让 OCR 一边认字一边猜结构,它猜不出来。

图 3|扫描件的处理顺序,中间两步不能颠倒

兜底那一层:不认字,直接放图

还有个绕不开的现实:有些文件就是要原样交出去。印章、手写签字、勾选框,一个都不能少,文字能不能编辑反而无所谓。

所以我留了个「保真图片版」,不做识别,每一页扫描图按原尺寸铺进 Word,看上去跟原件一样。

两种模式自己选。要改内容用 OCR 版,要交原件用图片版。

三个很烦但必须解决的细节

转出来的 Word 第二页莫名其妙一大片白。查出来是 Word 的默认段落带「段后 8 磅 + 1.15 倍行距」,我生成的段落没显式关掉它,几十行累计正好撑破一页。

图片版偶尔多出一页。图片高度刚好等于页高,加上一行行距的余量就溢出去了。把图片缩到 99.6%,好了。

Word 弹「文件可能已损坏」。翻了半天,打包时图片后缀写成了 jpeg,实际文件名是 jpg,差三个字母。

三能做到什么程度

两页的扫描件申请表,实测:8 秒

扫描件 OCR 可编辑版两页 1.4 秒

保真图片版两页14×5

还原成真表格含 9 处合并格

文件上传全程在本机

OCR 可编辑版 8 秒左右,出来是 Word 两页,文字基本能用,表格还原成真表格(14 行、5 列、9 处合并单元格)。保真图片版 1.4 秒,印章、手写签字、勾选框全在。普通 PDF 的话,加粗、颜色、字号、斜体、底纹、真表格、标题居中,都能带过来。

速度不是重点,有用的是另外几件事。

图 4|同一张表单改一个字段,两条路差多少

最要紧的是文件不出本机。整个过程在你浏览器里完成,没有数据发往服务器。公司内部的文件、盖了章的东西、写着同事手机号的表格,都能放心用。把网页存到本地,断网也能跑。

再就是省事。一张表单改一个字段,以前得重录整张,现在打开转出来的 Word 改几个字就完了。

还有一条是退路。识别得不准不用硬扛,切图片版,原样交出去。

边界我也得说清楚

  • 手写签名和手写意见基本没法看,这是 OCR 天生的短板
  • 方框勾选会被认成「口」字
  • 密集小字和形近字会出错,比如「编号」能变成「编叶」
  • 第一次用要下载一个 20MB 的中文识别包,之后就进缓存了

所以 OCR 版转出来,姓名、金额、日期这几个字段一定自己再核一遍。工具里也会提示,但它替不了你扫一眼。

四最后

https://peterinblue.github.io/demo/09/

专业工具该干的活它替代不了,但日常那些「从 PDF 里捞张表出来改改」的事,够用。

最后交代一件事:这个工具是 AI 自动生成的——平台 WorkBuddy,模型 DeepSeek V4.1 Flash。那些坑,基本都是它写、我踩出来的。

梁英俊  Liang Yingjun · 工具笔记

AI 工具生成 平台 WorkBuddy模型 DeepSeek V4.1 Flash

相关学习资料