PDF 画像の歪み補正を簡単に行う完全ガイド ― 初心者からプロまで
イントロダクション
スキャンした書類や印刷物を PDF に変換した際、しばしば「ページが横にずれている」「画像が真ん中にくっついていない」「ページの角が四角くない」などの歪みが発生します。これはスキャナのレンズの歪み、用紙の曲がり、スキャン角度のずれ、または PDF 作成時のバッファ処理の不具合などが原因です。歪んだ画像をそのまま読むと情報が読み取りにくく、特に OCR(光学文字認識)を行う際にはエラー率が劇的に上昇します。
この記事では、PDF 内の画像(ページ)を簡単に補正する方法を、初心者でも分かりやすい手順から、エンジニア向けのコマンドライン・スクリプトまで網羅します。さらに、複数ページを一括処理したい場合や、PDF を編集せずに画像だけを加工したいケースも紹介します。最後に、実際に補正を実行した際の注意点や、よくあるトラブルの対処方法もまとめています。
1. PDF 画像歪みの原因と補正が必要な理由
| 原因 | 発生した際の症状 | 典型的な影響 |
|---|---|---|
| スキャナのレンズ歪み | 画像が円形に広がる、または角が丸くなる | 文字が読みづらい、図形が歪む |
| 用紙の曲がり・曲がり角 | 画像が傾く、左上が下に寄る | 位置合わせが難しい、ページレイアウトが崩れる |
| スキャン角度のずれ | ページ全体が斜めになる | OCR の文字位置がずれる、印刷時に見た目が悪くなる |
| PDF 生成時のバッファ不足 | 余白が増える、画像が切れる | 書類の外枠が不自然になる |
| 画像圧縮の再エンコード | 品質が劣化する、ノイズが増える | 読み取りやすさが低下する |
これらの歪みを放置すると、ドキュメント管理システムや紙の書類と対比した際に整合性が取れず、業務効率が落ちます。特に日本語文書の場合、縦書きや横置き文字が混在しているケースでは、歪みの有無が影響度を大きく左右します。
2. 初心者向け:Adobe Acrobat DC で簡単補正
2‑1. Acrobat の「画像を修正」機能を使って
- Acrobat DC を起動し、歪んだ PDF を開く
- 右側パネルの 「ツール」 をクリック
- 「印刷制作」 → 「画像を修正」 を選択
- 画像上に表示される四隅のハンドルをドラッグして角度や位置を調整
- 画面下部の 「補正」 ボタンを押し、変更を確定
注意:Acrobat の画像修正はページ単位でしか操作できません。複数ページを一括で補正したい場合は後述のバッチツールを利用してください。
2‑2. PDF を編集モードで手動調整(ページ単位)
- 「ファイル」→「印刷」 を選択
- ポップアップで 「印刷プレビュー」 を表示
- 「詳細設定」 から 「画像をページサイズに合わせる」 を選択し、余白を自動で調整
この方法は画像のスケールだけを変えるもので、角度の補正はできません。角度補正が必要な場合は「画像を修正」機能を併用してください。
備考:Acrobat では PDF のページを画像に変換した上で、画像の補正を行うことにもなります。画像の品質保全は設定で調整できます。
3. 無料オープンソースツールで手軽に補正
ここでは、PDF を直接編集し、画像の歪みを補正できる無料ツールを紹介します。GUI と CLI 両方の使い方を提示します。
3‑1. pdfsandwich + Ghostscript
pdfsandwich は PDF に OCR データを埋め込むツールで、内部的に Ghostscript を利用します。補正専用ではありませんが、ページの回転や座標変換を行う際に便利です。
# 画像が歪んでいる PDF を回転させる例
gs -o output.pdf -sDEVICE=pdfwrite \
-c "<</BeginPage{.5 .5 translate 1 0 0 1 0 0 concat}>> setpagedevice" \
-f input.pdf
上記の concat の矩形変換行列で、回転やスケールを指定できます。例えば 1 0 0 1 0 0 は 45° 回転、0.8 0.8 は 80% の縮小を表します。
3‑2. ImageMagick で PDF を変換して補正する
ImageMagick は画像フォーマット変換の代表格。PDF を PNG に変換し、補正した後 PDF に戻すことで柔軟な編集が可能です。
# PDF を PNG へ変換
convert -density 300 input.pdf page_%04d.png
# 画像を傾き補正
for i in page_*.png; do
mogrify -auto-orient -trim "$i"
done
# PNG を再度 PDF に結合
convert page_*.png -density 300 output.pdf
auto-orientは EXIF データに基づく自動回転、trimは余白のトリミングを行います。画像を一枚ずつ編集し、再度 PDF に返すことで、ページ単位で細かい補正が可能です。
3‑3. PyMuPDF (fitz) でプログラム的に補正
Python を使うと、PDF のページを取得し、座標変換行列で偏差を修正できます。以下は 1 ページずつ補正するサンプルです。
import fitz # pip install pymupdf
def deskew_page(pdf_path, output_path):
doc = fitz.open(pdf_path)
for page in doc:
mat = fitz.matrix(1, 1) # identity matrix
# 0.5 は例として -0.5° を示す
mat.rotate(0.5)
pix = page.get_pixmap(matrix=mat)
pix.save("tmp.png")
pix = fitz.Pixmap(pix)
page.insert_image(page.rect, pixmap=pix)
pix = None
doc.save(output_path)
deskew_page("input.pdf", "output.pdf")
大量のページを処理する場合は、
multiprocessingを併用して並列化すると高速化できます。画像の DPI を上げて補正の精度を高めるのも有効です。
4. コマンドライン一括処理で高速補正
大量の PDF を処理する際は、シェルスクリプト + Ghostscript + ImageMagick を組み合わせると最も高速です。
4‑1. スクリプト例(Linux/macOS)
#!/usr/bin/env bash
# 入力フォルダと出力フォルダ
INPUT_DIR="input_pdfs"
OUTPUT_DIR="deskewed_pdfs"
mkdir -p "$OUTPUT_DIR"
# すべての PDF を対象にループ
for pdf in "$INPUT_DIR"/*.pdf; do
base=$(basename "$pdf" .pdf)
echo "Processing $pdf..."
# PDF を PNG に変換(300DPI)
mogrify -path "$OUTPUT_DIR" -density 300 -format png "$pdf"
# 各 PNG に対してオートオリエントとトリム
for png in "$OUTPUT_DIR"/"$base"*.png; do
mogrify -auto-orient -trim "$png"
done
# PNG を再度 PDF に結合
convert "$OUTPUT_DIR"/"$base"*.png -density 300 "$OUTPUT_DIR"/"${base}_deskew.pdf"
# 一時 PNG を削除
rm "$OUTPUT_DIR"/"$base"*.png
done
ポイント
mogrifyの-densityは変換時の DPI を上げるために必須です。convertの-densityは再統合時に DPI を設定し、品質を保ちます。- 余白を自動でトリムできるので、紙面の境界が崩れやすいスキャンにも対応可能です。
4‑2. バッチ処理のトラブルシュート
| 兆候 | 原因 | 対処 |
|---|---|---|
| Convert で「Segmentation fault」 | 画像サイズが巨大すぎる | -resize で 3000×3000 上限にする |
| ページ数が変わる | convert がページ順を入れ替えている |
-adjoin オプションを付ける |
| 文字がぼやける | DPI が低い | -density を 600 以上に設定 |
| ログに「Missing font」 | 文字化け回避のため文字埋め込みが必要 | Ghostscript の -dPDFSETTINGS=/prepress を利用 |
5. プロ向け:Python+OpenCV で高度補正
画像認識と補正を自動化したい場合、OpenCV を使った角度検出が有効です。OCR で文字を読み取りつつ、画像の傾きも同時に補正できます。
import cv2
import numpy as np
import fitz
def detect_skew(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (9, 9), 0)
_, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV)
coords = np.column_stack(np.where(thresh > 0))
angle = cv2.minAreaRect(coords)[-1]
if angle < -45:
angle = -(90 + angle)
else:
angle = -angle
return angle
def deskew_pdf(file_path, out_path):
doc = fitz.open(file_path)
for i, page in enumerate(doc):
pix = page.get_pixmap()
img = np.frombuffer(pix.samples, np.uint8).reshape(pix.height, pix.width, -1)
angle = detect_skew(img)
# 回転行列
center = (img.shape[1] // 2, img.shape[0] // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
# 画像を再度 PDF ページへ挿入
rotated_pix = fitz.Pixmap(fitz.csRGB, rotated)
page.get_contents()[0].set_data(rotated_pix.tobytes())
doc.save(out_path)
deskew_pdf("input.pdf", "output_clean.pdf")
特徴
- 文字領域だけを対象に傾きを検出できるので、背景画像が混在していても正確に補正
- 角度を ±1° 以内で検出できるため、微細な歪みにも対応
注意点
wikipediaのようにページ全体を OpenCV で処理すると、速度が遅くなる場合があります。- 高解像度画像の場合は GPU を利用した
cv2.dnnで高速化する手法もあります。
6. 補正後の PDF の検証チェックリスト
| チェック項目 | 方法 | 工具 |
|---|---|---|
| 余白(マージン) | PDF ビューワでズームし、四隅が一致しているか | Acrobat, Okular |
| 角度 | 画像の直線が水平/垂直か | 画像ビューア、OpenCV の cv2.getRotationMatrix2D |
| 文字認識 | OCR 実行して文字数/文字認識率を確認 | Tesseract, ABBYY FineReader |
| 図形の整合性 | 罫線や表が正しく描かれているか | PDF エディタで線形検索 |
| ページ数一致 | 元ファイルと同じ数か | pdfinfo コマンド |
特に OCR の文字認識率は「補正前」対「補正後」で比較すると、補正効果を定量的に評価できます。
7. よくある不具合と対処法
| 不具合 | 兆候 | 原因 | 対処 |
|---|---|---|---|
| 画像が黒帯で覆われる | 一部が黒または白で埋まる | mogrify 過程で -trim が余白を誤検知 |
-trim の代わりに -extent で正確なサイズに拡張 |
| ページ順が入れ替わる | PDF のページ順が変わって見える | Ghostscript の -sDEVICE=pdfwrite で -c 指定時の書き込み順がおかしい |
-dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=out.pdf で統一 |
| 文字がぼやける | 文字が細かい文字でぼかしが目立つ | 変換時の DPI が低い | -density 600 など DPI を高めに設定 |
| ページが被る | 複数のページが重なって表示 | 画像結合時のオプションが正しくなかった | convert -adjoin を使用し、ページごとに分離 |
| OCR バッチでエラーが多い | OCR の途中でエラーが連発 | 画像の色調が不均一 | convert -level 20,80 -scale 200% でコントラスト調整 |
8. まとめ
- Adobe Acrobat DC で簡単に 1 ページずつ補正できるが、複数ページには不向き
- ImageMagick + Ghostscript でスクリプト化すれば、数百ページの PDF を数分で補正
- Python + PyMuPDF や OpenCV で高度な自動補正も可能
- 補正前後の品質検証 は OCR 精度と画像の余白・角度チェックで行うと確実
- タブと余白の自動検出が誤っている場合は、手動で
-extentでサイズを設定 - DPI、圧縮レベル、結合時のオプションは品質を左右するため注意が必要
これらの方法を組み合わせて、スキャンした PDF の品質を最大限に引き上げるプロセスを構築してみてください。特に大量の資料を扱う業務では、シェルスクリプト一括処理で作業時間を大幅に短縮できる点が大きなメリットです。プロフェッショナルに求められる高精度補正も、Python + OpenCV で簡単に実現できるため、ぜひ試してみてください。


コメント