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.025'; # VERSION
our $LAST_UPDATE = '3.016'; # 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]);
|