こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
Pythonで複数のPDFファイルを結合する方法
Pythonでは「PyPDF2」というPDF文書を操作できるモジュールがあり、それを用いてPDFファイルを統合します。PyPDF2を用いて読み書き用オブジェクトを生成し、PDFファイル統合・出力という手順でプログラムを構築します。
PyPDF2モジュール
PDFを操作するPyPDF2
モジュールは事前にインストールが必要です。コマンドラインから下記を実行し、インストールしておきましょう。
pip install PyPDF2
【参考】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とは?・実現できること
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら