今回の適用内容は FreeBSD のバージョンよりインストールされている Perl のバージョンに依存するため、他の FreeBSD のバージョンや OS (CentOS, Mac OS 等) でも有用でしょう。
Drive Network では、見積書・請求書等は PDFJ.pm を使用して 100% Pure Perl で作成しています。
当初作成した 2004 年以降、システム系も顧客収容機器もすべて Perl のバージョンを 5.005 から 5.8.9 に変更しました。
PDFJ.pm は 0.72 を使用していましたが、バージョンアップされたリリースではインストールや使用時の違和感が拭えず、継続して 0.72 を使用することとしました。
ところが、Perl 5.8.9 で使用すると以下の様な警告が多発します。
Pseudo-hashes are deprecated at /usr/local/lib/perl5/site_perl/5.8.9/PDFJ.pm line 2839. Pseudo-hashes are deprecated at /usr/local/lib/perl5/site_perl/5.8.9/PDFJ.pm line 2470. Pseudo-hashes are deprecated at /usr/local/lib/perl5/site_perl/5.8.9/PDFJ.pm line 2475. Pseudo-hashes are deprecated at /usr/local/lib/perl5/site_perl/5.8.9/PDFJ.pm line 2481. Pseudo-hashes are deprecated at /usr/local/lib/perl5/site_perl/5.8.9/PDFJ.pm line 3570. Pseudo-hashes are deprecated at /usr/local/lib/perl5/site_perl/5.8.9/PDFJ.pm line 3571. Pseudo-hashes are deprecated at /usr/local/lib/perl5/site_perl/5.8.9/PDFJ.pm line 3572. Pseudo-hashes are deprecated at /usr/local/lib/perl5/site_perl/5.8.9/PDFJ.pm line 3573. Pseudo-hashes are deprecated at /usr/local/lib/perl5/site_perl/5.8.9/PDFJ.pm line 3570. Pseudo-hashes are deprecated at /usr/local/lib/perl5/site_perl/5.8.9/PDFJ.pm line 3571. Pseudo-hashes are deprecated at /usr/local/lib/perl5/site_perl/5.8.9/PDFJ.pm line 3572. Pseudo-hashes are deprecated at /usr/local/lib/perl5/site_perl/5.8.9/PDFJ.pm line 3573.
Pseudo-hashes は Perl 5.10 以降ではエラーとして進まない様です。5.8.9 では警告で収まりますが、1 つの PDF ファイルを作成するだけで数 100 行以上出る場合があります。
PDFJ 0.90 Perl 5.10 向け patch は公開されていますが、PDFJ 0.72 用には公開されていないため、前述の patch を参考に PDFJ 0.72 用 patch を作成しました。
--- PDFJ.pm.0 2011-06-27 17:17:13.000000000 +0900 +++ PDFJ.pm 2011-06-27 17:35:56.000000000 +0900 @@ -2206,13 +2206,6 @@ $self->{hyphened} = 0; } -my %TextLineIndex = ( - Start => 1, - Count => 2, - Shift => 3, - FixedGlues => 4, -); - sub _fold { my($self, $linesize, $align) = @_; my $chunks = $self->chunks; @@ -2307,7 +2300,13 @@ $self->fixsize($start, $count, $fixedglues)) / 2; } } - push @lines, [\%TextLineIndex, $start, $count, $shift, $fixedglues]; + my %hash =( + Start => $start , + Count => $count , + Shift => $shift , + FixedGlues => $fixedglues , + ); + push(@lines,\%hash); $start = $nextpos; } @lines; @@ -2322,7 +2321,7 @@ my($can, $canleft, $pre, $word); if( $string =~ /([A-Za-z]-)([A-Za-z])/ ) { $can = $`.$1; - $canleft = $2.$'; + $canleft = $2.$'; #' } elsif( $string =~ /[A-Za-z]{5,}/ ) { $pre = $`; $word = $&; @@ -3289,28 +3288,30 @@ # chunk array index my %ChunkIndex = ( - Style => 1, # PDFJ::TextStyle object - Mode => 2, # description as above - Class => 3, # description as above - Splittable => 4, # 1 for splittable at pre-postion - Glue => 5, # normal glue width - GlueDec => 6, # decrease adjustable glue width - GlueInc => 7, # increase adjustable glue width - GluePref => 8, # glue preference - Count => 9, # characters count - String => 10, # characters string - PreShift => 11, # postion shift at pre-postion - PostShift => 12, # postion shift at post-postion - GlueFix => 13, # fixed glue (to be calculated) - Hyphened => 14, # 1 for splitted, 2 for hyphened - RubyText => 15, # ruby PDFJ::Text object - AltObj => 16, # alternative object for String + Style => 0, # PDFJ::TextStyle object + Mode => 1, # description as above + Class => 2, # description as above + Splittable => 3, # 1 for splittable at pre-postion + Glue => 4, # normal glue width + GlueDec => 5, # decrease adjustable glue width + GlueInc => 6, # increase adjustable glue width + GluePref => 7, # glue preference + Count => 8, # characters count + String => 9, # characters string + PreShift => 10, # postion shift at pre-postion + PostShift => 11, # postion shift at post-postion + GlueFix => 12, # fixed glue (to be calculated) + Hyphened => 13, # 1 for splitted, 2 for hyphened + RubyText => 14, # ruby PDFJ::Text object + AltObj => 15, # alternative object for String + RubyOverlap => 16, # ruby overlap size ); sub new { my($class, @args) = @_; - unshift @args, \%ChunkIndex; - bless \@args, $class; + my %hash = map { $_ => $args[ $ChunkIndex{ $_ } ] } keys(%ChunkIndex) ; + + bless \%hash, $class; } sub clone {
上記を適用することで警告は収まることは確認しています。
なお、適用の有無に関わらず Perl 5.8.9 では生成される PDF ファイルの内容に md5 の照合でも差がないこともまた確認しています。
# が、PDFJ のすべての動作を確認した訳ではありません。予めご了承ください。
- Migrate 32bit to 64bit (FreeBSD, PostgreSQL)
- Migrate 32bit to 64bit (FreeBSD, GDBM)
- Migrate 32bit to 64bit (FreeBSD, ionCube PHP Loader)
- Migrate to FreeBSD 9.1-RELEASE (ImageMagick 6.4)
- Migrate to FreeBSD 9.1-RELEASE (PostgreSQL)
- Migrate to FreeBSD 9.1-RELEASE (JDK 1.6)
- Migrate to FreeBSD 9.1-RELEASE (idnconv)
- Migrate to FreeBSD 9.1-RELEASE (PDFJ)