pdf2img.py ドキュメント
概要
pdf2img.py は、指定したPDFファイルを読み込み、各ページを画像ファイルとして出力するPythonスクリプトです。
依存ライブラリ
標準ライブラリ:
ossys
非標準ライブラリ:
fitz(PyMuPDF)
実行環境に fitz がインポートできない場合、エラーメッセージとともに以下のコマンドでインストールするよう促すメッセージが表示されます。
pip install pymupdf
実行方法と入出力仕様
コマンドラインからスクリプトを実行する際、引数を渡すことで入力ファイル、出力先、画像フォーマットを変更できます。
python pdf2img.py [infile] [out_dir] [image_format]
コマンドライン引数
引数は渡された順番に評価されます。省略した場合は以下のデフォルト値が使用されます。
infile: 入力PDFファイル名(デフォルト:output.pdf)out_dir: 画像の保存先ディレクトリ名(デフォルト:images)image_format: 出力画像の拡張子・フォーマット(デフォルト:png)
※実装上の注意点: スクリプト末尾の実行エントリポイント( if __name__ == '__main__': )において、デフォルトの infile ではなく未定義の変数 pdf_file を参照してファイルパスを構築している箇所があります(コードからはそのように確認できます)。そのため、そのまま実行すると変数未定義エラーが発生する可能性があります。
関数リファレンス
convert_pdf_to_images(pdf_file, out_dir, image_format)
PDFを画像に変換し、指定されたディレクトリに保存する関数です。
処理フロー:
実行時の設定値(入力ファイル、出力ディレクトリ、出力フォーマット)を標準出力に表示する。
保存先ディレクトリ
out_dirが存在しない場合、os.makedirs()を用いて新しく作成する。fitz.open()を使用して指定されたpdf_fileを開く。ドキュメントの総ページ数分だけループ処理を行う。
load_page()でページを読み込み、get_pixmap()で画像のピクセルデータを取得する。page_<ページ番号>.<image_format>というファイル名(ページ番号は1から開始)を生成し、指定ディレクトリ内に保存する。
背景理論とアルゴリズム(推測)
本プログラムにおけるPDFから画像への変換(ラスタライズ処理)について、背景となる数学的処理を推測し解説します。
PDFの各ページはベクトルデータとして定義されていますが、画像ファイル( png など)へ変換する際、離散的なピクセル格子(ラスタ画像)にマッピングされます。
画像の解像度を \(R\) \([DPI]\)、PDFのページ寸法を \(W_{pt}\) (幅)および \(H_{pt}\) (高さ)とします。PDFの標準的な寸法単位である1ポイントは \(1/72\) インチであるため、変換後のピクセル幅 \(W_{px}\) および高さ \(H_{px}\) は以下の式で計算されます。
PDF上の任意の座標 \((x_{pt}, y_{pt})\) は、ラスタライズ時のアフィン変換によってピクセル座標 \((x_{px}, y_{px})\) に変換されます。この変換は以下の行列式で表されます。
ここで、\(s_x\) および \(s_y\) はスケール係数( \(R/72\) に相当)、\(t_x\) および \(t_y\) は並行移動成分を示します。
得られた各ピクセルの色は、PDF内の描画コマンドに基づく重なり合わせ(アルファブレンド)により計算され、最終的にRGBまたはRGBAのピクセル配列として保存されます。各ピクセルの輝度値 \(I\) は、\(0 \le I \le 255\) の範囲の離散値を取ります。