All Your Bugs Are Belong To Ass

Vector::QRCode::IntoPDFというモジュールを作った

PDFにベクター形式でQRCodeを貼り付けるようなことをしたかったんですけど、なんかPHPにはsvgで出力できる物があるらしく(uzullaさんに教えていただきました。ありがとうございます)、Perlでそういうことする物もないわけではなかったんですね。

でもMoose依存いやだし、そもそもPostScriptは中間処理につかうような物なので、もうそのままベタッとQRコードを貼り付ける感じのイメージにそぐわないし、ほかにももう少し調べてみたんですけど、「結局それラスタライズされるじゃん?」っていうのばかりだったので、とりあえず自分で実装してみました。

使い方はSYNOPSISのまんまなんで割愛するとして、内部でどういうことをしてるかザックリ説明していきたいとおもいます。

1. Text::QRCodeでQRCodeのデータを用意する

Text::QRCodeというグッジョブなモジュールが世の中には既にあって、これを使うと二次元の配列リファレンスとしてQRCodeの符号化データが手に入ります。

2. PostScript::Simpleを使って、EPS形式でQRCodeを出力する

ここが案外思いつかなかったところなんですけど、PostScript::Simpleというモジュールを使うと、EPS形式で任意の図形をファイルに出力できるんですね。EPS形式っていうのは要するにベクターを表現するテキストデータなので、これで任意の図形(つまりQRCode)を形成してやると良いのだろうなーと考え、利用しました。

具体的には、PostScript::Simpleのboxメソッドをバカスカぶっ叩き、小さな塗りつぶし四角形を並べてQRCodeを形成してる具合です。非常に泥臭い方法ですね。

3. できたEPSデータをPostScript::Convertに食わせて、QRコードだけが入ってるPDFファイルを出力する

PostScript::Convertってのをつかうと、わりと簡単にEPSデータからPDFを出力できるんで、遠慮なく使いました。便利です。

4. QRコードを貼り付ける先のPDFファイルをPDF::API2で読み込む

PDF::API2という、PerlでPDFを扱うときの鉄板(だとおもう)モジュールがあるので、これをつかって、貼り付け先となるPDFファイルを読み込んでおきます。

5. 3でできたPDFファイルもPDF::API2で読み込む

貼り付けたいQRコードの入ったPDFファイルもPDF::API2で読み込んでおきます。

6. ページと座標を指定して、QRコードを貼り付ける

PDF::API2のimportPageIntoFormとか, PDF::API2::Pageのgfxメソッドとかを駆使して、なんかうまいことQRコードを貼り付けることに成功しました。

正直ここんとこの説明はだいぶ面倒なので、この辺(44~47行目)を見ると良さそうかもしれません(雑ですいません)。

実はVector::QRCode::EPSというものを作っていた

今回のモジュールを作るために、Vector::QRCode::EPSというモジュールを直前にリリースしておりました。

こいつは上述の手順のうち、1~2を担当してくれています。Vector::QRCode::IntoPDFは3~6までを担当しており、一応分業しているというかんじです。

というわけで、使う機会があれば使ってみてください。それで気にくわない箇所とかありましたら、githubにp-rなりissueなり送ってくれるとうれしいです。

Created at
by
ytnobody
Last modified at
2014-02-28 18:50
by
ytnobody