Pypdfium2とは、Googleが開発・保守している高性能なPDFレンダリングライブラリ「PDFium」のPythonバインディングです。
PyPI:https://pypi.org/project/pypdfium2/
GitHub:https://github.com/pypdfium2-team/pypdfium2
最近は生成AIにINPUTするにあたって、PDFをテキスト化するのに利用されているケースが多いです。
マルチモーダルな生成AIにINPUTするのに、PDFを画像化するケースもありますがその場合にも活用できます。
Pythonで使えるPDFの画像化ライブラリには
- PyMuPDF(fitz)
- pdf2image
がありますが、PyMuPDFはAGPL or 商用ライセンス、pdf2imageはMITライセンスですが依存しているpopplerはGPLライセンスであり、企業で利用する場合には躊躇することも多いかと思います。
その点、Pypdfium2はApache-2.0またはBSD-3-Clauseライセンスの下で提供されており、商用利用にも適しています。(PdfiumもApache 2.0ライセンス)
今回はPypdfium2を使って、PDFを画像化する方法を記載しています。
実行環境
- Python:3.12.4
- Pypdfium2:4.30.1
フォルダ構成
pypdfium2_sample/
├── image/ # 画像を保存するディレクトリ
├── main.py # メインのPythonスクリプト
└── sample.pdf # 処理対象のPDFファイル
上記のようなフォルダ構成で作成しています。
PDFは適当なものをsample.pdfにリネームしてください。
私は厚生労働省の「身体活動・運動」というPDFをサンプルとして利用しました。
https://www.mhlw.go.jp/www1/topics/kenko21_11/pdf/b2.pdf
文章がメインのPDFですが、最後のページにはこのような画像もあります。

サンプルコード
import pypdfium2 as pdfium
# PDFファイルを読み込む
pdf = pdfium.PdfDocument("sample.pdf")
# 総ページ数を取得
n_pages = len(pdf)
# 各ページを1ページずつ処理
for page_number in range(n_pages):
# ページを取得
page = pdf.get_page(page_number)
# スケール・回転・トリミングの指定に基づき画像としてレンダリング
pil_image = page.render(
scale=1,
rotation=0,
crop=(0, 0, 0, 0),
).to_pil()
# PNGファイルとして保存
pil_image.save(f"image/image_{page_number+1}.png")
実行結果
18ページ分のPNGファイルが image/
ディレクトリに生成されました。文字中心のページも画像が入っているページも、いずれも高品質にレンダリングできています。


まとめ
今までPDFの画像化ライブラリは、企業利用だと微妙なライセンスのものが多かったので、Pypdfium2はかなりありがたいですね。
生成AIの前処理に重宝するライブラリなので、是非使ってみてください。
コメント