← 返回信息流
AI 资讯Hacker News·3 小时前

Show HN: 利用 CLI 或浏览器 WASM 制作仿真扫描 PDF

原标题:Show HN: Make PDFs look scanned (CLI or in the browser via WASM)

速览

该工具允许用户通过命令行界面或基于 WebAssembly 的浏览器端生成具有仿真扫描效果的 PDF 文件。它无需依赖复杂的后端服务,即可在本地或前端环境中实现文档的视觉处理。这一功能为需要快速生成模拟扫描文档的场景提供了便捷的解决方案。

AI 深度解读

Show HN: Make PDFs look scanned (CLI or in the browser via WASM)

背景

在数字化办公场景中,将电子文档转换为看似经过物理扫描的纸质文档副本,往往是一个被忽视但实际存在的需求。无论是为了模拟传统档案的质感,还是出于特定的视觉呈现目的,用户通常需要使用复杂的图像处理软件手动调整扫描件的各项参数。

然而,现有的解决方案要么依赖重型图形处理软件,要么缺乏自动化和可复现性。Hacker News 上近期展示的一个名为 make-look-scanned 的项目,通过命令行工具(CLI)和基于 WebAssembly (WASM) 的浏览器端实现,提供了一种轻量级、自动化的解决方案。该项目旨在将 PDF 文件“降级”处理,使其在视觉上呈现出物理打印后扫描的效果,同时保持了极高的可配置性和跨平台兼容性。

核心内容

make-look-scanned 是一个开源工具,能够将 PDF 文件转换为看起来像是经过物理扫描仪处理的图像。其核心功能是通过一系列模拟物理扫描缺陷和特征的算法,对 PDF 页面进行重渲染。

模拟效果与处理流程

该工具模拟了真实物理扫描过程中的多种视觉特征,包括:

  • 倾斜 (Skew):模拟纸张放置不正导致的轻微旋转。
  • 灰度化 (Grayscale):去除色彩信息。
  • 暖色调纸张 (Warm paper tone):模拟旧纸张或普通复印纸的黄色调。
  • 扫描仪噪点 (Scanner grain):添加传感器噪声。
  • 失焦 (Defocus):模拟镜头或扫描头对焦不准。
  • 边缘阴影 (Edge shadow):模拟扫描仪玻璃板边缘的光线衰减。
  • JPEG 压缩伪影 (JPEG compression artifacts):模拟有损压缩带来的块状效应。

处理机制: 工具会将 PDF 的每一页光栅化(rasterize)为图像,经过上述效果管线处理后,重新组装成一个新的仅包含图像的 PDF 文件。需要注意的是,原始 PDF 中的可选文本(selectable text)会被移除,这与基础扫描仪的工作方式一致。

命令行工具 (CLI) 实现

CLI 版本基于 Go 语言开发,并链接了 MuPDF 库(通过 go-fitz 和 cgo),因此生成的二进制文件是自包含的,运行时无需额外安装依赖。

基本用法

go build -o make-look-scanned .
make-look-scanned [flags] input.pdf

