end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

固定書式なら、perlによるPDF生成はPDF::API2がいいかも

http://search.cpan.org/dist/PDF-API2/

PDFファイルを生成する必要があったので、cpanを眺めていたら、PDF::API2というモジュールがありました。

これまでPDFファイルの自動生成というと、pdfjやpdflibの名前を聞いたことがありますが、PDF::API2でも十分に使えるように思えます。

今回は、予めprimoPDFで作成(印刷?)した帳票上(というより背景として?)に、文字や写真を追加してみました。

#!/usr/local/bin/perl
use strict;
use warnings;
use encoding qw/cp932/;	#cp932以外では機種依存文字がpdfに出力されない?
use PDF::API2;
use PDF::API2::Resource::CIDFont::CJKFont;

main();

sub main {
    my $pdf = PDF::API2->open("org.pdf");	#今回はA4横
    my $page = $pdf->openpage();
    #PDF::API2::Resource::CIDFont::CJKFont参照
    my $fnt = $pdf->cjkfont('KozMin');
    my $out_text =
	join("\n",
	     "PDF::API2でpdf自動生成テスト。",
	     "cp932なら機種依存文字:���も出力。",
	     '$txt->textlabel()では、改行コードが空白に');

    #### テキスト1行(textlabel)?の表示 PDF::API2::Content参照
    my $txt_label = $page->text;
    $txt_label->textlabel(400,700,	#API表示位置=用紙位置mm*2.83?
			  $fnt,10,
			  $out_text,	#改行は空白に変換?
			  -rotate => 90,#A4横の場合,なぜか縦書になる為
			  -align => 'right');	#何となく右寄せ

    #### 長文(section)?の表示 PDF::API2::Content参照
    my $txt_sec = $page->text;
    $txt_sec->font($fnt,20);
    $txt_sec->transform(-translate => [300,300],
			-rotate    => 90); #A4横の場合,なぜか縦書になる為
    $txt_sec->lead(20);			#行間?
    $txt_sec->section($out_text,
		      100,100);	#width*height

    #### 画像(jpeg)?の表示 PDF::API2::Content参照
    my $gfx = $page->gfx;
    $gfx->transform(-translate => [300,100],
		    -rotate    => 90); #A4横の場合,なぜか縦書になる為
    my $img = $pdf->image_jpeg("sample.jpg");
    $gfx->image($img,0,0,50,100);

    $pdf->saveas("new.pdf");
}

さすがにTemplate::Toolkit等とは使用方法は異なりますが、機種依存文字も出力されるので、PDF::API2っていいかも