
2026/06/21 3:17
Show HN: PDF をスキャン風に見せる(CLI またはブラウザ経由で WebAssembly を使用して)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
make-look-scanned ツールは、WebAssembly を使用してデジタル PDF をリアルなスキャンされたドキュメントに変換するクライアントサイドユーティリティであり、機密データがユーザーのデバイスから決して外部に漏れることを保証します。このワークフローでは、各ページを画像としてラスタライズし、不具合、グレースケール変換、暖かみのある紙の色調、粒状(ノイズ)、ボケ、エッジシャドウ、JPEG 圧縮を含む包括的なエフェクトパイプラインを適用した後、選択可能なテキストを永続的に除去した画像だけの PDF に再構成します。
本ツールは、ローカル/CLI 用途向けに MuPDF とリンクされた自立型の Go バイナリ(ランタイム依存関係が不要)、および MuPDF の C バインディングを使用できない環境向けのブラウザベースバージョンの PDF.js を使用したという 2 つのパイプラインを通じて配布されます。デフォルトでプロセスは決定論的であり、入力とシードが同じ場合、バイトレベルで同一の出力を保証するために内容ハッシュからシードが派生します。サーバーモードとオフラインモードの間には、それぞれ異なるラスタライズエンジンとコンパイル手法を有するため、軽微な差が生じることは予期されます。
ユーザーは、
config.toml ファイルで定義されたプレセットシステム(XDG 標準に従う)または CLI フラグを直接通じて視覚スタイルのカスタマイズを行うことができます。これらのフラグは「デフォルト → プレセット → 明示的なフラグ」の優先順序に従い、入力ファイル名の前後どちらかに配置することも可能です。AGPL-3.0 ライセンスの下でリリースされているこの柔軟なローカルホスト型ツールは、データを外部サーバーにアップロードせずに安全なアーカイブ変換器を開発することを開発者に可能にします。本文
make-look-scanned: 高品質なスキャン再現ツール
概要
紙の印刷物にスキャンされたような見た目を CLI(コマンドラインインターフェース)で再現するツールです。入力された PDF からテキスト情報を破棄し、以下のエフェクトを適用して劣化処理を行います。
- 歪み(スキュー)
- グレースケール化
- 温かみのある紙の色調
- スキャナによるノイズ粒
- フォーカスの甘み(ボケ)
- フレーム端の影
- JPEG 圧縮によるアーティファクト
このツールは WebAssembly (WAS) を利用するため、ローカル環境でもブラウザ側でも動作します。処理された画像データを元のテキスト情報を含まない PDF として再組み立てます。
ビルド方法
Go と C ツールチェーンが必要です。
go-fitz は MuPDF を cgo でリンクしており、生成されたバイナリは自立しています(実行時に追加のインストール不要)。
go build -o make-look-scanned .
使用方法
基本構文:
make-look-scanned [オプション] 入力ファイル.pdf
オプションはファイル名の前後どちらかに指定しても構いません。
コマンド例
- デフォルト設定で処理し、出力先が
となる場合<入力ファイル>.scanned.pdfmake-look-scanned in.pdf - 指定したパスに出力する場合 (
)-omake-look-scanned in.pdf -o out.pdf - 詳細なパラメータを指定する場合 (
,--noise
など)--skewmake-look-scanned in.pdf --noise 0.4 --skew 2.5 --jpeg-quality 30
オプション一覧
| オプション | デフォルト値 | 意味 |
|---|---|---|
| | 出力先パスの指定 |
| なし | に定義されたプリセットを使用 |
| コンテンツハッシュ値 | ランダムシード(新しい見た目を生成) |
| false | 既存ファイルの上書きを許可 |
| 150 | レンダー解像度 |
| 0.6 | 最大回転角度(度数法); で歪み無効化 |
| true | 彩度を排除; でカラー保持 |
| 0.6 | 温かみの色調強さ (0~1) |
| 0.08 | スキャナーノイズ強度 (0~1) |
| 0.4 | フォーカスの甘み(ガウシアンシグマ) |
| 0.15 | フレーム端の影強度 (0~1) |
| 70 | JPEG 品質 (1~100) |
注記: 数値パラメータを
に設定すると、そのエフェクトは適用されなくなります。0
再現性について
出力結果はデフォルトで決定論的です。シード値が入力 PDF のコンテンツから自動導出されるため、同一ファイルへの入力に対して常に同じスキャン像が生成されます。
- 同一性の保証: 入力ファイルとシードが同じ場合、出力 PDF はバイト単位の同一性を保証します。
- カスタムシード:
を指定すると、異なる(しかし再生産可能な)見た目を生成できます。--seed N
プリセット
再利用可能な設定バンドルは以下の場所の
config.toml に定義します。
※ XDG_CONFIG_HOME 環境変数が_unset の場合は ~/.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)
効果パイプラインは WebAssembly 形式で動作し、ブラウザ上で実行可能です。PDF.js を用いてページをラスタライズし、生成された画像データを Go 製の処理コードが読み込みます。
1. 開発環境
ネットワーク接続が必要です(PDF.js の CDN 読み込み)。
./web/build.sh # web/main.wasm と wasm_exec.js をビルド cd web && python3 -m http.server 8080 # ローカルサーバーを起動 (http://localhost:8080)
ブラウザで
http://localhost:8080 を開き、HTML ファイルを指定して実行します。
2. 単一自立ファイル(オフライン用)
外部リソースなしで動作する HTML ファイルを作成できます。
task build:web # dist/make-look-scanned.html (~8 MB) を出力
dist/make-look-scanned.html は、WASM、Go ランタイム統合コード、PDF.js を base64 で内包しています。この HTML ファイルをブラウザで直接開くだけで動作します。
注意: 視覚的な結果は CLI 版と同等ですが、PDF.js と MuPDF のラスタライズアルゴリズムが異なるため、バイト単位の同一性は保証されません。
ライセンス
- 全体ライセンス: AGPL-3.0
- CLI バイナリ: go-fitz を介して MuPDF に静的リンクしています。MuPDF も AGPL-3.0 のため、合成されたバイナリ全体も AGPL-3.0 です。配布時には対応するソースコードの提供が必要です。
- ブラウザ版: MuPDF は使用せず、Apache-2.0 ライセンスの PDF.js を使用しています。