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 的能力,以及增加一个标志来插入随机空白页以进一步增加模拟的逼真度。

Sources