乐于分享
好东西不私藏

把普通 PDF 变成看起来像打印后又扫描回去的“做旧”工具

把普通 PDF 变成看起来像打印后又扫描回去的“做旧”工具

最近在GitHub上发现了一个挺有意思的开源项目——make-look-scanned,它的功能用一句话就能说清楚:把一份干干净净的PDF文件,处理成看起来像是从打印机打印出来、再用扫描仪扫过一遍的效果。

你可能要问,好好的一份电子文档,为什么要故意把它"做旧"?

我也不懂。

它做了些什么?

用技术一点的话说,它对PDF的每一页做了这么几件事:

先将页面栅格化成图像,然后依次施加倾斜(模拟扫描时纸张没放正)、去色转灰度、叠加暖色纸纹(模拟老旧纸张的泛黄感)、加入扫描仪噪点散焦模糊(模拟低端扫描仪的镜头不够锐利)、边缘阴影(纸张边缘的暗角效果),最后再加上JPEG压缩伪影——一整套流程走完,出来的效果和拿一台老式扫描仪扫出来的几乎没区别。

最终输出的PDF是纯图像版的,原始文本不再可选,这也符合"扫描件"的本质。

两种使用方式,覆盖不同场景

这个项目考虑得挺周到,提供了两种运行模式:

第一种是命令行模式。 下载预编译的二进制文件,一行命令就能跑起来。每种效果的强度都可以通过参数独立调节,比如:

make-look-scanned in.pdf --noise 0.4 --skew 2.5 --jpeg-quality 30

它还支持预设配置文件,你可以把自己调好的效果组合存起来,下次直接按名字引用。

第二种是浏览器模式。 核心效果代码通过WebAssembly编译到了浏览器端运行。项目甚至打包了一个单文件HTML(大约8MB),内嵌了WASM、Go运行时胶水代码和PDF.js,离线也能用。

打开浏览器直接操作,对于不熟悉命令行的用户来说非常友好。

几个值得注意的设计细节

确定性输出是它一个很用心的设计。默认情况下,种子由PDF内容哈希值生成,所以同一份文件每次处理结果完全一样。如果你想要不同的效果,可以手动传入 --seed 参数,得到另一种可复现的效果。这对于需要批量处理并保持一致性的人来说很实用。

由开发者 overflowy 维护,AGPL-3.0 协议开源,目前已经获得了 379 个 stars

项目地址:github.com/overflowy/make-look-scanned

不知道你有没有遇到过需要"假装是扫描件"的场合?欢迎在评论区聊聊。