PDF藏得深?手把手教你从永中文档转换服务里把那文件抠出来
先说说我为什么跟这个PDF较上劲了
大概是去年年底那会儿,我手头有一个合同需要转成PDF发给客户。对方发过来的文件是永中文档的格式,就是那种后缀名看起来特别小众的文档。我当时没多想,直接打开永中文档转换服务网页版,上传、转换、下载,一切看起来都顺利。结果拿到手的PDF,封面页没问题,正文前几页也正常,翻到第五页,突然跳出一行字——「受限于文档格式,部分内容未呈现」。我当时人就麻了。客户那边催得紧,这份合同里夹着几页附录,附录里又有几个表格和流程图,要是漏了,后面签合同的时候肯定要出幺蛾子。我反复试了几次,每个操作都跟复制粘贴一样,结果还是那样,PDF不完整。
后来我才慢慢摸清楚这里面的门道。永中文档这玩意,本质上是个闭源的格式,它的转换服务说白了是给你一个「预览」级别的PDF,不是「原始内容」级别的PDF。换句话说,你拿到的PDF,是它用自己引擎渲染出来的一个截图集合,不是把文档里的矢量文字、表格、图片一一映射出来的。所以一旦文档里有复杂的排版、嵌入的字体、或者某些特殊的图形元素,渲染引擎就容易在边界处翻车,要么漏东西,要么把页面撐变形。那段时间我几乎每天都跟这个东西打交道,试了各种旁门左道,最后总算总结出三条能把内容完整抠出来的路子。下面一个一个说,每个法子都有血有肉,能帮你少走弯路。
第一条路:把转换服务当成跳板,拿到原始XML再加工
我第一次尝试的是最直接的办法:既然永中文档自己的PDF转换不靠谱,那我就不拿PDF,而是想办法从转换服务里把文档的原始结构数据弄出来。因为转换服务在处理上传的文档时,第一步其实是把它解析成中间格式,这个中间格式通常是XML或者JSON,里面包含了所有文本、样式、图片的引用信息。PDF只是这个中间格式再渲染的最终产物。所以只要你能在转换完成的瞬间,从浏览器开发者工具里抓到那个中间数据包,你就拿到了文档的原始资产。
具体操作是这样的:在永中文档转换服务的网页上,打开Chrome的开发者工具,选Network标签,勾上Preserve log(保留日志)。然后正常上传文档,点击转换。你会看到一堆请求刷刷刷地跑。重点找那些返回类型是application/json或text/xml的请求,看URL里有没有像export、render、content这样的关键词。一般转换成功后,会有一个请求返回一个巨大的JSON对象,里面嵌套着很多数组,数组里就是每个页面的内容节点。你点开这个请求,在Preview标签里把整个内容复制下来,保存成.json文件。然后你需要一个文本编辑器,比如VS Code或者Notepad++,把这个JSON里的内容节点提取出来。文本节点一般藏在类似text runs或者paragraphs这样的数组里,你用搜索功能搜一下font、size、text这些词就能找到。把找到的文本段按顺序复制出来,就能拼成一篇完整文档。图片就麻烦一点,图片的引用通常是base64字符串或者一个临时URL,你得在图对应的字段里找到data:image/...这种字符串,单独保存成图片文件。
我第一次用这个方法,折腾了两个小时,最后拿到了一个纯文本版本的合同,表格和图片因为是base64格式,手动提取比较麻烦,图片也经常因为临时URL过期而打不开。但这招对文本为主的文档非常管用,至少不会漏字。需要注意的是,JSON里的页面顺序可能和实际文档顺序颠倒,尤其是多栏排版,有时候A栏第一段跟在B栏第二段后面,你要自己调整。我当时被一个三栏排版的会议纪要折磨,逐句比对才理清顺序,成就感是有的,但也真累。
第二条路:拦截打印驱动,把永中文档的渲染输出重定向到虚拟打印机
如果你觉得解析JSON太技术流,而且文档里图片多、排版复杂,那第二条路就友好多了——用虚拟打印机直接抓取永中文档软件里的输出画面。这个思路其实很简单:永中文档官方除了那个网页转换服务,还有一个PC端的阅读器或者编辑器。你用它打开文档,然后像打印普通文档一样,选择一台虚拟PDF打印机,比如Foxit Reader自带的虚拟打印机或者Adobe Acrobat自带的打印驱动。这样打印出来的PDF,不是由永中文档的转换引擎生成的,而是由操作系统打印子系统直接抓取每一页的渲染结果,再封装成PDF。这个PDF虽然也是位图(每个字其实都是图片点阵),但好处是它不会漏内容,因为打印驱动是逐页全量处理的。
具体步骤:先下载永中文档的PC版客户端,注意点本页下载按钮,别去什么第三方站下,以免装一堆捆绑软件安。安装后打开你的文档,点击文件菜单里的打印,在弹出的打印对话框里,找到打印机列表,选中Microsoft Print to PDF或者你另外装的虚拟PDF打印机。如果文档有多个页面,记得在设置里选全部页面,不要选当前页。然后点打印,系统会弹出一个保存对话框,让你选保存路径和文件名。保存后打开这个PDF,你会发现每个页面都比网页端转换出来要清晰,而且那些网页端丢失的表格、流程图,这里一个不落。
但这个方法也有坑。最大的问题就是页面边缘可能被裁剪。永中文档的老旧打印驱动跟新系统的打印子系统有时候配合不好,页面边缘大概2到3毫米的内容会被裁掉。我为了补救这个,特意在打印设置里把缩放选项关掉,或者选自定义缩放为100%。如果还是裁,那就只能靠修改打印机属性里的「页面尺寸偏移」了——但这个功能不是每个虚拟打印机都有。另一个问题是文件特别大。一个200页的合约打印成PDF能到200MB,因为每一页都是一张高分辨率图片。所以打印之前,我建议你在打印质量设置里把分辨率从默认的600dpi降到300dpi,这样文件大小能减少一半,阅读体验也没太大差别。反正都是位图,300dpi在屏幕上已经非常清晰了。
第三条路:截图拼接法,治标不治本但关键时候救命
前两条路都走不通的时候,比如文档嵌入了复杂的宏或者动态元件,打印出来也是乱的,JSON解析又拿不到图片,那只能用最笨的办法——截图拼接。这不是什么技术活,但讲究的是心细和工具。别用手机拍屏幕,那效果糊成一团。一定要用电脑上的截图工具,比如Snipaste或者Windows自带的截图工具。建议把文档在永中文档阅读器里开到150%的缩放比例,这样截出来的图文字边缘看起来柔和一些,不会有锯齿。翻页的时候,不要一页一页地截,而是用阅读器里的滚动模式,把连续几页显示在同一屏里,然后用Snipaste的长截图功能,一次截一个章节。Snipaste会自动检测滚动边界,你去试试就知道了,它能压得住手抖,拼接后的图片基本没有缝隙。
有个小细节,很多网页版转换服务出来的PDF页码位置不一样,有的在左上角,有的在正下中。但用截图法,页码是你自己控制的,你可以在截图前把阅读器底部的页码栏隐藏掉,截完后再用图片编辑软件加上自己的页码标签,避免后续整理时搞混。我去年有一个25页的技术方案,就是靠这个办法硬生生截出来的。截完图后,我把长图导入Word,每张长图作为一页,再导出成PDF。虽然这份PDF不能搜索、不能复制文字,但发给客户应急完全够用。事后我再找个空闲时间用OCR软件把文字识别出来,补成可编辑版本。截图法唯一的好处就是绝对不丢内容——你眼睛看到的,就是最终得到的。代价是时间成本极高,一个几十页的文档,截图加拼接加品质检查,至少三四个小时。所以只建议在文档特别重要、其他方法都翻车的时候用。
关于版本和设置的一些碎碎念
别相信网上那些「一键无损转换」的神器。我试过好几个号称兼容永中文档的转换工具,有的是网页版,有的是桌面软件。结果要么是根本打不开文件,提示格式错误;要么转换出来的PDF里,中文字符全部变成空格。最离谱的一次,一个工具转换后的PDF里,页面背景变成了纯红色……我都怀疑那是个恶搞软件。所以稳妥起见,我还是只信任永中文档自己的客户端加虚拟打印机的组合,或者直接走浏览器抓包JSON那条路。
关于设置,很多人问我为什么用永中文档客户端打印时,页面尺寸老是错。这里有个容易忽略的点:永中文档的文档本身可能内置了非标准的页面尺寸,比如它定义了一个186mm×250mm的自定义纸张。你打印的时候,虚拟打印机会默认用A4纸,然后系统就会自动缩放,导致边缘内容丢失。所以打印前,建议在永中文档阅读器的页面设置里,看一眼文档的实际纸张大小,然后在虚拟打印机属性里创建一个相同尺寸的自定义纸张。虽然麻烦,但效果立竿见影。我记得有一次打印一份档案,用这个方法,页面边距每个方向多了0.5mm,整个文档终于完整呈现。
文件保存与邮件发送时的细节
费了牛劲把PDF抠出来后,别急着松手。保存文件时,文件名最好加一个你觉得能区分版本的后缀,比如合同_v2_完整版.pdf。因为一旦你以后下载了更新版本,很容易跟旧版搞混。我习惯在文档属性里加个备注,写明是用什么方法从永中文档里导出的,打印时用了多少分辨率,有没有缺页。这样半年后回来查档,一眼就能想起来当时的情况。
另外,如果你需要把这个PDF发给别人,尤其是通过邮件附件发送,建议用Adobe Acrobat或者在线压缩工具把文件压缩一下。我上面说过,虚拟打印机生成的高清位图PDF动辄几百MB,邮件服务器很可能一刀切退回来。我一般压缩到20MB以内,虽然画质会下降一点,但确保对方能收到。压缩前先预览一下,确认文字可读,边缘没有模糊到无法辨认。我之前有一次图省事,压到5MB,结果发给客户后对方打电话说「第12页那个财务数看不清楚」,我又重新导了一遍,尴尬得要死。
最后一个忠告:别跟这个格式死磕太久
写了这么多,其实最想说一句实在话:如果条件允许,从一开始就别用永中文档这个格式。它不是行业标准,迁移性极差,你用再多工具都是事后补救。如果下次再有合作方发来永中文档的文件,你可以直接打个电话跟对方说:「麻烦把原始Word或者PDF版本一起发我一份,我这边软件兼容性不太好。」大多数情况下对方都会同意,因为发永中文档的人往往自己也没意识到这格式有多坑。而你自己要是在这个格式上浪费了超过半天,那就说明该换方法或者换沟通策略了。
我自己后来养成的习惯是在电脑里装好永中文档的客户端,但平常绝不主动用它。备用着,就是为了万一遇到非要抠PDF的情况,能三招并用,最快半小时搞定。工具是给人用的,不该让人被工具牵着走。