さて、前回pypdf2でpdfを分割処理する方法をみていきました。
pypdf2はpdfの統合・編集などにおいて非常に便利なライブラリです。唯一の問題点はあまり更新が進んでいない点ですが、今の所動作的には大きな問題を抱えてはいないので、利用を中止するほどではないかと思っています。
また、元ネタとなった月5000円の機能にはPDFの分割だけではなく、ハンコ押印自動化機能も含まれていました。
今回はそれも試して行こうと思います。
利用する概念の紹介
いわゆる、DegitalWaterMark/ウォーターマークと呼ばれる、日本語で言うところの透かしですね、機能を活用してハンコの押印をpythonでしていきます。
本来的にはWaterMarkは画像データ等の偽造防止用に使われる機能ですが、暗号化されたデータではなく単純なハンコデータをウォーターマーク処理することにより、ハンコを押したようにPDF上で見えるように処理していきます。
これは、pypdf2に含まれるmergePageメソッドを利用することで実現可能です。
シンプル verのコード
まずは、ウォーターマークの作成に慣れるために、簡単なパターンでコードをみていきます。
from PyPDF2 import PdfFileWriter, PdfFileReader
#input:押印対象ファイル, watermark:スタンプファイル
input = PdfFileReader(open("output/output-1.pdf", "rb"))
watermark = PdfFileReader(open("stampSample.pdf", "rb"))
#押印処理結果を保存するファイル(新規作成)
output = open("output/output-1-adjust.pdf", "wb")
#writerインスタンスを呼び出しておく
writer = PdfFileWriter()
#対象の1ページをinput/watermarkそれぞれで作成
input_firstpage= input.getPage(0)
watermark_firstpage = watermark.getPage(0)
#mergePageで統合する、統合した結果をwirterにaddpageする
input_firstpage.mergePage(watermark_firstpage)
writer.addPage(input_firstpage)
#writerにaddpageしたデータをベースに、output(新規作成ファイル)に書き込み
writer.write(output)
#最後にopenで開いている部分をclose処理する
output.close()
ざっとコード内に説明が入れてありますので、そちらをご確認ください。結果として、元の2ファイルから、どのようなファイルが出来上がるかを下に貼り付けます。
【input:押印対象ファイル output/output-1.pdf】

【watermark:スタンプファイル stampSample.pdf】

【output 押印済み後ファイル】

押印位置の指定など何もしていませんが、pdf2つが統合され1つのページに押印されたように見える結果は実現できました。
一応ハンコが押されたように見えますよね。
ざっとできた、ただこれだと問題点がある
あれっと思った人もいたはずです、スタンピングする場所の指定が全くできていませんねw
今回の事例ではあくまでPDF2つをマージしただけなので、場所の指定が全くできていません。シンプルな以下のような稟議書があったとして、あなたが自動化して押印したい場所は特定のエリアだと思います。以下のようなテンプレだとしたら、下の方にあるboxの中ですよね。

さて、どうする必要があるでしょうか?
pythonに慣れているかたは何となく想像つくかもしれませんが、2つのライブラリを使えば対応可能です。
指定の位置に押印するために必要な準備
さて、2つのライブラリとは何でしょうか?イメージつきますか?
実現するために必要なプロセスを考えてみましょう、それが必要なライブラリをイメージするための最短ルートにもなります。
最終ゴール:指定の位置にスタンプを押す
逆算分解:
・押印対象pdfにスタンプpdfをwaterMarkする(前回記事で紹介)
⬇️
・押印対象の位置にスタンプが押されたPDFを作る(PDFを新規に作る必要がある)
⬇︎
・画像としてスタンプを取り扱い、PDFに挿入する
まぁざっくりイメージすると以上のようになる感じでしょうか。ちょっと言語化が下手くそですみません。
ようは、PDFを自由に作ることと、画像を取り扱うことの2点が必要になります。この2つを実現するために必要なライブラリは?
PDFを自由に作成する→ reportLab
画像を取り扱う→ PIL
の2つがメジャーで使いやすいと思います。
今回は今段階でスクリプトを作成していないので、紹介できませんが、ちょっと時間ができたら実際に全て作ってみようかと思っています。
まとめ
色々なRPAツールが市場に出回っていますが、実は簡単なpython知識があれば類似機能を実装することもできますよ、という紹介の第2弾でした。
何もかも自分で実装するのが正しいとは個人的には思っていませんが、実装工数とrunningコストを比較して実は自分で簡単にできてしまう機能であれば、作ってみることを検討するのも1つの手段だと思います。
実際サービスとしてリリースされているものはより深くユースケースを検証しているでしょうから、実は自分で作ると痒いところに最初は手が届かないこともままあります。他方で、自分で実装しないと痒いところに手が届かないケースもままあります。
色々なツールは使ってみてよりよくできる方法が自分で考えられるなら、自前実装も一つの手段だと頭の片隅に入れておいていただければと思います。