make-look-scanned: 将数字 PDF 转换为逼真的扫描文档
概述
make-look-scanned 是一款专门设计的实用工具,旨在将整洁的数字 PDF 转换为看起来像是经过物理打印和扫描的文档。该工具通过将每一页光栅化为图像并应用一系列退化效果,从而生成一个仅包含图像的 PDF,其中原始的可选文本已被移除,以模拟基础扫描仪的输出结果。
根据作者的说法,创建该项目的目的是为了提供一种注重隐私的本地替代方案,以替代那些需要用户将敏感文件上传到第三方服务器的在线“让我的 PDF 看起来像扫描过的”工具。
技术实现与流水线
该工具利用多阶段效果流水线来模拟物理扫描的不完美性。用户可以通过 CLI 标志或配置预设来控制以下参数:
- 几何畸变:
--skew标志允许设置最大旋转角度(以度为单位),以模拟纸张对齐不准的情况。 - 视觉退化:选项包括用于扫描仪颗粒感的
--noise、用于失焦效果(高斯 sigma)的--blur,以及用于边框暗角的--edge-shadow。 - 颜色与色调:
--grayscale标志会使文档去饱和,而--paper-tone则会添加暖色调以模拟陈旧或特定类型的纸张。 - 压缩伪影:
--jpeg-quality标志(1-100)会引入扫描图像 PDF 中常见的 JPEG 压缩伪影。
确定性与可复现性
默认情况下,输出是确定性的。该工具从输入 PDF 的内容哈希中派生出一个种子,确保相同的输入文件始终产生相同的视觉结果。用户可以使用 --seed N 标志来覆盖此行为,以生成不同但仍可复现的外观。
部署选项:CLI vs. 浏览器
make-look-scanned 提供了两种不同的运行效果流水线的方式,以确保处理过程在用户的本地机器上完成。
命令行界面 (CLI)
CLI 是用 Go 编写的,并通过 go-fitz 使用 cgo 链接到 MuPDF。这产生了一个自包含的二进制文件,不需要任何运行时安装。可以通过位于 $XDG_CONFIG_HOME/make-look-scanned/ 或 ~/.make-look-scanned/ 的 config.toml 文件进行配置,以存储可复用的预设。
浏览器 (WebAssembly)
由于 MuPDF 无法被编译为 WASM,浏览器版本使用 PDF.js 进行页面光栅化。一旦页面被转换为像素,它们就会被传递给编译为 WebAssembly 的同一个 Go 效果流水线。这使得该工具可以完全在客户端运行。
值得注意的是,作者提供了一个单一的自包含 HTML 文件(dist/make-look-scanned.html),它将 WASM、Go 运行时胶水代码和 PDF.js 以 base64 形式内联,从而使该工具能够在无需服务器的情况下离线工作。
社区洞察与替代方案
用户之间的讨论突显了对该工具的实用性和实现方式的多种观点:
- 隐私与可访问性:用户称赞该工具是开源且免费的,并将其与收费的 PDF 实用工具进行对比。
- 替代方法:一些用户建议了手动变通方法,例如在显示器上显示 PDF 并用手机拍摄它,以自然地捕捉摩尔纹和灰尘。
- 技术替代方案:一位用户分享了一个使用 ImageMagick 的类似工作流:
magick -density 150 input.pdf -colorspace Gray -virtual-pixel White -background White -rotate 0.7 +repage -attenuate 0.45 +noise Gaussian -blur 0x0.4 -brightness-contrast -5x12 -compress jpeg -quality 78 scanned.pdf
- 功能请求:改进建议包括增加输出单个图像(JPG/PNG)而非仅仅是 PDF 的能力,以及增加一个标志来插入随机空白页以进一步增加模拟的逼真度。