File: pdf-optimize.pl

package info (click to toggle)
libpdf-builder-perl 3.027-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 23,992 kB
  • sloc: perl: 107,532; makefile: 10
file content (77 lines) | stat: -rw-r--r-- 2,273 bytes parent folder | download
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]);