Pythonを使ってPDFを結合する方法

2018.10.9

はじめに

Pythonを使って複数のPDFを1つのPDFにまとめる方法を紹介します。 PyPDF2というライブラリを使用していますので、インストールしていない場合は、下記のコマンドでインストールしておいてください。

pip install PyPDF2

動作環境は、Windowsを使用していますので、ディレクトリのセパレータが\\になっています。MacやLinuxの環境であれば/に変更してください。

設定ファイルを作成する

pdf_join.jsonというファイルを作成して下記を記述します。pythonコードに直接結合したいファイルを配列で記述してもいいですが、少しだけ汎用的にするため、jsonファイルに設定を書くことにしました。

[
    {
        "outputfilename": "all.pdf",
        "inputfiles": [
            "join\\1-2.pdf",
            "join\\5-6.pdf",
            "join\\7-8.pdf",
            "join\\9-10.pdf",
        ]
    }
]

内容の説明です。

"outputfilename": "all.pdf",

outputfilenameに出力されるファイルの名前を指定しています。

"inputfiles": []

inputfiles配列の中に結合したいファイル名をしてしています。相対パスでも絶対パスでもOKです。

pythonコード

pdf_join.pyというファイルを作成して下記を記述します。

# -*- coding: utf-8 -*-

from PyPDF2 import PdfFileWriter, PdfFileReader
import json

# 設定ファイルの読み込み
f = open("pdf_join.json", 'r', encoding='utf-8')
conf = json.load(f)
f.close()

# 出力するPDFファイルのオブジェクト
output_pdf_obj = PdfFileWriter()

for pdffile in conf[0]['inputfiles']:
    source_pdf = open(pdffile, "rb")
    source_pdf_obj = PdfFileReader(source_pdf, strict=False)
    for i in range(source_pdf_obj.getNumPages()):
        output_pdf_obj.addPage(source_pdf_obj.getPage(i))

# 出力ファイルのオープン
output_pdf = open(conf[0]['outputfilename'], "wb")

# 結合したPDFを書き込み
output_pdf_obj.write(output_pdf)

# PDFオブジェクトのクローズ
output_pdf.close()
source_pdf.close()

コードの説明について、コードのコメントを参照してもらえたらと思います。pdf_join.pyとpdf_join.jsonは同じパスに置いて、pdf_join.pyを実行してください。