最近在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
不知道你有没有遇到过需要"假装是扫描件"的场合?欢迎在评论区聊聊。
夜雨聆风