ちょっと思うところあって、Perl で PDF の出力を行う方法について調べてみた。
Perl 用の PDF 生成モジュールは何種類かあるんだけど、一番有名な PDFlib は有料なので、今回は PDF::API2 モジュールで試してみた。
モジュール内の SYNOPSIS に載ってるソース例を元に、「衡山毛筆フォント」というフリーの毛筆フォントで日本語を出力する CGI を作成してみた。
#!/usr/bin/perluse PDF::API2;# Create a blank PDF filemy $pdf = PDF::API2->new();# Add a blank pagemy $page = $pdf->page();# Set the page size$page->mediabox('A4');# Add an external TTF font to the PDFmy $font = $pdf->ttfont('/usr/local/share/fonts/kouzanmouhitufont.ttf', -encode, "utf-8");# Add some text to the pagemy $str =<<EOS;2014/04/25我が性春に悔いなし!俺は海賊船になる!!EOSmy $text = $page->text();$text->font($font, 30);$text->translate(100, 700);# 改行を含む文字列は、1行ずつ改行処理を入れながら出力foreach my $line(split/\n/, $str){$text->text($line);#行の高さ分改行(下に改行するならマイナス値)$text->cr(-30);}# Save the PDFmy $pdf_file = 'temp/test.pdf';$pdf->saveas($pdf_file);# ブラウザに出力my $pdf_size = -s $pdf_file;open (IN, $pdf_file);my $pdf_data = join '', (<IN>);close(IN);print "Content-type: application/pdf\n";print "Content-Length: $pdf_size\n\n";print $pdf_data;# END
こんな感じ。
一点、文章の途中で改行コードを入れていてもそのまま PDF にセットすると化けるだけなので、改行コードで文章を分割し、1行出力する度に $text->cr で改行してやらないと駄目。
ちょっとハマったのはこれくらいで、あとは何の問題もなくすんなり出力されたので拍子抜けした(笑)
まあ、きれいなレイアウトで文章を配置しようとするとけっこうややこしいコードを書かなくちゃいけないんだろうけど、とりあえず一つの文章を A4 用紙の上から表示していくだけなら簡単やねえ。
ちなみに、こんな簡単な例でも、ちょっと一呼吸おくくらい処理時間がかかる。
複雑な文書だと、数秒はまたないといけないのかもなあ・・・
引き続き、複雑なレイアウトのものを作ってみる。
コメントする