PerlでPDF自動生成

PDFをperlから動的に作成するPDFJというフリーのソフトウェアを触ってみた。
http://hp1.jonex.ne.jp/~nakajima.yasushi/

UTF8にも対応しているということで、今回はUTF8で作成。もちろんPerlのソースはUTF8で保存してます。

PDFJの良いところは、動的に枠線付きのボックスの高さを変えたり、改ページできたりするところ。

まずは、ソースをダウンロードして、依存するTeX::Hyphenモジュールを入れた後に、インストール

perl -MCPAN -e shell
install TeX::Hyphen

PDFJのZIPを展開したディレクトリに移動後、下記を実行
perl Makefile.pl
make
make install

まずは、スタンドアローンで動くプログラムを作る。実行すると、hoge.pdfが同一ディレクトリに出来るというプログラム。

#!/usr/bin/perl  -w

use utf8;
use strict;

use PDFJ qw[UTF8];


#############################################
my $pdf_version = 1.3;
my $paper_width = 595;
my $paper_height = 842;

#############################################


my $doc = PDFJ::Doc->new($pdf_version, $paper_width, $paper_height);

my $font_mincho = $doc->new_font('Ryumin-Light', 'UniJIS-UCS2-HW-H', 'Times-Roman');

my $page = $doc->new_page;

my $text = Text("TESTテストあああああああああああああああああああああああああああああああああああああああああああああああああああああああ", TStyle(font => $font_mincho, fontsize => 16));

$text->show($page, 72, 523, 'tl');
$doc->print("hoge.pdf");


これを実行すると、同一ディレクトリにPDFが生成される。これをPDFのビューワで見てみると、ちゃんと見れる。ただし、「ああああああああああ」が多すぎてはみだしてしまっている(これは次で解決します)

new_font()の中の第2引数でエンコーディングを指定するのですが、UTF8はUniJIS-UCS2-HW-Hを指定しとかないとうまく動かない。

で、これをCGIにして、アクセスしたらPDFをダウンロード出来るように変更。そしてはみだしてしまった文字もうまく改行されるように変更。

#!/usr/bin/perl  -w

use utf8;
use strict;

use PDFJ qw[UTF8];


#############################################
my $pdf_version = 1.3;
my $paper_width = 595;
my $paper_height = 842;


#############################################


my $doc = PDFJ::Doc->new($pdf_version, $paper_width, $paper_height);

my $font_mincho = $doc->new_font('Ryumin-Light', 'UniJIS-UCS2-HW-H', 'Times-Roman');

my $page = $doc->new_page;

my $text = Text("TESTテストあああああああああああああああああああああああああああああああああああああああああああああああああああああああ", TStyle(font => $font_mincho, fontsize => 16));

my $parag = Paragraph($text, PStyle(size=>200, linefeed => '150%', align => 'e'));

#withboxをsにすると枠線表示
my $block = Block('V', $parag, BStyle(withbox => 's', padding => '5'));

#ページの左から50px, 下から840pxの位置に表示
$block->show($page,50,840);


print "Content-type: application/pdf\n\n";

#標準出力させる場合は - を指定する必要あり
$doc->print("-");

exit;

今回は、テキストをParagraphに入れて、それをブロックに入れてブロックで枠線表示させてます。このように、多段階に積み重ねて、最後にshow()メソッドで指定位置に表示させます。

Paragraphメソッドの中のPStyleでsizeを指定し、横幅を決め、そのサイズで自動的に文字が折り返しになるので、はみだしていた文字が無事表示されました。

最後に、Content-type: application/pdfの後に実際のPDFデータを出力させます。標準出力させる場合は、printメソッドでprint("-")とします。これでcgiにアクセスすればPDFのダウンロードや表示が可能!!