PDF-Builder
view release on metacpan or search on metacpan
lib/PDF/Builder.pm view on Meta::CPAN
This has been split out from C<preferences()> for compatibility with PDF::API2.
It also can both set (assign) and get (query) the settings used.
=back
=cut
sub viewer_preferences {
my $self = shift();
require PDF::Builder::ViewerPreferences;
my $prefs = PDF::Builder::ViewerPreferences->new($self);
unless (@_) {
return $prefs->get_preferences();
}
return $prefs->set_preferences(@_);
}
=head2 preferences
$pdf->preferences(%opts)
=over
Controls viewing preferences for the PDF, including the B<Page Mode>,
B<Page Layout>, B<Viewer>, and B<Initial Page> Options. See
lib/PDF/Builder/ViewerPreferences.pm view on Meta::CPAN
Returns a hash containing all of the viewer preferences that are defined in the
PDF.
=back
=cut
sub get_preferences {
my $self = shift();
my $prefs = $self->{'pdf'}->{'catalog'}->{'ViewerPreferences'};
return unless $prefs;
$prefs->realise();
my %values;
foreach my $pref (@booleans) {
next unless $prefs->{$pref};
$values{_snake_case($pref)} = $prefs->{$pref}->val() eq 'true' ? 1 : 0;
}
foreach my $pref (@names) {
next unless $prefs->{$pref};
if ($pref eq 'Direction') {
$values{'direction'} = lc($prefs->{$pref}->val());
} elsif ($pref eq 'Duplex') {
my $value = $prefs->{$pref}->val();
$value =~ s/Flip//;
$value =~ s/Edge//;
$values{'duplex'} = _snake_case($value);
} elsif ($pref eq 'NonFullScreenPageMode') {
my $value = _snake_case($prefs->{$pref}->val());
$value =~ s/^use_//;
$value = 'optional_content' if $value eq 'oc';
$values{'non_full_screen_page_mode'} = $value;
} else {
$values{_snake_case($pref)} = _snake_case($prefs->{$pref}->val());
}
}
if ($prefs->{'PrintPageRange'}) {
my @ranges = map { $_->val() } @{$prefs->{'PrintPageRange'}};
$values{'print_page_range'} = \@ranges;
}
if ($prefs->{'NumCopies'}) {
$values{'num_copies'} = $prefs->{'NumCopies'}->val();
}
return %values;
}
=head2 get_preference
$value = $self->get_preference($name)
=over
lib/PDF/Builder/ViewerPreferences.pm view on Meta::CPAN
}
else {
$self->{'pdf'}->{'catalog'}->{'ViewerPreferences'} = PDFDict();
}
$self->{'pdf'}->{'pdf'}->out_obj($self->{'pdf'}->{'catalog'});
return $self->{'pdf'}->{'catalog'}->{'ViewerPreferences'};
}
sub set_preferences {
my ($self, %values) = @_;
my $prefs = $self->_init_preferences();
local @CARP_NOT = qw(PDF::Builder);
foreach my $snake (keys %values) {
my $camel = _camel_case($snake);
if ($camel eq 'NonFullScreenPageMode') {
my $value = $values{$snake};
my $name = ($value eq 'none' ? 'UseNone' :
$value eq 'outlines' ? 'UseOutlines' :
$value eq 'thumbnails' ? 'UseThumbs' :
$value eq 'optional_content' ? 'UseOC' :
'');
croak "Invalid value for $snake: $values{$snake}" unless $name;
$prefs->{$camel} = PDFName($name);
}
elsif ($camel eq 'Direction') {
my $name = $values{$snake};
unless ($name =~ /^(?:L2R|R2L)$/i) {
croak "Invalid value for $snake: $name";
}
$prefs->{$camel} = PDFName(uc $name);
}
elsif ($camel =~ /^(?:View|Print)(?:Area|Clip)$/) {
my $name = ($values{$snake} eq 'media_box' ? 'MediaBox' :
$values{$snake} eq 'crop_box' ? 'CropBox' :
$values{$snake} eq 'bleed_box' ? 'BleedBox' :
$values{$snake} eq 'trim_box' ? 'TrimBox' :
$values{$snake} eq 'art_box' ? 'ArtBox' : '');
croak "Invalid value for $snake: $name" unless $name;
$prefs->{$camel} = PDFName($name);
}
elsif ($camel eq 'PrintScaling') {
my $value = $values{$snake};
my $name = ($value eq 'none' ? 'None' :
$value eq 'app_default' ? 'AppDefault' : '');
croak "Invalid value for $snake: $name" unless $name;
$prefs->{$camel} = PDFName($name);
}
elsif ($camel eq 'Duplex') {
my $value = $values{$snake};
my $name = ($value eq 'simplex' ? 'Simplex' :
$value eq 'duplex_short' ? 'DuplexFlipShortEdge' :
$value eq 'duplex_long' ? 'DuplexFlipLongEdge' : '');
croak "Invalid value for $snake: $value" unless $name;
$prefs->{$camel} = PDFName($name);
}
elsif ($camel eq 'PrintPageRange') {
unless (ref($values{$snake}) eq 'ARRAY') {
croak "The value for $snake must be a reference to an array";
}
my @range = @{$values{$snake}};
unless (@range % 2 == 0) {
croak "The value for $snake must contain pairs of page numbers";
}
if (join('', @range) =~ /\D/) {
croak "The value for $snake may only contain page numbers";
}
$prefs->{$camel} = PDFArray(map { PDFNum($_) } @range);
}
elsif ($camel eq 'NumCopies') {
unless ($values{$snake} =~ /^\d+$/) {
croak "$snake: $values{$snake} is not an integer";
}
$prefs->{$camel} = PDFNum($values{$snake});
}
elsif (grep { $camel eq $_ } @booleans) {
$prefs->{$camel} = PDFBool($values{$snake} ? 1 : 0);
}
else {
croak "Unrecognized viewer preference '$snake'";
}
}
return $self;
}
=head1 PREFERENCES
( run in 0.632 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )