Pypdfium2でPDFを画像化する

Pypdfium2 Python

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の前処理に重宝するライブラリなので、是非使ってみてください。

コメント

タイトルとURLをコピーしました