CAM-PDF
view release on metacpan or search on metacpan
lib/CAM/PDF.pm view on Meta::CPAN
package CAM::PDF;
use 5.006;
use warnings;
use strict;
use Carp qw(croak cluck);
use English qw(-no_match_vars);
use CAM::PDF::Node;
use CAM::PDF::Decrypt;
our $VERSION = '1.60';
## no critic(Bangs::ProhibitCommentedOutCode)
## no critic(ControlStructures::ProhibitDeepNests)
=for stopwords eval'ed CR-NL PDFLib defiltered prefill indices inline de-embedding 4th linearized viewable decrypted
=head1 NAME
CAM::PDF - PDF manipulation library
=head1 LICENSE
Copyright 2002-2006 Clotho Advanced Media, Inc., L<http://www.clotho.com/>
Copyright 2007-2008 Chris Dolan
This library is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=head1 SYNOPSIS
use CAM::PDF;
my $pdf = CAM::PDF->new('test1.pdf');
my $page1 = $pdf->getPageContent(1);
[ ... mess with page ... ]
$pdf->setPageContent(1, $page1);
[ ... create some new content ... ]
$pdf->appendPageContent(1, $newcontent);
my $anotherpdf = CAM::PDF->new('test2.pdf');
$pdf->appendPDF($anotherpdf);
my @prefs = $pdf->getPrefs();
$prefs[$CAM::PDF::PREF_OPASS] = 'mypassword';
$prefs[$CAM::PDF::PREF_UPASS] = 'mypassword';
$pdf->setPrefs(@prefs);
$pdf->cleanoutput('out1.pdf');
print $pdf->toPDF();
Many example programs are included in this distribution to do useful
tasks. See the C<bin> subdirectory.
=head1 DESCRIPTION
This package reads and writes any document that conforms to the PDF
specification generously provided by Adobe at
L<http://partners.adobe.com/public/developer/pdf/index_reference.html>
(link last checked Oct 2005).
The file format through PDF 1.5 is well-supported, with the exception
of the "linearized" or "optimized" output format, which this module
can read but not write. Many specific aspects of the document model
are not manipulable with this package (like fonts), but if the input
document is correctly written, then this module will preserve the
model integrity.
The PDF writing feature saves as PDF 1.4-compatible. That means that
we cannot write compressed object streams. The consequence is that
reading and then writing a PDF 1.5+ document may enlarge the resulting
file by a fair margin.
This library grants you some power over the PDF security model. Note
that applications editing PDF documents via this library MUST respect
the security preferences of the document. Any violation of this
respect is contrary to Adobe's intellectual property position, as
stated in the reference manual at the above URL.
Technical detail regarding corrupt PDFs: This library adheres strictly
to the PDF specification. Adobe's Acrobat Reader is more lenient,
allowing some corrupted PDFs to be viewable. Therefore, it is
possible that some PDFs may be readable by Acrobat that are illegible
to this library. In particular, files which have had line endings
converted to or from DOS/Windows style (i.e. CR-NL) may be rendered
unusable even though Acrobat does not complain. Future library
versions may relax the parser, but not yet.
=cut
our $PREF_OPASS = 0;
our $PREF_UPASS = 1;
our $PREF_PRINT = 2;
our $PREF_MODIFY = 3;
our $PREF_COPY = 4;
our $PREF_ADD = 5;
our $MAX_STRING = 65; # length of output string
my %filterabbrevs = (
AHx => 'ASCIIHexDecode',
A85 => 'ASCII85Decode',
CCF => 'CCITTFaxDecode',
DCT => 'DCTDecode',
Fl => 'FlateDecode',
LZW => 'LZWDecode',
RL => 'RunLengthDecode',
lib/CAM/PDF.pm view on Meta::CPAN
my $fonts = $self->getValue($olddr->{$key});
for my $font (keys %{$fonts})
{
$dr->{$key}->{$font} = $self->copyObject($fonts->{$font});
}
}
else
{
warn "Unknown resource key '$key' in form field dictionary";
}
}
else
{
$dr->{$key} = $self->copyObject($olddr->{$key});
}
}
}
# Some properties are simple: inherit means override
for my $prop (qw(Q DA Ff V FT))
{
if ($olddict->{$prop})
{
$dict->{$prop} = $self->copyObject($olddict->{$prop});
}
}
return $dict;
}
################################################################################
=back
=head2 Data/Object Manipulation
=over
=item $doc->setPrefs($ownerpass, $userpass, $print?, $modify?, $copy?, $add?)
Alter the document's security information. Note that modifying these
parameters must be done respecting the intellectual property of the
original document. See Adobe's statement in the introduction of the
reference manual.
B<Important Note:> Most PDF readers (Acrobat, Preview.app) only offer
one password field for opening documents. So, if the C<$ownerpass>
and C<$userpass> are different, those applications cannot read the
documents. (Perhaps this is a bug in CAM::PDF?)
Note: any omitted booleans default to false. So, these two are
equivalent:
$doc->setPrefs('password', 'password');
$doc->setPrefs('password', 'password', 0, 0, 0, 0);
=cut
sub setPrefs
{
my ($self, @prefs) = @_;
my $p = $self->{crypt}->encode_permissions(@prefs[2..5]);
$self->{crypt}->set_passwords($self, @prefs[0..1], $p);
return;
}
=item $doc->setName($object, $name)
I<For INTERNAL use>
Change the name of a PDF object structure.
=cut
sub setName
{
my $self = shift;
my $objnode = shift;
my $name = shift;
if ($name && $objnode->{value}->{type} eq 'dictionary')
{
$objnode->{value}->{value}->{Name} = CAM::PDF::Node->new('label', $name, $objnode->{objnum}, $objnode->{gennum});
if ($objnode->{objnum})
{
$self->{changes}->{$objnode->{objnum}} = 1;
}
return $self;
}
return;
}
=item $doc->removeName($object)
I<For INTERNAL use>
Delete the name of a PDF object structure.
=cut
sub removeName
{
my $self = shift;
my $objnode = shift;
if ($objnode->{value}->{type} eq 'dictionary' && exists $objnode->{value}->{value}->{Name})
{
delete $objnode->{value}->{value}->{Name};
if ($objnode->{objnum})
{
$self->{changes}->{$objnode->{objnum}} = 1;
}
return $self;
}
return;
}
=item $doc->pageAddName($pagenum, $name, $objectnum)
I<For INTERNAL use>
Append a named object to the metadata for a given page.
( run in 0.584 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )