「PythonではPDF関連のライブラリが多すぎる・・・」
「PythonでPDFの分割・結合がしたい」
このような場合には、pypdfがオススメです。
この記事では、PDFの分割・結合が可能なpypdfについて解説しています。
本記事の内容
- pypdfとは?
- pypdfのシステム要件
- pypdfのインストール
- pypdfの動作確認
それでは、上記に沿って解説していきます。
pypdfとは?
pypdfとは、pure PythonなPythonのPDF用ライブラリです。
pypdfの機能としては、以下があります。
- 分割
- 結合
- 切り取り
- 変換
- カスタムデータ・表示オプション・パスワード設定
- テキスト・メタデータ抽出
これ一つでPDFに関連する処理は、大体はできそうですね。
pypdf自体は、v1.0が2006年1月18日にリリースされています。
しかし、一旦開発は2010年にストップします。
そして、2022年12月24日に再び動き出します。
PyPDF2と合流したようです。
PyPDF2の公式ページで次のように記載されています。
したがって、PyPDF2を使っている人はpypdfに切り替えた方が良いでしょうね。
PyPDF2は、開発が停止していますので。
以上、pypdfについて説明しました。
次は、pypdfのシステム要件を説明します。
pypdfのシステム要件
現時点(2023年8月9日)でのpypdfの最新バージョンは、3.15.0となります。
更新は頻度が高く実施されています。
サポートOSに関しては、以下を含むクロスプラットフォーム対応です。
pure Pythonである以上、当然ですね。
- Windows
- macOS
- Linux
サポート対象となるPythonのバージョンは、以下となっています。
- Python 3.6
- Python 3.7
- Python 3.8
- Python 3.9
- Python 3.10
- Python 3.11
- Python 3.12
そうは言っても、利用する側としてはPython公式開発サイクルに従いましょう。
バージョン | リリース日 | サポート期限 |
3.7 | 2018年6月27日 | 2023年6月27日 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年10月4日 | 2026年10月 |
3.11 | 2022年10月24日 | 2027年10月 |
Python公式開発サイクルによると、Python 3.8以降が対象となります。
よって、ここではPython 3.8以降を推奨しておきます。
以上、pypdfのシステム要件を説明しました。
次は、pypdfをインストールします。
pypdfのインストール
検証は、次のバージョンのPythonで行います。
> python -V Python 3.11.4
まずは、現状のインストール済みパッケージを確認しておきます。
その前に、pipとsetuptoolsの更新を実施しておきましょう。
python -m pip install --upgrade pip setuptools
インストール済みパッケージを確認した結果は、以下。
> pip list Package Version ---------- ------- pip 23.2.1 setuptools 68.0.0 wheel 0.38.4
では、pypdfのインストールです。
pypdfのインストールは、以下のコマンドとなります。
(※PDFの暗号化・復号化機能も含む)
pip install pypdf[crypto]
pypdfのインストールは、すぐに終わります。
終了したら、どんなパッケージがインストールされたのかを確認します。
> pip list Package Version ------------ ------- cffi 1.15.1 cryptography 41.0.3 pip 23.2.1 pycparser 2.21 pypdf 3.15.0 setuptools 68.0.0 wheel 0.38.4
「crypto」を含めると、暗号化関連のライブラリが追加されます。
それでも、pypdfの依存関係は多くはありませんね。
以上、pypdfのインストールを説明しました。
次は、pypdfの動作確認を説明します。
pypdfの動作確認
pypdfの動作確認を行います。
今回は、以下の処理を確認します。
- PDFの結合
- PDFの読み取り
- PDFの分割
- PDFの暗号化
それぞれの処理を以下で説明します。
PDFの結合
まず、PDFファイルを二つ用意します。
file1.pdf
file2.pdf
これらを結合して、merged.pdfを作成することにします。
そのためのコードは、以下。
from pypdf import PdfReader, PdfWriter reader1 = PdfReader("file1.pdf") reader2 = PdfReader("file2.pdf") writer = PdfWriter() for page in reader1.pages: writer.add_page(page) for page in reader2.pages: writer.add_page(page) with open("merged.pdf", "wb") as output_file: writer.write(output_file)
上記コードを実行すると、merged.pdfが作成されます。
merged.pdf
合計が、2ページになっているのが確認できます。
PDFの読み取り
さきほどのmerged.pdfを読み取りましょう。
from pypdf import PdfReader reader = PdfReader("merged.pdf") for page_num in range(len(reader.pages)): page = reader.pages[page_num] text = page.extract_text() print(f"Page {page_num + 1}:") print(text) print("-" * 50)
上記を実行した結果、コンソールに以下が表示されます。
Page 1: これはfile1 です。 -------------------------------------------------- Page 2: これはfile2 です。 --------------------------------------------------
merged.pdfの内容をすべて読み取れています。
PDFの分割
merged.pdfを分割します。
各ページを順番に読み取り、それぞれのページを個別のPDFファイルとして保存します。
from pypdf import PdfReader, PdfWriter reader = PdfReader("merged.pdf") for page_num in range(len(reader.pages)): writer = PdfWriter() page = reader.pages[page_num] writer.add_page(page) output_filename = f"page_{page_num + 1}.pdf" with open(output_filename, "wb") as output_file: writer.write(output_file) print(f"Page {page_num + 1} saved as {output_filename}")
上記を実行した結果、コンソールに以下が表示されます。
Page 1 saved as page_1.pdf Page 2 saved as page_2.pdf
そして、2つのPDFが同フォルダ内に作成されていることを確認できます。
内容は、file1.pdfとfile2.pdfと同じです。
PDFの暗号化
merged.pdfを暗号化します。
パスワードを設定するということです。
from pypdf import PdfReader, PdfWriter reader = PdfReader("merged.pdf") writer = PdfWriter() for page in reader.pages: writer.add_page(page) writer.encrypt("password") with open("encrypted.pdf", "wb") as output_file: writer.write(output_file)
上記を実行すると、encrypted.pdfが作成されます。
このPDFファイルを開こうとすると、パスワードを聞かれます。
今回設定したパスワードは「password」です。
適切なパスワードを入力すると、暗号化が解除されます。
以上、pypdfの動作確認を説明しました。