pdf-look-scanned について
PDF のページをレンダリングして調整し、紙をスキャンしたような見た目にするコマンドラインスクリプトです。元の PDF と指定した切り抜き・配置座標を使った署名の置き換えにも対応します。
主な機能
- 01PDF にスキャン風の画像効果を適用
- 02解像度と画質の調整
- 03ノイズ、ぼかし、回転、コントラストの設定
- 04元 PDF から署名を抽出
- 05指定位置の署名を消去して置き換え
活用シーン
- 01PDF を紙のスキャン風に加工
- 02文書のスキャン質感や鮮明さを調整
- 03対象 PDF の署名画像を置き換え
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ vladmdgolam/ agent-skills --skill pdf-look-scannedインストール後、Claude Code で/pdf-look-scannedを入力して読み込まれたか確認します。
同梱ファイルscripts/make_scanned.py
詳細
PDFをスキャンしたように見せる
任意で署名を差し替え、PDFを実際にスキャンしたような見た目にします。
依存関係
pip3 install pillow pdf2image img2pdf numpy
また、pdftoppmを提供するpopplerも必要です。
- macOS:
brew install poppler - Ubuntu/Debian:
apt install poppler-utils - Fedora/RHEL:
dnf install poppler-utils - Arch:
pacman -S poppler - Windows:
conda install -c conda-forge popplerを実行するか、poppler releasesからダウンロードしてください。
クイックスタート
基本機能には scripts/make_scanned.pyを実行します。すべてのオプションについては、スクリプトの--helpを参照してください。
シンプルなスキャン効果
python3 scripts/make_scanned.py document.pdf
スキャン品質を調整する
DPIと品質を下げると、粒子が粗くなり、安価なスキャナーでスキャンしたような、よりリアルな見た目になります。
python3 scripts/make_scanned.py document.pdf --dpi 150 --quality 75 --noise 7
DPIを上げると、スキャンがより鮮明になり、ファイルサイズも大きくなります。
python3 scripts/make_scanned.py document.pdf --dpi 300 --quality 92
署名の差し替え
署名の座標を特定する
署名を差し替える前に、切り抜きと配置の座標を特定します。すべての座標はページ寸法に対する比率(0.0~1.0)です。
- 元のPDFを画像に変換し、目視で確認して署名領域を特定します
- 段階的に切り抜き、署名のインク部分だけを分離します(テキストや表の罫線は含めません)
- 対象のPDFで、消去する領域(古い電子署名)と貼り付ける位置を特定します
次のPythonスニペットを使うと、座標を対話的に確認できます。
from pdf2image import convert_from_path
from PIL import Image
pages = convert_from_path("document.pdf", dpi=200)
page = pages[0] # 0-indexed
w, h = page.size
# Crop a region and save for inspection
crop = page.crop((int(w*0.5), int(h*0.4), int(w*0.8), int(h*0.6)))
import tempfile, os
crop.save(os.path.join(tempfile.gettempdir(), "crop_test.png"))
署名を1つ差し替える
python3 scripts/make_scanned.py contract.pdf \
--sig-pdf signatures.pdf \
--sig-page 1 --sig-crop 0.41,0.33,0.62,0.42 \
--sig-target 25 --sig-clear 0.61,0.41,0.85,0.52 --sig-place 0.62,0.415
複数の異なる署名を差し替える
--sig-page、--sig-crop、--sig-target、--sig-clear、--sig-placeの組を追加するたびに、差し替えが1つ追加されます。各パラメーターは記述順に対応付けられます。
python3 scripts/make_scanned.py contract.pdf \
--sig-pdf signatures.pdf \
--sig-page 1 --sig-crop 0.41,0.33,0.62,0.42 \
--sig-target 25 --sig-clear 0.61,0.41,0.85,0.52 --sig-place 0.62,0.415 \
--sig-page 2 --sig-crop 0.40,0.335,0.62,0.39 \
--sig-target 27 --sig-clear 0.61,0.635,0.85,0.72 --sig-place 0.60,0.655
署名のパラメーター
| パラメーター | 説明 |
|---|---|
--sig-pdf | 実際の署名を含む元のPDF |
--sig-page N | 元のPDF内のページ番号(1始まり) |
--sig-crop L,T,R,B | 署名を抽出する切り抜きボックス(比率) |
--sig-target N | 署名を差し替える対象ページ(1始まり) |
--sig-clear L,T,R,B | 古い署名を白く塗りつぶす領域(比率) |
--sig-place X,Y | 新しい署名を貼り付ける左上の位置(比率) |
--sig-size F | ページ幅に対する署名の幅(比率、デフォルト:0.11) |
--sig-dpi N | 元の署名PDFをレンダリングするDPI(デフォルト:350) |
スキャン効果のパラメーター
| パラメーター | デフォルト | 効果 |
|---|---|---|
--dpi | 200 | レンダリング解像度。低いほど粒子が粗くなります |
--quality | 85 | JPEG圧縮。低いほど圧縮ノイズが増えます |
--noise | 5.0 | ガウスノイズの標準偏差。高いほどノイズが増えます |
--blur | 0.6 | ガウスぼかしの半径。大きいほど柔らかくなります |
--rotation | 0.7 | 回転の最大角度 |
--contrast-min | 0.88 | コントラストの最小値(低いほど白っぽくなります) |
--contrast-max | 0.95 | コントラストの最大値 |
署名差し替えのワークフロー
ユーザーからPDFと別の署名ソースが提供された場合:
- 依存関係(
pillow、pdf2image、img2pdf、numpy、poppler)がインストールされていることを確認します - 元の署名PDFを調べます — 画像に変換し、署名があるページを特定します
- 署名を抽出します — インク部分だけを分離するように段階的に切り抜き、テキストが混入していないことを確認します
- 対象のPDFを調べます — 電子署名があるページを特定し、「Подпись:」または「Signature:」ラベルの位置を記録します
- 座標を決めます — 消去領域はラベルにかからずに古い署名を覆う必要があります。配置位置はラベルのすぐ後ろにします
- すべてのパラメーターを指定してスクリプトを実行します
- 出力を確認します — 署名があるページを目視で確認し、必要に応じて座標を調整します
- メタデータを確認します — 出力にソフトウェアの痕跡が残っていないことを確認するため、
exiftoolを実行します
よくある問題:
- 切り抜きボックスが小さすぎる:署名の端が切れます
- 消去領域が広すぎる:「Подпись:」/「Signature:」ラベルや周囲のテキストまで消してしまいます
- 署名が大きすぎる/小さすぎる:
--sig-sizeを調整します(契約書では0.11が一般的です) - 元のPDFがスマートフォンで撮影した写真:より高い
--sig-dpi(350以上)と、より高いインクしきい値を使用します
コメント
Markdown 対応