用 PDFLang 做逐像素比对
供应商送来了改好的文件。活件已经排进计划,机器也订好了,在开印之前得有人回答 一个问题:这是当初批准的那份文档、把问题改掉之后的样子,还是别的什么东西?
这个问题被用眼睛回答的次数,多得让人不太想承认。两个窗口并排,或者两张打样放在 看版台上,然后一个人往下翻。这是一天里最慢、也最不可靠的一段。
错的文件要付出什么
Section titled “错的文件要付出什么”错的文件一上机,之后的一切都是浪费。纸用掉了。油墨用掉了。印版是照着那个文件 出的。机时订了、烧掉了,操作机器的人的时间也一样。要是已经走到裁切、折页或装订, 那些也没了。要是已经发货,还有运费——两趟,因为得再拉回来。
然后整个活件重做一遍,按全价,而预算已经花过一次了。
而排期是回不来的那部分。错过季节的画册、印着日期却在日期之后才送到的促销品、 晚一周才出的杂志:重印修好的是那个东西,修不好它本该存在的那个时刻。
有些甚至跟钱无关。警示语印错的药品标签、数字印错的法定公告、写着上一季度数据的 财务文件——这些不是“贵”的错误,而是会以召回或监管收场的那类错误。
相比之下,核对只要几秒钟。
为什么眼睛是错的工具
Section titled “为什么眼睛是错的工具”人的注意力非常擅长发现大的差别,非常不擅长发现小而一致的差别。把两页几乎相同的 内容摆在一个人面前,他会找出被重写的那一段,却找不出挪了两毫米的标志。
量一大就更糟。没有人看第 180 页时还像看第 3 页那样。能抓住问题的专注力在前面就 花完了,长文档的最后三分之一得到的是一瞥,不是核对。
而且结果无法复现。两个人比对同一对文件,报出来的东西不一样。同一个人换个下午再 比一次,报出来的又不一样。等到日后真出了事——有人问是谁、依据什么批的——拿不出 任何东西。
机器所说的“一样”
Section titled “机器所说的“一样””pdfl pixelcompare 会把两个文件渲染出来,逐页比对它们看上去的样子:
pdfl pixelcompare approved.pdf reprint.pdf每一个发生变化的页面报告一条,附上这一页有多大比例涉及其中,以及分散在多少个 地方:
page 7: 0.51% of the pixels differ, in 29 area(s)这和 pdfl compare 回答的是两个不同的问题。那条命令看的是文字和结构,这条看的是
外观,而两者不一致的频率比你以为的高得多。
挪了两毫米的标志。消失的细线。被 CMYK 叠印替换掉的专色。这三种情况文字都完全 相同,所以文字比对会说两个文件一致。它们在纸上并不一致,而纸上才算数。
只存在于其中一个文件里的页面会单独报告,因为没有可比的对象。
那一两个像素不算改动
Section titled “那一两个像素不算改动”从同一个源重新导出的文件,往往会偏移一两个像素。如果把这也当成差异,页面上每一个 字都会“不同”,真正变了的那一处就淹没在噪声里。
所以比对会寻找整页范围内的单一位移,找到时会说明:
page 3: 2.10% of the pixels differ, in 44 area(s) (aligned by 2, -1 px)当位置本身就是你要核对的东西时——某个元素必须落在精确的位置——用 --no-align
把它关掉。
一个真正能看的地方
Section titled “一个真正能看的地方”百分比告诉你这一页变了,但不告诉你这个变化能不能接受。那得有人亲眼看:
pdfl pixelcompare approved.pdf reprint.pdf --viewer diff/这会写出一个文件夹,里面是页面、差异,以及一个 index.html。不需要服务器,不需要
联网,不需要安装任何东西。打开文件,或者把文件夹打包发给要签字放行重印的人。
它并排显示三个面板,始终停在同一页:原文件、新文件,以及两者叠在一起、把差异画在 上面的那一个。
三个面板上都有同一对标尺条,一竖一横,位置一致。它们跟着指针走——没有东西要抓,也 没有目标要对准。在差异面板里这两条是切口:竖条右侧、横条下方显示新文件,其余部分 显示原文件。在另外两个面板里,同样的两条是尺子,标出页面上同一列和同一行,于是切口 露出的东西,可以在任一原件上找到,不必用眼睛量。
差异被画在页面之上,颜色说明是哪一类:
| 颜色 | 含义 |
|---|---|
| 红 | 新文件里消失的墨 |
| 绿 | 新文件里新增的墨 |
| 蓝 | 墨色相同,颜色不同 |
滚轮让三个面板一起缩放,最高 8 倍,以指针下方那一点为中心——你原本在看的东西还留在 原处。按住任意一个鼠标键拖动,就能移动页面,同样是三个面板一起,放大之后要够到某个 角落就靠它。Reset view 把缩放、平移和标尺条都还原。
而最省时间的部分:它一打开就停在有差异的页面上。一份两百页的文档里有三页动过,那三页 正是你打开它的理由,All 会把其余的放回来。方向键跟着筛选走,跳过被隐藏的页面而 不是停在上面。
让它成为关卡,而不是意见
Section titled “让它成为关卡,而不是意见”退出码承载结论,所以这道工序可以放在机器前面而不是旁边:没有页面超出你允许的变化
是 0,有则是 2,文件根本读不了是 10。
pdfl pixelcompare approved.pdf reprint.pdf --max-diff 0.1 --viewer diff/ || { echo "重印文件对不上——请看 diff/index.html" exit 1}--max-diff 是容差:一页可以变多少才算数。--dpi 决定看得多细——越高看到的越多,
也越慢。--threshold 和 --blur 用来吸收渲染本身产生的细小噪声。
这道核对几秒钟跑完,每次给出同样的答案,并留下一份报告和一个查看器,作为“比对过 什么”的记录。
接下来看哪里
Section titled “接下来看哪里”CLI 这一章记录了 pixelcompare 的每一个选项,以及回答文字与结构
问题的 compare。实用范例把两者放进完整的流程里——印刷厂拿
上机文件核对已批准的打样,出版社拿重印核对已经上架的版本。