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
|
#!/usr/local/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 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->{' nofilt'} = 1;
} else {
delete $tobj->{' nofilt'};
$tobj->{'Filter'} = PDFArray(PDFName('FlateDecode'));
}
$tobj->{' stream'} = $obj->{' stream'};
}
} else {
$obj->realise();
return walk_obj($objs, $spdf, $tpdf, $obj);
}
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]);
|