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

ちょっと思うところあって、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 用紙の上から表示していくだけなら簡単やねえ。

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

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

トラックバック(0)

このブログ記事を参照しているブログ一覧: Perl で PDF 文書を作成してみた

このブログ記事に対するトラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/2937

コメントする

このブログ記事について

このページは、shinodaが2014年4月25日 17:39に書いたブログ記事です。

ひとつ前のブログ記事は「寄り合い処「ささき亭」のおまかせランチ」です。

次のブログ記事は「明昌飯店の麻婆豆腐」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。


月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら