この記事は、PythonでPDFを扱うシリーズの2回目です。
- ページの読み込みと分割
- 画像と透かしを追加する (あなたはここにいます)
- ページの挿入、削除、並べ替え
今日、Portable Document Format (PDF) のない世界は考えられないように思われます。
PDFは、これまでで最も一般的に使用されているデータフォーマットの1つとなっています。
PDF バージョン 1.4 までは、PDF 文書をそれなりの PDF ビューアで表示することができました。
残念ながら、フォームのような新しいPDFリビジョンからの機能は、実装が厄介で、ツールで完全に機能させるためには、まださらなる作業が必要です。
Pythonの様々なライブラリを使用すれば、非常に簡単に独自のアプリケーションを作成することができます。
この記事は、Pythonを使ったPDFに関する小さなシリーズのパート2です。
パート1では、すでにPythonを使用してPDF文書を読むための入門を提供し、様々なPythonライブラリの要約から始まりました。
その後に、既存のPDFを操作する方法と、テキストと画像の両方を読み込んで抽出する方法を紹介しました。
さらに、ドキュメントを1ページに分割する方法も紹介しました。
この記事では、透かし、スタンプ、バーコードの形でPDFに画像を追加する方法について説明します。
例えば、特定の読者だけに読まれることを意図している文書にスタンプやマークを付けたり、ドラフト品質を持っていたり、識別目的のために単にバーコードを追加したりするために、これは非常に便利です。
pdftkによるコマンドラインでの電子透かしの追加
Unix/Linuxのコマンドラインで既存のPDFに透かしを追加するには、pdftkを使用することができます。
この名前は「PDF Toolkit」の略で、「PDF文書で日常的なことをするためのシンプルなツール」だと説明されています。
pdftk`はJavaに移植され、Debian GNU/Linux用のパッケージとして提供されています。
これを動作させるためには、透明なレイヤーに “DRAFT” という文字が入った背景画像を用意する必要があり、それを既存の単一ページのPDFに以下のように適用します。
$ pdftk input.pdf background background.pdf output output.pdf
pdftkツールは、PDFファイル
input.pdfを取り込んで
background.pdfと結合し、その結果をファイル
output.pdf` に出力します。
図1は、このアクションの出力を示しています。
より複雑なアクション、例えばドキュメントにページごとに異なるスタンプを押すなどについては、PDF Labsのプロジェクトページで説明されているものをご覧ください。
この記事でもスタンプのユースケースを紹介していますが、この例では pdftk
の代わりに pdfrw
ライブラリを使用しています。
PyPDF2による電子透かしの追加
PyPDFライブラリは、透かしやスタンプとして使用する別のPDFを受け入れる mergepage()
というメソッドを提供しています。
以下の例では、まず元のPDFドキュメントの最初のページと透かしを読み込みます。
ファイルを読み込むために、 PdfFileReader()
クラスを使用しています。
第二段階として、mergepage()
メソッドを用いて2つのページをマージします。
最後に、出力を出力ファイルに書き込みます。
これは、PdfFileWriter()
クラスに基づいてオブジェクトを作成し、 addPage()
メソッドを用いてマージしたページをこのオブジェクトに追加し、 write()
メソッドを用いて新しいコンテンツを出力ページに書き込むという 3 つのステップで行われます。
# !/usr/bin/python
# Adding a watermark to a single-page PDF
import PyPDF2
input_file = "example.pdf"
output_file = "example-drafted.pdf"
watermark_file = "draft.pdf"
with open(input_file, "rb") as filehandle_input:
# read content of the original file
pdf = PyPDF2.PdfFileReader(filehandle_input)
with open(watermark_file, "rb") as filehandle_watermark:
# read content of the watermark
watermark = PyPDF2.PdfFileReader(filehandle_watermark)
# get first page of the original PDF
first_page = pdf.getPage(0)
# get first page of the watermark PDF
first_page_watermark = watermark.getPage(0)
# merge the two pages
first_page.mergePage(first_page_watermark)
# create a pdf writer object for the output file
pdf_writer = PyPDF2.PdfFileWriter()
# add page
pdf_writer.addPage(first_page)
with open(output_file, "wb") as filehandle_output:
# write the watermarked file to the new file
pdf_writer.write(filehandle_output)
PyMuPDFで画像を追加する
PyMuPDFは、軽量のPDFとXPSビューアであるMuPDFのPythonバインディングです。
Pythonスクリプトでインポートする必要があるモジュールの名前は fitz
で、この名前は以前のPyMuPDFの名前に遡ります。
このセクションでは、バーコードを例にして画像を追加する方法を紹介します。
これはかなり一般的なタスクだからです。
しかし、同じ手順は、PDFにあらゆる種類の画像を追加する場合にも適用できます。
PDF文書をバーコードで装飾するには、単に画像を別のPDFレイヤーとして希望する位置に追加します。
画像フォーマットについては、PyMuPDFはPNGとJPEGを受け付けますが、SVGは受け付けません。
画像の位置は fitz.Rect()
というメソッドを用いて矩形として定義します。
このメソッドには2組の座標 – (x1,y1) と (x2,y2) – が必要です。
PyMuPDFは、ページの左上隅を(0,0)として解釈します。
入力ファイルを開き、そこから最初のページを取り出したら、 insertImage()
メソッドを使ってバーコードの入った画像を追加します。
このメソッドには、2つのパラメータが必要です。
imageRectangle
によって指定された位置と、挿入される画像ファイルの名前です。
save()` メソッドを使用すると、変更されたPDFがディスクに保存されます。
図2は、サンプルのPDFに追加された後のバーコードです。
# !/usr/bin/python
import fitz
input_file = "example.pdf"
output_file = "example-with-barcode.pdf"
barcode_file = "barcode.png"
# define the position (upper-right corner)
image_rectangle = fitz.Rect(450,20,550,120)
# retrieve the first page of the PDF
file_handle = fitz.open(input_file)
first_page = file_handle[0]
# add the image
first_page.insertImage(image_rectangle, fileName=barcode_file)
file_handle.save(output_file)
pdfrwによるスタンプの追加
pdfrw は、PDF 文書を読み書きするための Python ベースの純粋な PDF パーサーです。
ラスタライズすることなく、ベクターフォーマットを忠実に再現します。
Debian GNU/Linuxでは、パッケージリポジトリにPython 2と3の両方のリリースが含まれています。
次の例では、複数のページを含む既存のPDFにバーコードや透かしを追加する方法を紹介します。
pdfrwパッケージから、
PdfReader,
PdfWriter,
PageMergeという3つのクラスをインポートすれば十分です。
次に、PDFと透かしの両方のコンテンツにアクセスするために、それに応じたリーダとライタのオブジェクトを作成します。
元の文書の各ページについて、PageMergeオブジェクトの作成を続けます。
このオブジェクトに透かしを追加し、render()` メソッドを使用してレンダリングします。
最後に、修正したページを出力ファイルに書き込みます。
図 3 は、追加を可能にしたコードの隣に、変更されたドキュメントを示したものです。
# !/usr/bin/python
# Adding a watermark to a multi-page PDF
from pdfrw import PdfReader, PdfWriter, PageMerge
input_file = "example.pdf"
output_file = "example-drafted.pdf"
watermark_file = "barcode.pdf"
# define the reader and writer objects
reader_input = PdfReader(input_file)
writer_output = PdfWriter()
watermark_input = PdfReader(watermark_file)
watermark = watermark_input.pages[0]
# go through the pages one after the next
for current_page in range(len(reader_input.pages)):
merger = PageMerge(reader_input.pages[current_page])
merger.add(watermark).render()
# write the modified content to disk
writer_output.write(output_file, reader_input)
結論
PDFファイルに画像、透かし、スタンプを追加するのは非常に簡単です。
数行のコードで、この複雑に聞こえるタスクが数分で解決されます。
どのライブラリを選んでも、非常にうまく動作します。
このシリーズの第3部では、PDFの作成に特化し、1ページの削除と新しい文書への再合体も取り上げます。