Pythonで連番PDFファイルをまとめて結合する

PyPDF2モジュールを使って、ディレクトリ内の連番のPDFファイルをまとめて結合してみました。

目次

  1. 結合の処理の流れ
  2. PdfFileMergerで結合する
  3. 連番PDFファイルを結合する実施例
  4. PdfFileReaderとPdfFileWriterで結合する例

結合の処理の流れ

概ね下記の手順で操作します。

  1. ファイル名の取得

  2. ファイルの結合

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)

ファイルのリストを作るところまでは、前のコードと同じです。

この方法の方が、心なしか処理が早いですね。

公開日

広告