はじめに
PerlでPDFJを使ってCGIでPDF(UTF8)を表示させるスクリプトです。
なお、PDFJをPerl5.10で動かすため、patchをあてています。
【追記 2012.12.20】
「CGI.pm」を使ってPDFを出力するように修正。
環境
・Debian squeeze
・Perl 5.10.1
・PDFJ 0.90
・PDFJ 0.90用のPerl 5.10対応patch
・Apache 2.2.16
Perl5.10対応patch
参考文献
動作した組み合わせ
・WindowsXP Pro SP3
・Adobe Acrobat Reader X (10.1.2)
・Internet Explorer 8.0.6001.18702
・WindowsXP Pro SP3
・Adobe Acrobat Reader X (10.1.2)
・Firefox 11 beta
・WindowsXP Pro SP3
・Adobe Acrobat Reader X (10.1.2)
・Firefox 10
・WindowsXP Pro SP3
・Adobe Acrobat Reader X (10.1.2)
・Safari 5.1.1
・WindowsXP Pro SP3
・Adobe Acrobat Reader X (10.1.2)
・Goole Chrome 17.0.963.46
・WindowsXP Pro SP3
・Adobe Acrobat Reader X (10.1.2)
・Opera 11.61
CGIサンプル
サンプルと同じ階層に「lib」ディレクトリを作って、その中にPDFJを入れておく。
「use CGI::Carp qw(carpout fatalsToBrowser);」は不要ならば削除する。
使用しているサーバの仕様が貧弱(Pentium4 3.0GHz)のせいか、日本語フォントを埋め込みにするとPDF生成、ブラウザ表示にかなり時間がかかる。また、PDFのサイズが増大する。
仕方がないので、現在は標準のフォントを使用している。
UTF8のエンコーディングはPDFJのソースを見る限り「UniJIS-UCS2-HW-H」しか対応してなさそう。
実際にこれ以外を指定してもエラーになる。
#!/usr/bin/perl use strict; use warnings; use utf8; use lib './lib'; use PDFJ 'UTF8'; use CGI::Carp qw(carpout fatalsToBrowser); { # 幅と高さはポイントで指定する。 my $font; my $fontsize; my $fontstyle; my $text; my $textstyle; my $page; my $pagestyle; my $para; my $doc; my $obj; my $shapeobj; my $data; my @object = (); my @pagesize = ('595', '842'); # A4(210mm, 297mm) 単位[point] my @margin = ('72', '72', '72', '72'); # 余白(左・右・上・下) my $pageheight = $pagesize[1] - $margin[2] - $margin[3]; my $pagewidth = $pagesize[0] - $margin[0] - $margin[1]; my @posbody = ($margin[0], $pagesize[1] - $margin[3]); my @posheader = ($margin[0], $pagesize[1] - $margin[3] + $margin[2] / 2); my @posfooter = ($margin[0], $margin[3] / 2); my @line = ($margin[0], $pagesize[1] - $margin[3], $pagewidth, 0, ''); my $code = 'UniJIS-UCS2-HW-H'; my $code_e = 'WinAnsiEncoding'; my $gothic; my $mincho; my $gothic_e; my $mincho_e; $gothic = 'GothicBBB-Medium'; $mincho = 'Ryumin-Light'; # $gothic = '/usr/share/fonts/truetype/kochi/kochi-gothic.ttf'; # $mincho = '/usr/share/fonts/truetype/kochi/kochi-mincho.ttf'; # $gothic = '/usr/share/fonts/truetype/sazanami/sazanami-gothic.ttf'; # $mincho = '/usr/share/fonts/truetype/sazanami/sazanami-mincho.ttf'; $gothic_e = 'Helvetica'; $mincho_e = 'Helvetica'; # $mincho_e = 'Courier'; # PDF 1.2(Acrobat3) # PDF 1.3(Acrobat4) # PDF 1.4(Acrobat5) # PDF 1.5(Acrobat6) # PDF 1.6(Acrobat7) $doc = new PDFJ::Doc( 1.3, $pagesize[0], $pagesize[1] ); # Compress::Zlibを使わずにデータの埋め込みを行う $doc->filter('a'); # タイトル $font = $doc->new_font( $gothic, $code, $gothic_e, $code_e ); $fontsize = 24; $textstyle = TStyle( font => $font, fontsize => $fontsize ); $text = Text( "FAX送信", $textstyle ); $pagestyle = PStyle( size => $pagewidth, linefeed => '100%', preskip => 0, postskip => 10, align => 'm' ); push @object, Paragraph( $text, $pagestyle ); # 直線 push @object, Shape()->line( 0, 0, 460, 0, SStyle( linewidth => 2 ) ); # 発信元 $pagestyle = PStyle( size => $pagewidth, linefeed => '100%', preskip => 10, postskip => 4, align => 'b' ); $font = $doc->new_font( $mincho, $code, $gothic_e, $code_e ); $fontsize = 12; $textstyle = TStyle( font => $font, fontsize => $fontsize ); $data = "【ふふふのふ】"; $text = Text( $data, $textstyle ); push @object, Paragraph( $text, $pagestyle ); $pagestyle = PStyle( size => $pagewidth, linefeed => '100%', preskip => 0, postskip => 4, align => 'b' ); $data = "xxxx"; $text = Text( $data, $textstyle ); push @object, Paragraph( $text, $pagestyle ); $data = "xxx 様"; $text = Text( $data, $textstyle ); push @object, Paragraph( $text, $pagestyle ); $data = "TEL xxxx-xx-xxxx"; $text = Text( $data, $textstyle ); push @object, Paragraph( $text, $pagestyle ); $data = "FAX oooo-oo-oooo"; $text = Text( $data, $textstyle ); push @object, Paragraph( $text, $pagestyle ); $data = "【送付先】"; $text = Text( $data, $textstyle ); push @object, Paragraph( $text, $pagestyle ); $pagestyle = PStyle( size => $pagewidth, linefeed => '100%', preskip => 0, postskip => 4, align => 'b' ); $data = "にゃにゃん"; $text = Text( $data, $textstyle ); push @object, Paragraph( $text, $pagestyle ); # 直線 push @object, Shape()->line( 0, 0, 460, 0, SStyle( linewidth => 1 ) ); # 差出人 $pagestyle = PStyle( size => $pagewidth, linefeed => '100%', preskip => 10, postskip => 4, align => 'b' ); $font = $doc->new_font( $mincho, $code, $gothic_e, $code_e ); $fontsize = 12; $textstyle = TStyle( font => $font, fontsize => $fontsize ); $data = "【ほにゃらら】"; $text = Text( $data, $textstyle ); push @object, Paragraph( $text, $pagestyle ); $pagestyle = PStyle( size => $pagewidth, linefeed => '100%', preskip => 0, postskip => 4, align => 'b' ); $data = "○×部署"; $text = Text( $data, $textstyle ); push @object, Paragraph( $text, $pagestyle ); $data = "ななしのたろー"; $text = Text( $data, $textstyle ); push @object, Paragraph( $text, $pagestyle ); $data = "TEL xxxx-xx-xxxx"; $text = Text( $data, $textstyle ); push @object, Paragraph( $text, $pagestyle ); $data = "FAX oooo-oo-oooo"; $text = Text( $data, $textstyle ); push @object, Paragraph( $text, $pagestyle ); # 直線 push @object, Shape()->line( 0, 0, 460, 0, SStyle( linewidth => 2, preskip => 20 ) ); # 挨拶文 $font = $doc->new_font( $mincho, $code, $gothic_e, $code_e ); $fontsize = 12; $textstyle = TStyle( font => $font, fontsize => $fontsize ); # 改行 push @object, Text( NewLine(), $textstyle ); $data = "いつもお世話になっております。"; $text = Text( $data, $textstyle ); @object, Paragraph( $text, $pagestyle ); $data = "PDFJのテストです。"; $text = Text( $data, $textstyle ); push @object, Paragraph( $text, $pagestyle ); $font = $doc->new_font( $mincho, $code, $gothic_e, $code_e ); $fontsize = 12; $textstyle = TStyle( font => $font, fontsize => $fontsize ); $pagestyle = PStyle( size => $pagewidth, linefeed => '100%', postskip => 2, align => 'b' ); # 改行 push @object, Text( NewLine(), $textstyle ); $text = Text( "ほにゃにゃ:" . "猫", $textstyle ); push @object, Paragraph( $text, $pagestyle ); $text = Text( " にゃにゃ:" . "犬", $textstyle ); push @object, Paragraph( $text, $pagestyle ); $text = Text( " にゃ:" . "古荒", $textstyle ); push @object, Paragraph( $text, $pagestyle ); # 改行 push @object, Text( NewLine(), $textstyle ); # 出力 for my $block( Block('V', @object, BStyle() )->break( $pageheight ) ) { # 新規ページ my $page = $doc->new_page; # 本文の表示 $block->show( $page, @posbody ); # ヘッダ $fontsize = 9; $font = $doc->new_font( $gothic, $code, $gothic_e, $code_e ); $textstyle = TStyle( font => $font, fontsize => $fontsize ); $text = Text( scalar(localtime) . "(FAX:" . "xxxx-xx-xxxx)", $textstyle ); $pagestyle = PStyle( size => $pagewidth, linefeed => '100%', align => 'e' ); my $header = Paragraph( $text, $pagestyle ); $header->show( $page, @posheader ); # フッタ $text = Text( "- " . $page->pagenum . " -", $textstyle ); $pagestyle = PStyle( size => $pagewidth, linefeed => '100%', align => 'm' ); my $footer = Paragraph( $text, $pagestyle ); $footer->show($page, @posfooter); } # # use CGI.pm # use CGI; my $q = new CGI; print $q->header( -type => 'application/pdf', ); $doc->print('-'); exit; # # old # # PDF出力・サイズ取得 my $pdfname = "pdf$$.pdf"; my $pdfpath = "./$pdfname"; $doc->print("$pdfpath"); my $pdfsize = -s $pdfpath; # データの表示形式(inline or attachment) my $format = 'inline'; # 標準出力 print <<"EOF"; Content-type: application/pdf Content-Disposition: $format; filename="$pdfname" Content-length: $pdfsize Content-Transfer-Encoding: binary EOF # バイナリモードで開いて出力する open my $fh, '<', $pdfpath || die "can't open $pdfname"; binmode $fh; binmode STDOUT; while ( <$fh> ) { print $_; } close $fh; # PDF削除 # unlink $pdfpath; exit; }
Comments