1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
#!/usr/bin/perl
use strict;
use warnings;
our $VERSION = '3.027'; # VERSION
our $LAST_UPDATE = '3.027'; # manually update whenever code is changed
use PDF::Builder::Basic::PDF::File;
use PDF::Builder::Basic::PDF::Utils;
use PDF::Builder;
use Compress::Zlib;
use Scalar::Util qw(blessed);
sub walk_obj {
my ($objs, $spdf, $tpdf, $obj, @keys) = @_;
my $tobj;
if(ref($obj) =~ /Objind$/) {
$obj->realise();
}
return ($objs->{scalar $obj}) if defined $objs->{scalar $obj};
die "object already copied" if $obj->{' copied'};
$tobj=$obj->copy($spdf);
$obj->{' copied'} = 1;
$tpdf->new_obj($tobj) if $obj->is_obj($spdf) && !$tobj->is_obj($tpdf);
$objs->{scalar $obj}=$tobj;
if (ref($obj) =~ /Array$/ ||
(blessed($obj) && $obj->isa('PDF::Builder::Basic::PDF::Array'))) {
$tobj->{' val'}=[];
foreach my $k ($obj->elements()) {
$k->realise if ref($k) =~ /Objind$/;
$tobj->add_elements(walk_obj($objs, $spdf, $tpdf, $k));
}
} elsif (ref($obj) =~ /Dict$/ ||
(blessed($obj) && $obj->isa('PDF::Builder::Basic::PDF::Dict'))) {
@keys = keys(%{$tobj}) if scalar @keys <1;
foreach my $k (@keys) {
next if $k=~/^ /;
next unless defined($obj->{$k});
$tobj->{$k} =walk_obj($objs, $spdf, $tpdf, $obj->{$k});
}
if ($obj->{' stream'}) {
if ($tobj->{Filter} && !$tobj->{DecodeParms}) {
my $f = $tobj->{'Filter'};
$f = PDFArray($f) unless ref($f )=~ /Array/;
if (scalar($f->elements()) == 1) {
my ($t) = $f->elements();
if ($t->val() eq 'FlateDecode') {
$tobj->{' stream'} = uncompress($obj->{' stream'});
delete $tobj->{'Filter'};
$tobj->{'Length'} = PDFNum(length($tobj->{' stream'}));
} else {
$tobj->{' stream'} = $obj->{' stream'};
}
} else {
$tobj->{' stream'} = $obj->{' stream'};
}
$tobj->{' nofilt'} = 1;
} else {
$tobj->{' stream'} = $obj->{' stream'};
}
}
}
delete $tobj->{' streamloc'};
delete $tobj->{' streamsrc'};
return($tobj);
}
if(scalar @ARGV<2) {
print "usage: $0 infile outfile\n";
exit(1);
}
my $spdf = PDF::Builder::Basic::PDF::File->open($ARGV[0]);
my $tpdf = PDF::Builder::Basic::PDF::File->_new();
my $mycache = {};
$tpdf->{'Root'} = walk_obj($mycache, $spdf, $tpdf, $spdf->{'Root'});
$tpdf->{'Info'} = walk_obj($mycache, $spdf, $tpdf, $spdf->{'Info'}) if $spdf->{'Info'};
$tpdf->out_file($ARGV[1]);
|