【Python】複数のPDFファイルを結合する方法|PyPDF2の使い方解説

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

複数のPDFファイルを1つのファイルに結合したい」本記事ではこの要望に応えます。記事前半ではPythonを用いたPDFファイル統合手順の概要を紹介し、後半では実際のプログラミング手法を紹介します。

目次

Pythonで複数のPDFファイルを結合する方法

Pythonでは「PyPDF2」というPDF文書を操作できるモジュールがあり、それを用いてPDFファイルを統合します。PyPDF2を用いて読み書き用オブジェクトを生成し、PDFファイル統合・出力という手順でプログラムを構築します。

PyPDF2モジュール

PDFを操作するPyPDF2モジュールは事前にインストールが必要です。コマンドラインから下記を実行し、インストールしておきましょう。

pip install PyPDF2

【参考】PDFソフトで全てのPDFタスクを取り扱う方法

Python言語で構築することに障壁がある方向けに、ノーコードかつ手軽にPDFタスクに対応できるソフトを紹介します。Pythonで構築したPDF機能と上記ソフト機能を比較し、お好みの方法を選択できると良いでしょう。

Pythonを活用してPDFタスクの自動化手法を深く学びたい方向けに、おすすめの教材も併せてご紹介します。

【Python】複数PDFの結合した新規ファイルを作成する

それでは実際にPythonを活用してプログラムを記述していきましょう!

PDF読み込む用のオブジェクト生成

事前に統合したいPDFファイルをPython実行スクリプトと同じディレクトリに格納した後、スクリプト上にファイル情報を入力します。

コードは下記のように記載しましょう。

#ライブラリを読み込み
import PyPDF2

#読み込むPDFファイル名
pdf_file_name1 = "ファイル1.pdf" #ファイル名を記載しましょう
pdf_file_name2 = "ファイル2.pdf" #ファイル名を記載しましょう

#読み込むPDFファイルのリストを作成
file_list = [pdf_file_name1,pdf_file_name2]

今回は2つのPDFファイルの統合例を示します。もし3つ以上のPDFファイルを統合したい場合はpdf_file_name3、pdf_file_name4・・・と定義した後、file_listにその情報を格納するようにしましょう。

続いて上記で指定したPDFファイルをopen()関数で読み込んだ後、PyPDF2.PdfFileReader()メソッドに渡してオブジェクトを生成します。

#Open()関数を用いてPDFファイルを読み込み、PdfFileReaderオブジェクト生成
pdf_obj_list = []
for i in range(len(file_list)):
    #Open関数で読み込み
    pdf_read = open(file_list[i],"rb")
    #PdfFileReaderオブジェクト生成
    obj = PyPDF2.PdfFileReader(pdf_read)
    #生成したオブジェクトをリストに格納
    pdf_obj_list.append(obj)
    
#オブジェクトの中身確認
pdf_obj_list
# 出力結果
# [<PyPDF2.pdf.PdfFileReader at 0x7fe654e>,
#  <PyPDF2.pdf.PdfFileReader at 0x7fe654d>]

生成したオブジェクトはリストに格納しています。

PDF書き込み用のオブジェクト生成

PDFを書き込むためのオブジェクトを作成します。下記のように実行しましょう。

pdf_writer_obj = PyPDF2.PdfFileWriter()

PDFファイルの結合

作成したPdfFileWriterオブジェクト上に、最初に読み込んだPDF情報を順次コピーしていきます。下記を実行しましょう。

#①統合したいPDFファイル情報を順次指定
for i in range(len(pdf_obj_list)):
    
    #②統合したいPDFファイルのページ情報を順次指定
    for num in range(pdf_obj_list[i].numPages):
        #③ページ情報取得
        page_info = pdf_obj_list[i].getPage(num)
        #④PdfFileWriterオブジェクト上にページ情報反映
        pdf_writer_obj.addPage(page_info)

結合した新規PDFファイル出力

最後に1つに統合したPDFファイルを出力します。下記のように実行しましょう。

#出力するファイル名
new_pdf_file = "ファイル名.pdf"  #ファイル名を記載しましょう

#PDFファイル出力
output = open(new_pdf_file,"wb")
pdf_writer_obj.write(output)

#Close
output.close()
pdf_read.close()

上記実行後、実際にPDFファイルが作成されているか確認してみましょう!

Pythonプログラム全量

上記で紹介した全てのプログラムを関数形式にまとめたものを示します。実際に業務に利用する際は下記をコピー&ペーストして利用すると便利でしょう。

import PyPDF2

"""
********************************************
引数情報:要編集(A)〜(C)
********************************************
"""
#(A)読み込むPDFファイル名
pdf_file_name1 = "ファイル1.pdf"
pdf_file_name2 = "ファイル2.pdf"

#(B)読み込むPDFファイルのリストを作成
file_list = [pdf_file_name1,pdf_file_name2]

#(C)出力するPDFファイル名を記載
new_pdf_file = "newfile.pdf"


