Python での PDF 処理: PyMuPDF と pikepdf の使い分け#
Python で PDF を扱う際、PyMuPDF(fitz) と pikepdf は両方とも有力だが、得意領域が異なる。両方を使い分けると実装の見通しが良くなる。
役割分担のマップ#
flowchart LR
subgraph PyMuPDF
R[レンダリング]
T[テキスト抽出]
S[検索・ハイライト]
I[画像書き出し]
end
subgraph pikepdf
M[メタデータ編集]
E[ページ抽出・結合]
X[暗号化・復号]
L[低レベル PDF 構造]
end
ライブラリの特徴#
| 観点 | PyMuPDF | pikepdf |
|---|---|---|
| 基盤 | MuPDF(C++) | QPDF(C++) |
| 得意 | ビューア・テキスト抽出 | 構造的編集・圧縮 |
| ライセンス | AGPL / 商用 | MPL 2.0 |
| 速度 | レンダリングが高速 | 構造操作が堅牢 |
| 欠点 | AGPL のため配布時に注意 | レンダリング機能なし |
使い分けの目安#
- PDF を画面表示したい、テキストを検索したい、画像として書き出したい → PyMuPDF
- PDF を分割・結合したい、メタデータや注釈を編集したい、暗号化を扱いたい → pikepdf
- 両方必要なら両方使う。ライブラリを選ぶ時点で「一つで全て」は欲張らない
ライセンスに関する注意#
PyMuPDF は AGPL。商用製品に組み込む場合、商用ライセンスを購入するか、製品を AGPL で公開する必要がある。配布形態を決める段階でライセンスを確認する。開発時に気付かず AGPL を前提にした設計をすると、後で高い代償を払う。
実装の型#
# 読み取り・表示は PyMuPDF
import fitz # PyMuPDF
doc = fitz.open("input.pdf")
page = doc[0]
pix = page.get_pixmap()
pix.save("page.png")
# 構造編集は pikepdf
import pikepdf
pdf = pikepdf.open("input.pdf")
del pdf.pages[0] # 1 ページ目を削除
pdf.save("output.pdf")
両者は同じファイルを別プロセスで扱える。役割で切り分け、必要なときだけ相互に読み書きすればよい。