PDFJ - PerlでPDFを生成する(3)

前回に続き、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のブログ