pdf2img.py ドキュメント

概要

pdf2img.py は、指定したPDFファイルを読み込み、各ページを画像ファイルとして出力するPythonスクリプトです。

依存ライブラリ

標準ライブラリ:

  • os

  • sys

非標準ライブラリ:

  • fitz (PyMuPDF)

実行環境に fitz がインポートできない場合、エラーメッセージとともに以下のコマンドでインストールするよう促すメッセージが表示されます。

pip install pymupdf

実行方法と入出力仕様

コマンドラインからスクリプトを実行する際、引数を渡すことで入力ファイル、出力先、画像フォーマットを変更できます。

python pdf2img.py [infile] [out_dir] [image_format]

コマンドライン引数

引数は渡された順番に評価されます。省略した場合は以下のデフォルト値が使用されます。

  1. infile : 入力PDFファイル名(デフォルト: output.pdf)

  2. out_dir : 画像の保存先ディレクトリ名(デフォルト: images)

  3. image_format : 出力画像の拡張子・フォーマット(デフォルト: png)

※実装上の注意点: スクリプト末尾の実行エントリポイント( if __name__ == '__main__': )において、デフォルトの infile ではなく未定義の変数 pdf_file を参照してファイルパスを構築している箇所があります(コードからはそのように確認できます)。そのため、そのまま実行すると変数未定義エラーが発生する可能性があります。

関数リファレンス

convert_pdf_to_images(pdf_file, out_dir, image_format)

PDFを画像に変換し、指定されたディレクトリに保存する関数です。

処理フロー:

  1. 実行時の設定値(入力ファイル、出力ディレクトリ、出力フォーマット)を標準出力に表示する。

  2. 保存先ディレクトリ out_dir が存在しない場合、os.makedirs() を用いて新しく作成する。

  3. fitz.open() を使用して指定された pdf_file を開く。

  4. ドキュメントの総ページ数分だけループ処理を行う。

  5. load_page() でページを読み込み、get_pixmap() で画像のピクセルデータを取得する。

  6. page_<ページ番号>.<image_format> というファイル名(ページ番号は1から開始)を生成し、指定ディレクトリ内に保存する。

背景理論とアルゴリズム(推測)

本プログラムにおけるPDFから画像への変換(ラスタライズ処理)について、背景となる数学的処理を推測し解説します。

PDFの各ページはベクトルデータとして定義されていますが、画像ファイル( png など)へ変換する際、離散的なピクセル格子(ラスタ画像)にマッピングされます。

画像の解像度を \(R\) \([DPI]\)、PDFのページ寸法を \(W_{pt}\) (幅)および \(H_{pt}\) (高さ)とします。PDFの標準的な寸法単位である1ポイントは \(1/72\) インチであるため、変換後のピクセル幅 \(W_{px}\) および高さ \(H_{px}\) は以下の式で計算されます。

\[W_{px} = \lfloor W_{pt} \times \frac{R}{72} \rfloor\]
\[H_{px} = \lfloor H_{pt} \times \frac{R}{72} \rfloor\]

PDF上の任意の座標 \((x_{pt}, y_{pt})\) は、ラスタライズ時のアフィン変換によってピクセル座標 \((x_{px}, y_{px})\) に変換されます。この変換は以下の行列式で表されます。

\[\begin{split}\begin{pmatrix} x_{px} \\ y_{px} \\ 1 \end{pmatrix} = \begin{pmatrix} s_x & 0 & t_x \\ 0 & s_y & t_y \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x_{pt} \\ y_{pt} \\ 1 \end{pmatrix}\end{split}\]

ここで、\(s_x\) および \(s_y\) はスケール係数( \(R/72\) に相当)、\(t_x\) および \(t_y\) は並行移動成分を示します。

得られた各ピクセルの色は、PDF内の描画コマンドに基づく重なり合わせ(アルファブレンド)により計算され、最終的にRGBまたはRGBAのピクセル配列として保存されます。各ピクセルの輝度値 \(I\) は、\(0 \le I \le 255\) の範囲の離散値を取ります。