この記事では、PythonのPyPDF2
とpathlib
ライブラリを使い、特定のフォルダ内にあるすべてのPDFファイルをアルファベット順に一つのPDFファイルへと自動で結合する、実用的なスクリプトの作成方法を解説します。
目次
1. 準備:PyPDF2のインストール
このスクリプトは、PDFを操作するPyPDF2
と、ファイルパスを扱う標準ライブラリのpathlib
を使用します。PyPDF2
はサードパーティ製のため、事前にインストールが必要です。
pip install PyPDF2
2. プロジェクトの設計
スクリプトの処理フローは以下の通りです。
- スクリプトが実行されたフォルダ(カレントディレクトリ)から、
.pdf
で終わるすべてのファイルを探し出す。 - 見つかったPDFファイルをアルファベット順に並び替える。
- 新しいPDFを作成するための
PdfWriter
オブジェクトを準備する。 - 並び替えた順に各PDFファイルを開き、その中のページをすべて
PdfWriter
オブジェクトに追加していく。 - 最後に、すべてのページが追加された
PdfWriter
オブジェクトの内容を、一つの新しいPDFファイルとして保存する。
3. 完成したコード全体
上記の設計に基づいた完全なスクリプトを以下に示します。このコードをmerge_pdfs.py
などの名前で保存し、結合したいPDFファイルと同じフォルダに置いて実行してください。
from pathlib import Path
import PyPDF2
# 1. カレントディレクトリからPDFファイルを探す
pdf_files = []
# Path('.').glob('*.pdf')で現在のフォルダのPDFをすべて取得
for file_path in sorted(Path('.').glob('*.pdf')):
pdf_files.append(file_path)
print(f"以下の{len(pdf_files)}個のPDFファイルを結合します:")
for file in pdf_files:
print(f" - {file.name}")
# 2. PDFライターを準備
pdf_writer = PyPDF2.PdfWriter()
# 3. 各PDFファイルを開き、ページを追加
for file_path in pdf_files:
try:
# with文でファイルを開く
with open(file_path, 'rb') as f:
pdf_reader = PyPDF2.PdfReader(f)
# reader.pagesで全ページをループ
for page in pdf_reader.pages:
pdf_writer.add_page(page)
except Exception as e:
print(f"エラー: {file_path}の処理中に問題が発生しました - {e}")
# 4. 結合したPDFをファイルに保存
try:
with open('merged_output.pdf', 'wb') as output_pdf:
pdf_writer.write(output_pdf)
print("\nすべてのPDFを'merged_output.pdf'に結合しました。")
except Exception as e:
print(f"\nエラー: ファイルの保存中に問題が発生しました - {e}")
4. 補足:特定のページのみを結合する場合
もし各PDFの最初のページを除外するなど、特定のページだけを結合したい場合は、ページを追加するループ部分を修正します。
例えば、各PDFの2ページ目以降のみを結合するには、for page in pdf_reader.pages:
の部分を以下のように変更します。
# スライスを使って2ページ目以降(インデックス1から)を取得
for page in pdf_reader.pages[1:]:
pdf_writer.add_page(page)
まとめ
pathlib
を使って効率的にファイルを検索し、PyPDF2
の最新のAPI(PdfReader
, PdfWriter
, add_page
)とwith
文を組み合わせることで、フォルダ内の多数のPDFを安全かつ確実に結合する処理を自動化できます。このスクリプトは、レポートの各章を個別のPDFとして作成し、最後に一つにまとめるといった作業に役立ちます。