no-image

PDFファイルをpythonで扱いたい【最終:複数のファイルを結合する】

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

今回はpythonのpdfファイルを扱う内容の最終回になります。これまでやってきたことの内容で、できてしまう人には普通にできてしまうかもしれません。今回の内容は「PDFファイルをpythonで扱いたい【2時間目:結合】」の内容を応用したものになります。

個人的にはループ系のコードはスクリプトの醍醐味だと思っています。この基本の枠組みを作ってしまえばあとはプログラマーの腕(アイデア次第)で便利なコードができあがると思っています。(それが一番難しいわけですが・・・)

ここは最終回ですので基本的な使い方は

あたりをみていただければと思います。

それではコードを見ていきましょう。

import PyPDF2, os
#os.chdir()カレントディレクトは好きなところに設定してくださいね。
pdf_files = []
pdf_writer = PyPDF2.PdfFileWriter()
for filename in os.listdir():
 if filename.endswith('.pdf'):
 pdf_files.append(filename)

#全てのpdf_filesをループで回す
for filename in pdf_files:
 pdf_file_obj = open(filename, 'rb')
 pdf_reader = PyPDF2.PdfFileReader(pdf_file_obj)
 #ページを追加する
 for page_num in range(1, pdf_reader.numPages):
  page_obj = pdf_reader.getPage(page_num)
  pdf_writer.addPage(page_obj)
 
#結合したPDFファイルの保存
pdf_output = open('mixpdf.pdf', 'wb')
pdf_writer.write(pdf_output)
pdf_output.close()

プログラムの解説

  • 4行目はos.listdir()としています。引数に何も指定しなかったらカレントディレクトリをリストにします。filename変数に入れてforループで回します。finenameがendswith(.pdf)フィルのものだけをpdf_files[リストにします]
  • 10行目はpdf_files[]のリストをまた変数に入れて回します。全ての.pdfファイルからPdfFileReaderオブジェクトを生成します。
  • 14行目はforループは2重ループになっている点に注目です。こうすることで、全PdfFileReaderオブジェからページオブジェを生成できます。都度pdf_writerに追加していきます。

若干はしょった感じがありますが、このコードを実行するとフォルダにあるpdfファイルが結合され新たな.pdfファイルが作られます。

余談:Writerオブジェクト生成を忘れると暗号化されてしまう。

暗号化されてしまうときくと、敬遠してしまうかもしれません。言いたいのは4行目でPdfFilwWriterオブジェクトを生成しているのですがこの構文がなくても実はプログラムは動きます。(確認済み)

ただし、暗号化された状態でファイルがつくられます。

この状態でファイルを開くとパスワードを求められます。しかし意図せず作られたファイルのためパスワードなどしるわけがないので開くことができないPDFファイルがつくられます。

とくに気にしなくてもよい話かとは思います。暗号化されていてもファイルは削除することができます。