CAM-PDF
view release on metacpan or search on metacpan
lib/CAM/PDF.pm view on Meta::CPAN
return $save ? $changed : $streamdata;
}
my $dict = $objnode->{value};
$streamdata = $dict->{StreamData}->{value};
#warn 'decoding thing ' . ($dict->{StreamData}->{objnum} || '(unknown)') . "\n";
# Don't work on {F} since that's too common a word
#my $filtobj = $dict->{Filter} || $dict->{F};
my $filtobj = $dict->{Filter};
if (defined $filtobj)
{
my @filters = $filtobj->{type} eq 'array' ? @{$filtobj->{value}} : ($filtobj);
my $parmobj = $dict->{DecodeParms} || $dict->{DP};
my @parms;
if ($parmobj)
{
@parms = $parmobj->{type} eq 'array' ? @{$parmobj->{value}} : ($parmobj);
}
for my $filter (@filters)
{
if ($filter->{type} ne 'label')
{
warn "All filter names must be labels\n";
require Data::Dumper;
warn Data::Dumper->Dump([$filter], ['Filter']);
next;
}
my $filtername = $filter->{value};
# Make sure this is not an encrypt dict
next if ($filtername eq 'Standard');
my $filt;
eval {
require Text::PDF::Filter;
my $pkg = 'Text::PDF::' . ($filterabbrevs{$filtername} || $filtername);
$filt = $pkg->new;
1;
};
if (!$filt)
{
warn "Failed to open filter $filtername (Text::PDF::$filtername)\n";
last;
}
my $oldlength = length $streamdata;
{
# Hack to turn off warnings in Filter library
no warnings; ## no critic(TestingAndDebugging::ProhibitNoWarnings)
$streamdata = $filt->infilt($streamdata, 1);
}
$self->fixDecode(\$streamdata, $filtername, shift @parms);
my $length = length $streamdata;
#warn "decoded length: $oldlength -> $length\n";
if ($save)
{
my $objnum = $dict->{StreamData}->{objnum};
my $gennum = $dict->{StreamData}->{gennum};
if ($objnum)
{
$self->{changes}->{$objnum} = 1;
}
$changed = 1;
$dict->{StreamData}->{value} = $streamdata;
if ($length != $oldlength)
{
$dict->{Length} = CAM::PDF::Node->new('number', $length, $objnum, $gennum);
delete $dict->{L};
}
# These changes should happen later, but I prefer to do it
# redundantly near the changes hash
delete $dict->{Filter};
delete $dict->{F};
delete $dict->{DecodeParms};
delete $dict->{DP};
}
}
}
#else { use Data::Dumper; print Dumper($dict); }
return $save ? $changed : $streamdata;
}
=item $doc->fixDecode($streamdata, $filter, $params)
This is a utility method to do any tweaking after removing the filter
from a data stream.
=cut
sub fixDecode
{
my $self = shift;
my $streamdata = shift;
my $filter = shift;
my $parms = shift;
if (!$parms)
{
return;
}
my $d = $self->getValue($parms);
if (!$d || (ref $d) ne 'HASH')
{
die "DecodeParms must be a dictionary.\n";
}
if ($filter eq 'FlateDecode' || $filter eq 'Fl' ||
$filter eq 'LZWDecode' || $filter eq 'LZW')
{
my $p = exists $d->{Predictor} ? $self->getValue($d->{Predictor}) : 1;
if ($p == 2)
{
( run in 0.983 second using v1.01-cache-2.11-cpan-2398b32b56e )