Perl で PDF 文書を作成してみた[Perl]
(2014-04-25 17:39:46) by shinoda


ちょっと思うところあって、Perl で PDF の出力を行う方法について調べてみた。

Perl 用の PDF 生成モジュールは何種類かあるんだけど、一番有名な PDFlib は有料なので、今回は PDF::API2 モジュールで試してみた。

モジュール内の SYNOPSIS に載ってるソース例を元に、「衡山毛筆フォント」というフリーの毛筆フォントで日本語を出力する CGI を作成してみた。

#!/usr/bin/perl

use PDF::API2;

# Create a blank PDF file
my $pdf = PDF::API2->new();

# Add a blank page
my $page = $pdf->page();

# Set the page size
$page->mediabox('A4');

# Add an external TTF font to the PDF
my $font = $pdf->ttfont('/usr/local/share/fonts/kouzanmouhitufont.ttf', -encode, "utf-8");

# Add some text to the page
my $str =<<EOS;
2014/04/25
我が性春に悔いなし!
俺は海賊船になる!!
EOS

my $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 PDF
my $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 で改行してやらないと駄目。
ちょっとハマったのはこれくらいで、あとは何の問題もなくすんなり出力されたので拍子抜けした(笑)

<画像:20140425_pdf.jpg>

まあ、きれいなレイアウトで文章を配置しようとするとけっこうややこしいコードを書かなくちゃいけないんだろうけど、とりあえず一つの文章を A4 用紙の上から表示していくだけなら簡単やねえ。

ちなみに、こんな簡単な例でも、ちょっと一呼吸おくくらい処理時間がかかる。
複雑な文書だと、数秒はまたないといけないのかもなあ・・・

引き続き、複雑なレイアウトのものを作ってみる。

コメント投稿
次の記事へ >
< 前の記事へ
TOPへ戻る

Powered by
MT4i 3.0.8