今回の適用内容は 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)









