PDFを結合したい場合にどのような方法で行っていますか?

Adobe AcrobatやいきなりPDFなど有料のソフトを利用している人、無料ソフトをインストールして使用している人、SmallPDFやiLovePDFなどオンラインで行っている人などさまざまだと思います。

有料ソフトを買う余裕もない、無料ソフトやオンラインサイトでの結合ではセキュリティに不安だと思っている人にぜひ試してもらいたいのがPythonのPDF結合です。一度プログラムを作成すると簡単にPDFの結合を行うことができます。

Pythonを使って業務を自動化し効率的にする第一歩としてハードルも低いいい題材だと思いますので特にPythonでの自動化に興味がある人におすすめです。

PyPDF2パッケージのインストール

Windows10を動作確認を行っています。

PythonでPDFの結合を行うためには、Pythonの標準ライブラリには含まれていないPyPDF2パッケージをインストールする必要があります。インストールはパッケージ管理のpipを利用して行います。


>pip install pypdf2
Collecting pypdf2
  Downloading https://files.pythonhosted.org/packages/b4/01/68fcc0d43daf4c6bdbc6b33cc3f77bda531c86b174cac56ef0ffdb96faab/PyPDF2-1.26.0.tar.gz (77kB)
    100% |████████████████████████████████| 81kB 1.3MB/s
Installing collected packages: pypdf2
  Running setup.py install for pypdf2 ... done
Successfully installed pypdf2-1.26.0

pip listコマンドを利用するとインストールが正常に行われているか確認することができます。

PDFの結合

最もシンプルな結合方法

PDFファイルを準備して結合を行います。まずtest.pyファイルを作成し、pyファイルが存在するフォルダの中に1.pdf, 2.pdfという名前の2つのPDFファイルを保存します。


from PyPDF2 import PdfFileMerger

pdf_file_merger = PdfFileMerger()

pdf_file_merger.append('./1.pdf')

pdf_file_merger.append('./2.pdf')

pdf_file_merger.write('merge.pdf')

pdf_file_merger.close()

PDFファイルの結合を行う場合はPyPDF2モジュールの中のPdfFileMergerクラスを利用します。

PdfFileMergerクラスをインスタンス化してpdf_file_merger変数に入れます。

pdf_file_mergerのappend(意味:追加)メソッドで1.pdfと2.pdfを追加して、writeメソッドで結合したファイルmerge.pdfの作成を行っています。

上記を実行すると同じフォルダにmerge.pdfという名前のPDFファイルが作成されます。

これだけの処理でPDFの結合を行うことができます。

appendメソッドとwriteメソッドで指定するファイル名は各自の環境に合わせて変更を行ってください。

append、writeメソッドでファイルパスを設定していますが、パスではなくファイルオブジェクトを利用することも可能です。

ファイルオブジェクトを利用して結合

先ほどはパスを利用してファイルの結合を行っていましたが、下記のようにファイルオブジェクトを使っても結合を行うことができます。


from PyPDF2 import PdfFileMerger

pdf_file_merger = PdfFileMerger()

with open('./1.pdf','rb') as f1:

	pdf_file_merger.append(f1)

with open('./2.pdf','rb') as f2:

	pdf_file_merger.append(f2)

with open('./merge2.pdf','wb') as f3:

	pdf_file_merger.write(f3)
open時のrbはread+binaryモードを表しています。

実践的なPDFファイルの結合

PDFのファイルの結合を行うことができましたが、説明した方法では、実行する前にファイルの名前を確認してPythonファイルに記述する必要があります。2個、3個のファイル名の場合はファイル名の修正を毎回行うことができますが、10個、20個のファイルになると非効率なため業務では利用できません。

より効率的にPDFの結合ができるように任意のフォルダ内に保存されたPDFファイルの名前を自動的に取得して結合するプログラムに変更します。

PDFファイルの名前を取得(glob)

PDF結合とは別にフォルダに保存されているPDFファイルの名前を保存する方法が必要になります。

フォルダ下に保存されているファイル名を取得するためにglobモジュールを利用します。


import glob

for file_name in glob.glob('*.pdf'):
	
	print(file_name)

上記のプログラムを実行すると実行したpyファイルの存在するフォルダ内のPDFファイルの名前のみ表示されます。*.pdfを設定しているためPDFファイル以外は表示されません。


>py glob_test.py
1.pdf
2.pdf

globパッケージを利用するとPDFのファイル名のみ取得できることが確認できました。

拡張子が大文字のPDFの場合もありますが、globでは小文字でも大文字でもPDFファイルの名前を取得してくれます。

globを使った結合

for文を使うことでglobパッケージを使って取得したファイルを個別に取り出すことができます。取り出したファイル名をappendメソッドで指定することで追加を行うことができます。


import glob
from PyPDF2 import PdfFileMerger

pdf_file_merger = PdfFileMerger()

for file_name in glob.glob('*.pdf'):

	pdf_file_merger.append(file_name)

pdf_file_merger.write('merge.pdf')

pdf_file_merger.close()

実行後は、merge.pdfファイルが同じフォルダに作成されます。これで実行前にpyファイル内のファイル名を更新、追加する必要がなくなりました。

Pythonランチャーを使う

WindowsではpyファイルがPythonランチャーに関連付けられていればファイル名をダブルクリックするだけでプログラムを実行することができます。

ファイルを右クリックするとpyファイルに関連付いているアプリケーションがわかるので確認を行ってください。ロケットのアイコンが特徴です。

Pythonランチャー
Pythonランチャー

関連付けられていればダブルクリックするだけで結合のプログラムが実行されます。

実践的な結合の流れ

  1. 任意の名前を付けたデスクトップ等にフォルダを作成します。
  2. 作成したフォルダの中に作成したPythonファイルを保存します。
  3. 結合したいPDFファイルをそのフォルダの中に入れます。
  4. Pythonファイルをダブルクリックします。
  5. merge.pdfというファイルが作成されるのであとはそのファイルをどのように扱うかは自由です。
  6. 結合するために保存したPDFファイルのみ削除して、フォルダにはPythonファイル1つが保存された状態にします。

一度1~6を実施後、フォルダを変更しないのであれば3~6を繰り返すことでPDFの結合を行うことができます。

結合後のファイルの名前はpyファイルの中で変更可能です。