Pythonでは外部ライブラリpypdf
を使うと、簡単にPDFを結合することができます。
しかし、実際に使おうとすると次のような問題に直面することも…
pypdf
のインストール方法は?- 結合にはどのメソッドを使うの?
- フォルダ内のPDFを一括で結合するには?
そこで、この記事ではpypdf
を使用したPDFの結合方法についてわかりやすく解説していきます。
PDFの結合の方法
PythonでPDFを結合する場合は、PDF操作用の外部ライブラリpypdf
を使うと便利です。
pypdf
でPDFを結合する場合には、次の手順を踏んでいきます。
- PDF結合用ライブラリのインストール
pypdf
モジュールからPdfMerger()
をimport
PdfMerger()
オブジェクトを作成.append()
メソッドでPDFを結合.write()
メソッドで書き出し、.close()
メソッドでPDFを閉じる
例として、sample1.pdf
にsample2.pdf
を結合するサンプルコードを見てみましょう。
from pypdf import PdfMerger
# PdfMerger()オブジェクトを作成
merger = PdfMerger()
# 結合するPDFのパスをリストで準備
pdfs = ["sample1.pdf", "sample2.pdf"]
# for文で結合
for pdf in pdfs:
merger.append(pdf)
# 書き出し
merger.write("merged.pdf")
merger.close()
sample1.pdf
にsample2.pdf
が結合されたmerged.pdf
がカレントフォルダに出力されます。
簡単にPDFの結合ができますね。
以下では、次の内容についてさらに詳しく解説していきます。
pypdfのインストール方法
まずはPDF操作用の外部ライブラリpypdf
をインストールしましょう。
pip
でインストールする場合は、ターミナルで以下のコマンドを実行します。
pip install pypdf
Anaconda
の場合は、conda-forge
からインストールできます。
次のコマンドでインストールしましょう。
conda install pypdf -c conda-forge
結合手順の詳しい解説
pypdf
をインストールしたら、PdfMerger
クラスを使用してPDFを結合します。
from pypdf import PdfMerger
merger = PdfMerger()
PdfMerger
の.append()
メソッドにPDFを渡して結合していきましょう。
.append()
メソッドにPDFを渡すと、末尾にPDFが追加されていきます。
pdfs = ["sample1.pdf", "sample2.pdf", "sample3.pdf"]
for pdf in pdfs:
merger.append(pdf)
最後に結合後のPDFを書き出します。
merger.write("merged.pdf")
merger.close()
書き出し後はリソースを開放するために.close()
するのを忘れないようにしましょう。
.close()
を忘れがちな人は、初めからwith open()
構文を使ってもOKです。
with open("merged.pdf", "wb") as f:
merger.write(f)
- 【参考】作業の効率化や自動化については、次の記事も参考にしてみてください。
PDFファイルの指定方法
ここまでの例では、文字列でカレントフォルダ内のPDFファイルを指定しました。
これ以外にも.append()
メソッドでは、次のようにPDFを指定できます。
形式 | 例 |
---|---|
パスの文字列 | ・'sample.pdf' ・ './file_name/sample.pdf' |
Path オブジェクト |
・Path('./file_name/sample.pdf') |
PdfReader オブジェクト |
・PdfReader('sample.pdf') |
Path
オブジェクトを直接渡せるので、ファイル探索とも相性がいいです。
以下で.glob()
メソッドで、特定のフォルダ内のPDFを探索する例を見てみましょう。
特定のフォルダ内のPDFファイルを全て結合
Pathオブジェクトのファイル検索メソッド.glob()
を使用すると、特定のフォルダ内のPDFファイルを検索することが可能です。
まずはPathオブジェクトを生成します。
path = Path("FOLDER_PATH")
次に以下のようなテンプレで.pdf
を検索します。
検索先 | パターンテンプレ |
---|---|
Pathフォルダ内 | Path.glob("*.pdf") |
サブフォルダ内 | Path.glob("*/*.pdf") |
Pathフォルダ+サブフォルダ内 | Path.glob("**/*.pdf") |
例として、./source
フォルダ内の全てのPDFを探索・結合してみます。
from pathlib import Path
from pypdf import PdfMerger
folder = Path("./source")
merger = PdfMerger()
# folder内のPDFファイルを探索 → 結合
for pdf in folder.glob("*.pdf"):
merger.append(pdf)
# 結合したPDFを出力
with open(folder / "merged.pdf", "wb") as f:
merger.write(f)
- 【参考】
.glob()
でのファイル探索は、次の記事で詳しく解説しています。
指定のページにPDFを挿入
ここまで紹介してきた.append()
メソッドでは、末尾にPDFが追加されます。
PDFの特定の位置に新規PDFを挿入する場合は.merge()
メソッドを使用します。
.merge()
のその他の引数は.append()
と同じです。
2ページ目にPDFを追加する例をサンプルコードで確認してみましょう。
from pypdf import PdfMerger
merger = PdfMerger()
pdfs = ["sample1.pdf", "sample2.pdf"]
for pdf in pdfs:
merger.merge(2, pdf)
merger.write("merged.pdf")
merger.close()
PDFに表紙がある場合や、章立てがある場合に便利ですね。
結合するページの指定
pages
引数を指定すると、特定のページのみを結合することが可能です。
pages
の指定方法は次の通りです。
指定方法 | 指定例 |
---|---|
[結合するページのリスト] |
・[1, 5] → 0, 4ページ・ [0, 1, 0, 1] → 1, 2, 1, 2ページ(同一ページの指定もOK) |
range 形式のタプル(start, end [,step] ) |
・(2, 10) → 3~10ページ |
pypdf.PageRangeオブジェクト |
・PageRange(2, 10) → 3~10ページ・ PageRange("1:") → 2ページ目から末尾まで |
Pythonは数字を0からカウントするので、ページ番号と1ずれます。
そのため、結果としてrange
関係は始点のページが含まれなくなります。
例として、PageRange
を使って2ページ目移行を結合する例を見てみましょう。
from pypdf import PageRange
merger = PdfMerger()
merger.append("sample.pdf", pages=PageRange("1:"))
merger.write("res.pdf")
merger.close()
PDFの結合方法まとめ
今回はPythonの外部ライブラリpypdfを使ってPDFを結合する方法を紹介しました。
Pythonは豊富な外部ライブラリのおかげで、様々なファイルやソフトを簡単に操作できます。
作業の効率化や自動化については、次の記事も参考にしてみてください。