PDFをPython(PyPDF2)で操作する - 複数ページをマージして透かしを入れる

PDFをPython(PyPDF2)で操作する - 複数ページをマージして透かしを入れる
目次

以前に書いた以下の記事では、PyPDF2 を用いて、PDFファイルからテキスト情報を抽出するまでを行うことができました。

今回は PyPDF2 のページをマージする機能を使って、ファイルの中に「すかし」を入れる方法を実現したいと思います。

事前準備

前回同様、 アメリカ大統領からの大統領令のページ からダウンロードしたファイルを使います。

見た目はこんな感じです。全部で3ページほどあります。こちらを executive_order.pdf とします。

executive_order

加えて、今回、「社外秘的なSomething」と印字された別のPDFファイルを準備します。 こちらが「透かし」になるPDFファイルです。こちらを confidential.pdf とします。

confidential

PDFファイルのマージ

PyPDF2 で2つのファイルをマージしましょう。 サンプルコードは以下のようになりました。

 1import PyPDF2
 2
 3FILE_PATH = './files/executive_order.pdf'
 4CONFIDENTIAL_FILE_PATH = './files/confidential.pdf'
 5OUTPUT_FILE_PATH = './files/executive_order_merged.pdf'
 6
 7with open(FILE_PATH, mode='rb') as f, open(CONFIDENTIAL_FILE_PATH, mode='rb') as cf, open(OUTPUT_FILE_PATH, mode='wb') as of:
 8    # マージするConfidential
 9    conf_reader = PyPDF2.PdfFileReader(cf)
10    conf_page = conf_reader.getPage(0)    
11    # マージ対象のファイル
12    reader = PyPDF2.PdfFileReader(f)    
13    writer = PyPDF2.PdfFileWriter()    
14    for page_num in range(0, reader.numPages):
15        obj = reader.getPage(page_num)
16        obj.mergePage(conf_page)
17        
18        writer.addPage(obj)
19    
20    # ファイルへの書き込み
21    writer.write(of)

順を追って、簡単に説明します。 まず、confidential.pdf ファイルから getPage(0) で「社外秘的なSomething」が印字されている最初のページを取得します。 次に、executive_order.pdf ファイルのすべてのページオブジェクトで mergePage 関数を呼び出し、 先程取得した「社外秘的なSomething」ページを結合してわけです。

最後に PdfFileWriter を使って、 executive_order_merged.pdf という別名のファイルで書き込みを行います。

結果を確認する

マージされたPDFはどうなったのでしょうか。結果は以下のようになりました。

executive_order_merged

きちんと透かしが入っていますね。きちんと3ページ全てに透かしが入っていました。 (キャプチャを取得するのがめんどくさかったので、1枚しかキャプチャは取得していません。)

まとめ

今回は PyPDF2 を使ってPDFのページをマージする方法を紹介しました。 ページオブジェクトの mergePage 関数を呼び出すだけなので、非常にお手軽に実現できます。

私も最初は「マージなんて何に使うんだろう?」と思っていましたが、共通のフッターを入れたり、 署名を入れたりと、案外使う場面はありそうですね。