前回に続き、PDFJについて。
今回は、PDFへの画像の挿入を行います。
画像の挿入は、以下のように画像オブジェクトで行います。
$imgobj = $docobj->new_image($src, $pxwidth, $pxheight, $width, $height, $padding, $colorspace);
なお、画像オブジェクトの仕様として、
PNG画像の場合は画像のピクセルサイズとカラースペースは画像ファイル自体の内容に従って自動的に設定されるので、$pxwidth、$pxheight、$colorspaceで指定した値は無視される。
とのことなので、JPG画像よりもPNG画像を使った方がベターではないかと思います。
また、今回作成するPDFでは、画像の上に複数のテキストを記載するので、ページオブジェクトのlayerメソッドを使います。
$pageobj->layer($layernum);
レイヤー0が画像、レイヤー1〜nがテキストとすることで、画像の上にテキストを配置していきます。
以下、サンプルコード。
#!/usr/bin/perl use strict; use CGI; use PDFJ 'UTF8'; my $q = new CGI; my $WIDTH = 595; # A4 width(210mm) my $HEIGHT = 842; # A4 height(297mm) my %data = ( 'text0' => {text => 'sample text0', x => 20, y => 822, color => '#ff0000', fontsize => 60, align => 'lt'}, 'text1' => {text => 'sample text1', x => 300, y => 640, color => '#000000', fontsize => 40, align => 'rb'}, 'text2' => {text => 'sample text2', x => 570, y => 640, color => '#000000', fontsize => 40, align => 'rb'}, 'text3' => {text => 'sample text3', x => 300, y => 600, color => '#0000cc', fontsize => 40, align => 'rb'}, 'text4' => {text => 'sample text4', x => 570, y => 600, color => '#0000cc', fontsize => 40, align => 'rb'}, 'text5' => {text => 'sample text5', x => 297, y => 421, color => '#0066ff', fontsize => 60, align => 'cm'}, 'text6' => {text => 'sample text6', x => 300, y => 300, color => '#ff0000', fontsize => 40, align => 'lt'}, 'text7' => {text => 'sample text7', x => 300, y => 300, color => '#00ff00', fontsize => 40, align => 'cm'}, 'text8' => {text => 'sample text8', x => 300, y => 300, color => '#0000ff', fontsize => 40, align => 'rb'}, 'text9' => {text => 'sample text9', x => 297, y => 100, color => '#ff6600', fontsize => 80, align => 'cb'}, ); my $pdf = PDFJ::Doc->new(1.3, $WIDTH, $HEIGHT); my $page = $pdf->new_page(); my $font = $pdf->new_font('GothicBBB-Medium', 'UniJIS-UCS2-HW-H', 'Times-Bold'); # background image my $layerid = 0; $page->layer($layerid); my $img = $pdf->new_image('image.png', $WIDTH, $HEIGHT, $WIDTH, $HEIGHT); $img->show($page, 0, 0, 'lb'); # write text foreach my $key (keys %data) { $layerid++; $page->layer($layerid); my $textStyle = TStyle( font => $font, fontsize => $data{$key}{'fontsize'}, shapestyle => SStyle(fillcolor => $data{$key}{'color'}), ); Text($data{$key}{'text'}, $textStyle)->show($page, $data{$key}{'x'}, $data{$key}{'y'}, $data{$key}{'align'}); } # output PDF print $q->header( -type => 'application/pdf', ); $pdf->print('-'); exit;
PDFJ、とても素晴らしいモジュールですね。
参考:
http://hp1.jonex.ne.jp/~nakajima.yasushi/PDFJ.jp.html
関連記事
PDFJ - PerlでPDFを生成する(1) - yasuakiのブログ
PDFJ - PerlでPDFを生成する(2) - yasuakiのブログ
PDFJ - PerlでPDFを生成する(3) - yasuakiのブログ