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

こんにちは、Kosei(@kay_diacc2)です!

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

目次

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

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

PyPDF2モジュール

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

pip install PyPDF2

複数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ファイルが作成されているか確認してみましょう!

プログラム全量

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

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ファイルで統合したいページ番号を記載

最後に

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

本記事をシェア!
URLをコピーする
URLをコピーしました!
目次
閉じる