← На главную

Make-look-scanned превращает PDF в имитацию скана

20.06.2026 18:17 · hackernews

Есть CLI-утилита на Go, которая берёт PDF и превращает его в подделку под физический скан распечатки. Она задирает текст под углом (skew), обесцвечивает цвета (grayscale), добавляет тёплый оттенок бумаги (paper tone), зернистость (noise), расфокус (blur), тень по краям (edge shadow) и JPEG-артефакты сжатия. В итоге получается PDF без текстового слоя — как от обычного сканера.

Сборка через go build -o make-look-scanned ., бинарник самодостаточен благодаря go-fitz, который линкует MuPDF через cgo. Ничего дополнительно ставить не надо. Например: make-look-scanned in.pdf создаст in.scanned.pdf, можно задать свой путь флагом -o.

Настройки — это флаги. Вот ключевые: --dpi (150 по умолчанию), --skew (0.6 градусов макс, 0 отключает), --grayscale (по умолчанию true, --grayscale=false оставит цвет), --paper-tone (0.6, от 0 до 1), --noise (0.08), --blur (0.4), --edge-shadow (0.15), --jpeg-quality (70). Каждый параметр отключается нулём.

По умолчанию результат детерминирован: seed считается из содержимого PDF, так что тот же файл даёт одинаковый скан. --seed N даёт другой, но тоже воспроизводимый вариант. Если ещё и исходный PDF тот же, и seed тот же — байт-в-байт тот же PDF.

Можно задать presets в $XDG_CONFIG_HOME/make-look-scanned/config.toml (или ~/.make-look-scanned/config.toml, если XDG_CONFIG_HOME не задан). Ключи как у флагов, но с подчёркиваниями. Пример: [presets.medium] с skew = 1.5, noise = 0.2 и т. д. Флаг --preset medium применит этот набор, но явные CLI-флаги переопределяют preset.

Есть и браузерная версия на WASM. В ней для рендеринга страниц используется PDF.js вместо MuPDF, поэтому итоговый PDF визуально похож, но не идеально повторяет CLI-версию. Собрать офлайн-версию можно через task build:web — получится один файл dist/make-look-scanned.html (~8 MB) с встроенным wasm, Go-рантаймом и PDF.js в base64. Его можно открыть прямо в браузере без сервера.

Лицензия — AGPL-3.0. CLI статически линкует MuPDF (тоже AGPL-3.0), так что распространять бинарник можно, только отдавая исходники. Браузерная сборка использует PDF.js под Apache-2.0, поэтому там такого ограничения нет.

Читать оригинал →