def file_integrate(file_list,new_pdf_file):
    
    """
    ********************************************
    手順① Open()関数を用いてPDFファイルを読み込み、PdfFileReaderオブジェクト生成
    ********************************************
    """
    pdf_obj_list = []
    for i in range(len(file_list)):

        #Open関数で読み込み
        pdf_read = open(file_list[i],"rb")

        #PdfFileReaderオブジェクト生成
        obj = PyPDF2.PdfFileReader(pdf_read)

        #生成したオブジェクトをリストに格納
        pdf_obj_list.append(obj)
    
    """
    ********************************************
    手順②PdfFileWriterオブジェクト生成
    ********************************************
    """
    pdf_writer_obj = PyPDF2.PdfFileWriter()
    
    """
    ********************************************
    手順③PDFファイルの結合
    ********************************************
    """
    #PdfFileReaderオブジェクト → PdfFileWriterオブジェクトにページをコピー
    for i in range(len(pdf_obj_list)):

        for num in range(pdf_obj_list[i].numPages):
            page_info = pdf_obj_list[i].getPage(num)
            pdf_writer_obj.addPage(page_info)
   
    """
    ********************************************
    手順④結合した新規PDFファイル出力
    ********************************************
    """
    #PDFファイル出力
    output = open(new_pdf_file,"wb")
    pdf_writer_obj.write(output)

    #Close
    output.close()
    pdf_read.close()
    
    print("Complete!")

関数名はfile_integrate()としています。第一引数に統合したいPDFファイル名が格納されたリスト情報(file_list)、第二引数に出力するPDFファイル名(new_pdf_file)を渡すと実行できます。

2つのPDFファイルの特定のページ番号のみを統合する

最後に下記のようなニーズを満足できるPythonスクリプトも紹介します。

  • 2つのPDFファイルを統合したい
  • 統合するページは指定したい(例:1ページ目は統合するが2ページ目は統合したくない)
import PyPDF2

"""
********************************************
引数情報:要編集(A)
********************************************
"""
#(A)読み込むPDFファイル名
pdf_file_name1 = "ファイル1.pdf"  #1つ目のPDFファイル名を記載
pdf_file_num1  = [1,3,5]         #1つ目のPDFファイルで統合したいページ番号を記載

pdf_file_name2 = "ファイル2.pdf"  #2つ目のPDFファイル名を記載
pdf_file_num2  = [1,2,3]        #2つ目のPDFファイルで統合したいページ番号を記載

#(B)読み込むPDFファイル情報
filename_list = [pdf_file_name1, pdf_file_name2]  #ファイル名
filenum_list  = [pdf_file_num1,pdf_file_num2]     #統合したいファイル番号

#(C)出力するPDFファイル名を記載
new_pdf_file = "newfile.pdf"


def file_integrate(filename_list,filenum_list,new_pdf_file):
    
    """
    ********************************************
    手順① Open()関数を用いてPDFファイルを読み込み、PdfFileReaderオブジェクト生成
    ********************************************
    """
    pdf_obj_list = []
    for i in range(len(filename_list)):

        #Open関数で読み込み
        pdf_read = open(filename_list[i],"rb")

        #PdfFileReaderオブジェクト生成
        obj = PyPDF2.PdfFileReader(pdf_read)

        #生成したオブジェクトをリストに格納
        pdf_obj_list.append(obj)
    
    """
    ********************************************
    手順②PdfFileWriterオブジェクト生成
    ********************************************
    """
    pdf_writer_obj = PyPDF2.PdfFileWriter()
    
    """
    ********************************************
    手順③PDFファイルの結合
    ********************************************
    """
    #PdfFileReaderオブジェクト → PdfFileWriterオブジェクトにページをコピー
    for i in range(len(pdf_obj_list)):

        for num in filenum_list[i]:
            page_info = pdf_obj_list[i].getPage(num-1)
            pdf_writer_obj.addPage(page_info)
   
    """
    ********************************************
    手順④結合した新規PDFファイル出力
    ********************************************
    """
    #PDFファイル出力
    output = open(new_pdf_file,"wb")
    pdf_writer_obj.write(output)

    #Close
    output.close()
    pdf_read.close()
    
    print("Complete!")

関数名はfile_integrate()としています。第1引数(統合したいPDFファイル名が格納されたリスト情報)、第2引数(統合したいPDFファイルの番号が格納されたリスト情報)、第3引数(出力するPDFファイル名)を渡すと実行できます。

関数はコピー&ペーストした後、下記の部分(PDFファイル名とページ番号)を修正して活用しましょう。

#(A)読み込むPDFファイル名
pdf_file_name1 = "ファイル1.pdf"  #1つ目のPDFファイル名を記載
pdf_file_num1  = [1,3,5]         #1つ目のPDFファイルで統合したいページ番号を記載

pdf_file_name2 = "ファイル2.pdf"  #2つ目のPDFファイル名を記載
pdf_file_num2  = [1,2,3]        #2つ目のPDFファイルで統合したいページ番号を記載

【参考】Pythonで面倒な作業を自動化!手法一挙公開中!

当サイトでは日々面倒な作業をPythonで自動化する方法を多数配信しております。日々の作業が飛躍的効率化できること間違いなしですので、以下気になった記事があれば併せてご覧ください。

【面倒なタスクをPythonで解決!】作業効率化の人気記事一覧




【参考】Pythonとは?・実現できること

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次