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