電気ウナギ的○○

About Home

Perl で PDF 文書を作成してみた

shinoda (2014年4月25日 17:39)
ちょっと思うところあって、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 用紙の上から表示していくだけなら簡単やねえ。

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

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

電気ウナギ的○○

電気ウナギ的○○

About Back

コメント(0)

電気ウナギ的○○

電気ウナギ的○○

About Back

トラックバック(0)

トラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/2937

電気ウナギ的○○

About This Site

電気ウナギ的○○
岩国在住。広島で働く超零細IT企業社長のいわゆる社長日記。
何か、酒と食い物のことばかり書いているようで・・・お察しのとおり、肥満体です:-)


2011/06/24
iPhone用サイト公開

Create with jQuery, jQTouch.


CLOSE