Show HN:让PDF看起来像扫描件(通过命令行工具或浏览器中的WebAssembly)
摘要
一款命令行工具和基于浏览器的工具,使用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 | 输出路径 |
--preset | — | 从 config.toml 中指定的命名预设 |
--seed | 内容哈希 | 随机种子(覆盖以获取新的外观) |
--force | false | 覆盖已存在的输出文件 |
--dpi | 150 | 渲染分辨率 |
--skew | 0.6 | 最大旋转角度(0 表示禁用) |
--grayscale | true | 去饱和度(--grayscale=false 保留彩色) |
--paper-tone | 0.6 | 暖色纸张色调强度 0..1 |
--noise | 0.08 | 扫描噪点 0..1 |
--blur | 0.4 | 失焦高斯 sigma |
--edge-shadow | 0.15 | 边框暗角 0..1 |
--jpeg-quality | 70 | JPEG 质量 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: 一个在浏览器中生成矢量PDF的方格纸生成器
一个免费的基于浏览器的方格纸生成器,用户无需登录或水印即可创建和下载自定义网格PDF。
Show HN:我构建了184个免费的浏览器工具——PDF、图片、开发、AI任务,无需上传
Brevio提供了184个免费的基于浏览器的工具,用于PDF、图片、开发和AI任务,全部无需上传或注册。
Show HN: 运行于 WebAssembly 的 Firefox
Firefox 被编译为在 WebAssembly 中运行,采用基于 WebGL 的渲染和实验性的 JS 到 WASM JIT,网页内容通过 Puter 托管的 Wisp 服务器进行代理。
Show HN: Inkwash——一款水彩素描应用及技术解析
Inkwash 是一款基于 WebGL2 的水彩素描应用,可模拟颜料流动与纸张交互,由 Claude Fable 5 生成。本文解释了实现逼真水彩效果的浮点纹理与着色器技术管线。
生成可选中文本的客户端PDF出乎意料的复杂过程
本文探讨了在客户端生成可选中文本PDF的技术挑战,介绍了SDocs作为解决方案,并提供了其CLI工具的安装说明。