Show HN:让PDF看起来像扫描件(通过命令行工具或浏览器中的WebAssembly)

Hacker News Top 工具

摘要

一款命令行工具和基于浏览器的工具,使用Go和WebAssembly,将PDF转换为仅包含图像的PDF,并模拟扫描效果,如倾斜、灰度、噪点和JPEG伪影。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/06/20 20:17

overflowy/make-look-scanned

来源:https://github.com/overflowy/make-look-scanned

make-look-scanned

一个命令行工具,接收PDF文件并使其降质,看起来像是打印件的物理扫描——包含倾斜、灰度、暖色纸张底色、扫描噪点、失焦、边缘阴影和JPEG压缩伪影。也支持在浏览器中客户端运行(https://overflowy.github.io/make-look-scanned/),基于WASM。每一页会被栅格化为一幅图像,经过效果流水线处理,然后重新组装成一个新的纯图像PDF(原有的可选文本消失,模拟基础扫描仪的行为)。

构建

需要Go和C工具链(go-fitz通过cgo链接MuPDF,因此生成的可执行文件是自包含的——运行时无需额外安装)。

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

标志

标志默认值含义
-o.scanned.pdf输出路径
--presetconfig.toml 中指定的命名预设
--seed内容哈希随机种子(覆盖以获取新的外观)
--forcefalse覆盖已存在的输出文件
--dpi150渲染分辨率
--skew0.6最大旋转角度(0 表示禁用)
--grayscaletrue去饱和度(--grayscale=false 保留彩色)
--paper-tone0.6暖色纸张色调强度 0..1
--noise0.08扫描噪点 0..1
--blur0.4失焦高斯 sigma
--edge-shadow0.15边框暗角 0..1
--jpeg-quality70JPEG 质量 1..100

每个数值旋钮在设置为 0 时禁用对应效果。

确定性

输出默认是确定性的:种子由输入PDF的内容派生,因此同一文件始终产生相同的扫描效果。传递 --seed N 可以获得不同的(但可复现的)外观。相同的输入 + 种子会产生字节完全相同的PDF。

预设

$XDG_CONFIG_HOME/make-look-scanned/config.toml 中定义可复用的预设(当 XDG_CONFIG_HOME 未设置时,回退到 ~/.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

优先级顺序:内置默认值 → 所选预设 → 显式的命令行标志(标志始终胜出)。

浏览器(WebAssembly)

效果流水线也可以在浏览器中运行。go-fitz/MuPDF 无法编译到 wasm,因此浏览器使用 PDF.js 栅格化页面,并将像素传递给_同样的_ Go 效果代码(编译为 wasm)。开发(需要网络以加载 PDF.js CDN):

./web/build.sh   # 构建 web/main.wasm + wasm_exec.js
(cd web && python3 -m http.server 8080)
# 然后打开 http://localhost:8080

单文件自包含(离线可用,无需提供静态文件服务):

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

dist/make-look-scanned.html 将 wasm、Go 运行时胶水代码和 PDF.js(库 + worker)内联为 base64——直接在浏览器中打开即可。输出在视觉上与 CLI 等效,但由于 PDF.js 和 MuPDF 栅格化方式不同,字节并不完全相同。

许可证

AGPL-3.0。CLI 静态链接了 MuPDF(通过 go-fitz),因此合并后的二进制文件是 AGPL-3.0 的——分发它需要提供相应的源代码。浏览器构建不包含 MuPDF(它使用 PDF.js,Apache-2.0 许可)。

相似文章

Show HN: 运行于 WebAssembly 的 Firefox

Hacker News Top

Firefox 被编译为在 WebAssembly 中运行,采用基于 WebGL 的渲染和实验性的 JS 到 WASM JIT,网页内容通过 Puter 托管的 Wisp 服务器进行代理。