1#!/usr/local/bin/perl 2#======================================================================= 3# ____ ____ _____ _ ____ ___ ____ 4# | _ \| _ \| ___| _ _ / \ | _ \_ _| |___ \ 5# | |_) | | | | |_ (_) (_) / _ \ | |_) | | __) | 6# | __/| |_| | _| _ _ / ___ \| __/| | / __/ 7# |_| |____/|_| (_) (_) /_/ \_\_| |___| |_____| 8# 9# A Perl Module Chain to faciliate the Creation and Modification 10# of High-Quality "Portable Document Format (PDF)" Files. 11# 12# Copyright 1999-2004 Alfred Reibenschuh <areibens@cpan.org>. 13# 14#======================================================================= 15# 16# PERMISSION TO USE, COPY, MODIFY, AND DISTRIBUTE THIS FILE FOR 17# ANY PURPOSE WITH OR WITHOUT FEE IS HEREBY GRANTED, PROVIDED THAT 18# THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE APPEAR IN ALL 19# COPIES. 20# 21# THIS FILE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 22# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 23# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24# IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR 25# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 28# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 29# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 31# OF THE USE OF THIS FILE, EVEN IF ADVISED OF THE POSSIBILITY OF 32# SUCH DAMAGE. 33# 34# $Id: pdf-optimize.pl,v 2.0 2005/11/16 02:16:00 areibens Exp $ 35# 36#======================================================================= 37 38use PDF::API3::Compat::API2::Basic::PDF::File; 39use PDF::API3::Compat::API2::Basic::PDF::Utils; 40use PDF::API3::Compat::API2; 41 42 43sub walk_obj { 44 my ($objs,$spdf,$tpdf,$obj,@keys)=@_; 45 46 my $tobj; 47 48 if(ref($obj)=~/Objind$/) { 49 $obj->realise; 50 } 51 52 return($objs->{scalar $obj}) if(defined $objs->{scalar $obj}); 53 54 die "object already copied" if($obj->{' copied'}); 55 56 $tobj=$obj->copy($spdf); 57 $obj->{' copied'}=1; 58 $tpdf->new_obj($tobj) if($obj->is_obj($spdf) && !$tobj->is_obj($tpdf)); 59 60 $objs->{scalar $obj}=$tobj; 61 62 if(ref($obj)=~/Array$/ || (UNIVERSAL::can($obj,'isa') && $obj->isa('PDF::API3::Compat::API2::Basic::PDF::Array'))) { 63 $tobj->{' val'}=[]; 64 foreach my $k ($obj->elementsof) { 65 $k->realise if(ref($k)=~/Objind$/); 66 $tobj->add_elements(walk_obj($objs,$spdf,$tpdf,$k)); 67 } 68 } elsif(ref($obj)=~/Dict$/ || (UNIVERSAL::can($obj,'isa') && $obj->isa('PDF::API3::Compat::API2::Basic::PDF::Dict'))) { 69 @keys=keys(%{$tobj}) if(scalar @keys <1); 70 foreach my $k (@keys) { 71 next if($k=~/^ /); 72 next unless(defined($obj->{$k})); 73 $tobj->{$k}=walk_obj($objs,$spdf,$tpdf,$obj->{$k}); 74 } 75 if($obj->{' stream'}) { 76 if($tobj->{Filter}) { 77 $tobj->{' nofilt'}=1; 78 } else { 79 delete $tobj->{' nofilt'}; 80 $tobj->{Filter}=PDFArray(PDFName('FlateDecode')); 81 } 82 $tobj->{' stream'}=$obj->{' stream'}; 83 } 84 } else { 85 $obj->realise; 86 return(walk_obj($objs,$spdf,$tpdf,$obj)); 87 } 88 delete $tobj->{' streamloc'}; 89 delete $tobj->{' streamsrc'}; 90 return($tobj); 91} 92 93if(scalar @ARGV<2) { 94 print "usage: $0 infile outfile\n"; 95 exit(1); 96} 97$spdf=PDF::API3::Compat::API2::Basic::PDF::File->open($ARGV[0]); 98$tpdf=PDF::API3::Compat::API2::Basic::PDF::File->_new; 99$mycache={}; 100$tpdf->{Root}=walk_obj($mycache,$spdf,$tpdf,$spdf->{Root}); 101$tpdf->{Info}=walk_obj($mycache,$spdf,$tpdf,$spdf->{Info}); 102 103$tpdf->out_file($ARGV[1]); 104 105 106__END__ 107 108=head1 AUTHOR 109 110alfred reibenschuh 111 112=head1 HISTORY 113 114 $Log: pdf-optimize.pl,v $ 115 Revision 2.0 2005/11/16 02:16:00 areibens 116 revision workaround for SF cvs import not to screw up CPAN 117 118 Revision 1.2 2005/11/16 01:27:47 areibens 119 genesis2 120 121 Revision 1.1 2005/11/16 01:19:24 areibens 122 genesis 123 124 Revision 1.2 2004/01/28 14:12:09 fredo 125 updated licence statement 126 127 Revision 1.1 2004/01/19 19:59:49 fredo 128 initial import 129 130 131=cut 132