Pythonで連番PDFファイルをまとめて結合する
PyPDF2モジュールを使って、ディレクトリ内の連番のPDFファイルをまとめて結合してみました。
目次
結合の処理の流れ
概ね下記の手順で操作します。
ファイル名の取得
ファイルの結合
PdfFileMergerで結合する
PdfFileMergerで結合します。割と単純な方法です。
使用するクラスとメソッドは下記です。
PdfFileMergerクラス
merger = PyPDF2.PdfFileMerger([strict])
名前 |
型 |
内容 |
---|---|---|
strict |
bool |
省略可。既定値はTrue。PDFファイルを読み取ったときの警告を表示するかどうか。 |
merger |
PdfFileMergerクラスのオブジェクト。 |
PdfFileMergerクラスのオブジェクトを初期化します。
appendメソッド
merger.append(fileobj, [bookmark], [pages], [import_bookmarks])
名前 |
型 |
内容 |
---|---|---|
fileobj |
結合するPDFファイルのパス文字列、またはreadとseekを利用可能なオブジェクト。 |
|
bookmark |
str |
省略可。既定値はNone。ブックマーク。 |
pages |
省略可。既定値はNone。PDFファイル内の結合するページの指定。 |
|
import_bookmarks |
bool |
省略可。既定値はFalse。ブックマークをインポートするかどうか。 |
merger |
PdfFileMergerクラスのオブジェクト。 |
PdfFileMergerオブジェクトにfileobjで指定したPDFを追加するメソッドです。
pagesにはfileobjのPDFのどのページを結合するのかを指定します。指定方法は、PageRangeオブジェクトか、タプルです。指定しない場合は全ページが対象になります。タプルで指定する場合は、(start, stop)または(start, stop, step)の形で指定します。start、stop、stepはいずれもintです。ページ数は0始まりで、stopは結合の対象に含まれないことに注意です。
writeメソッド
merger.write(fileobj)
名前 |
型 |
内容 |
---|---|---|
fileobj |
出力するPDFファイルのパス文字列、またはファイルオブジェクト。 |
|
merger |
PdfFileMergerクラスのオブジェクト。 |
PdfFileMergerオブジェクトをファイルに出力します。
closeメソッド
merger.close()
名前 |
型 |
内容 |
---|---|---|
merger |
PdfFileMergerクラスのオブジェクト。 |
PdfFileMergerオブジェクトを削除してメモリを解放します。
連番PDFファイルを結合する実施例
000.pdfから155.pdfまでの連番のPDFファイルを結合してみました。
import glob
import os
import PyPDF2
pdf_files = [os.path.splitext(os.path.basename(i))[0] for i in glob.glob('./*.pdf')]
target_files = []
for i in pdf_files:
if i.isdigit():
target_files.append(i)
target_files.sort()
marger = PyPDF2.PdfFileMerger()
for i in target_files:
marger.append(i + '.pdf')
marger.write('./out.pdf')
marger.close()
globとbasenameとsplitextを使ってPDFファイルのファイル名のリストを作成します。
isdigitでファイル名が数字かどうかを確認して、ファイル名が数字のファイルのリストを作成します。
sortでリストの順番を若い順にします。
そこまでできたら、そのリストを使ってPdfFileMergerでファイルを結合します。
この方法ですと、連番PDF専用のディレクトリを作らなくても良いですし、連番の途中が抜けていても問題なく動作します。
PdfFileReaderとPdfFileWriterで結合する例
PdfFileMergerのwriteメソッドが少し時間がかかりましたので、他の方法も試してみます。
PdfFileReaderクラスとPdfFileWriterクラスを利用するのですが、クラスとメソッドの内容については前の投稿を参照してください。
import glob
import os
import PyPDF2
pdf_files = [os.path.splitext(os.path.basename(i))[0] for i in glob.glob('./*.pdf')]
target_files = []
for i in pdf_files:
if i.isdigit():
target_files.append(i)
target_files.sort()
writer = PyPDF2.PdfFileWriter()
for i in target_files:
reader = PyPDF2.PdfFileReader(i + '.pdf')
for j in range(reader.getNumPages()):
writer.addPage(reader.getPage(j))
with open('out2.pdf', mode='wb') as f:
writer.write(f)
ファイルのリストを作るところまでは、前のコードと同じです。
この方法の方が、心なしか処理が早いですね。
公開日
広告