示例

  • 默认输出:make-look-scanned in.pdf(生成 in.scanned.pdf
  • 指定输出文件:make-look-scanned in.pdf -o out.pdf
  • 调整参数:make-look-scanned in.pdf --noise 0.4 --skew 2.5 --jpeg-quality 30

参数控制

  • 所有数值型参数设为 0 时,对应的效果将被禁用。
  • 确定性输出:默认情况下,输出是确定性的。种子值(seed)由输入 PDF 的内容派生,因此相同的文件总是生成相同的扫描效果。
  • 自定义种子:通过 --seed N 可以生成不同的视觉效果,但同一输入加同一种子仍会产生字节级完全相同的 PDF。

配置文件支持: 用户可以在 $XDG_CONFIG_HOME/make-look-scanned/config.toml(若未设置则回退至 ~/.make-look-scanned/config.toml)中定义可复用的预设配置。

配置示例

[presets.medium]
skew = 1.5
paper_tone = 0.6
noise = 0.2
blur = 0.6
edge_shadow = 0.3
jpeg_quality = 45

调用预设

make-look-scanned --preset medium in.pdf

优先级规则:内置默认值 < 选定的预设 < 显式 CLI 标志(CLI 标志优先级最高)。

浏览器端实现 (WASM)

该工具的效果管线同样可以在浏览器中运行。由于 go-fitz/MuPDF 无法编译为 WASM,浏览器端采用了不同的技术栈:

  1. 使用 PDF.js 将页面光栅化为图像。
  2. 将像素数据传递给编译为 WASM 的相同 Go 效果代码和汇编代码进行处理。

开发模式: 需要网络连接以加载 PDF.js CDN:

./web/build.sh # 构建 web/main.wasm + wasm_exec.js
(cd web && python3 -m http.server 8080) # 启动服务器并访问 localhost:8080

离线单文件模式

task build:web # 生成 dist/make-look-scanned.html (~8 MB)

生成的 HTML 文件内联了 WASM、Go 运行时胶水代码以及 PDF.js(库和 Worker)作为 Base64 编码。用户可以直接在浏览器中打开该文件离线使用。虽然视觉效果与 CLI 版本等效,但由于 PDF.js 和 MuPDF 的光栅化算法不同,输出并非字节级一致。

开源协议

  • CLI 版本:采用 AGPL-3.0 协议。由于 CLI 静态链接了同样采用 AGPL-3.0 协议的 MuPDF,因此组合后的二进制文件也受 AGPL-3.0 约束。分发该二进制文件时,必须提供相应的源代码。
  • 浏览器版本:不包含 MuPDF(使用 Apache-2.0 协议的 PDF.js),因此不受 AGPL-3.0 的传染性限制。

关键要点

  • 视觉模拟全面:不仅模拟灰度,还涵盖了倾斜、噪点、失焦、边缘阴影和 JPEG 压缩伪影等物理扫描特征,还原度高。
  • 双端支持
    • CLI:基于 Go + MuPDF,性能稳定,二进制自包含,适合服务器或本地批量处理。
    • Browser:基于 Go + WASM + PDF.js,支持客户端处理,保护隐私(数据不上传服务器),且支持离线单文件运行。
  • 可复现性与确定性:默认基于文件内容生成种子,确保相同输入产生相同输出;支持自定义种子以生成多样化效果。
  • 配置灵活:支持通过 TOML 配置文件定义预设(Presets),并通过 CLI 标志覆盖,优先级明确。
  • 文本丢失:处理后的 PDF 仅包含图像,原始可选文本被移除,符合“物理扫描”的语义。
  • 协议差异:CLI 因链接 MuPDF 而采用 AGPL-3.0,浏览器端因使用 PDF.js 而规避了 AGPL 限制。

意义与影响

make-look-scanned 项目展示了 WebAssembly 在图形处理和多媒体转换领域的强大潜力。通过将核心效果管线编译为 WASM,开发者得以在浏览器中实现接近原生性能的处理能力,同时利用 PDF.js 解决 PDF 解析的跨平台兼容性问题。

对于普通用户而言,该工具提供了一种无需安装专业图像处理软件即可快速生成“扫描件”风格文档的方法,适用于需要模拟纸质档案、避免电子文档过于“完美”视觉感的场景。对于开发者和技术爱好者,该项目提供了一个优秀的案例,展示了如何混合使用 Go、WASM、汇编代码以及不同的 PDF 渲染引擎(MuPDF vs PDF.js)来构建跨平台、高性能的多媒体处理工具。此外,其清晰的开源协议区分(CLI 的 AGPL 与 Web 端的 Apache-2.0 隔离)也为类似项目的商业化或开源分发提供了参考。

查看原文 →github.com