CAM-PDF
view release on metacpan or search on metacpan
lib/CAM/PDF.pm view on Meta::CPAN
my $dy = $rect[3]-$rect[1];
if (!$formdict->{BBox})
{
$formdict->{BBox} = CAM::PDF::Node->new('array',
[
CAM::PDF::Node->new('number', 0, $formonum, $formgnum),
CAM::PDF::Node->new('number', 0, $formonum, $formgnum),
CAM::PDF::Node->new('number', $dx, $formonum, $formgnum),
CAM::PDF::Node->new('number', $dy, $formonum, $formgnum),
],
$formonum,
$formgnum);
}
my $text = $value;
$text =~ s/ \r\n? /\n/gxms;
$text =~ s/ \n+\z //xms;
my @rsrcs;
my $fontmetrics = 0;
my $fontname = q{};
my $fontsize = 0;
my $da = q{};
my $tl = q{};
my $border = 2;
my $tx = $border;
my $ty = $border + 2;
my $stringwidth;
if ($propdict->{DA}) {
$da = $self->getValue($propdict->{DA});
# Try to pull out all of the resources used in the text object
@rsrcs = ($da =~ m{ /([^\s<>/\[\]()]+) }gxms);
# Try to pull out the font size, if any. If more than
# one, pick the last one. Font commands look like:
# "/<fontname> <size> Tf"
if ($da =~ m{ \s*/(\w+)\s+(\d+)\s+Tf.*? \z }xms)
{
$fontname = $1;
$fontsize = $2;
if ($fontname)
{
if ($propdict->{DR})
{
my $dr = $self->getValue($propdict->{DR});
$fontmetrics = $self->getFontMetrics($dr, $fontname);
}
#print STDERR "Didn't get font\n" if (!$fontmetrics);
}
}
}
my %flags = (
Justify => 'left',
);
if ($propdict->{Ff})
{
# Just decode the ones we actually care about
# PDF ref, 3rd ed pp 532,543
my $ff = $self->getValue($propdict->{Ff});
my @flags = split m//xms, unpack 'b*', pack 'V', $ff;
$flags{ReadOnly} = $flags[0];
$flags{Required} = $flags[1];
$flags{NoExport} = $flags[2];
$flags{Multiline} = $flags[12];
$flags{Password} = $flags[13];
$flags{FileSelect} = $flags[20];
$flags{DoNotSpellCheck} = $flags[22];
$flags{DoNotScroll} = $flags[23];
}
if ($propdict->{Q})
{
my $q = $self->getValue($propdict->{Q}) || 0;
$flags{Justify} = $q==2 ? 'right' : ($q==1 ? 'center' : 'left');
}
# The order of the following sections is important!
if ($flags{Password})
{
$text =~ s/ [^\n] /*/gxms; # Asterisks for password characters
}
if ($fontmetrics && ! $fontsize)
{
# Fix autoscale fonts
$stringwidth = 0;
my $lines = 0;
for my $line (split /\n/xms, $text) # trailing null strings omitted
{
$lines++;
my $w = $self->getStringWidth($fontmetrics, $line);
if ($w && $w > $stringwidth)
{
$stringwidth = $w;
}
}
$lines ||= 1;
# Initial guess
$fontsize = ($dy - 2 * $border) / ($lines * 1.5);
my $fontwidth = $fontsize * $stringwidth;
my $maxwidth = $dx - 2 * $border;
if ($fontwidth > $maxwidth)
{
$fontsize *= $maxwidth / $fontwidth;
}
# allow for user override
if (exists $opts->{max_autoscale_fontsize} && $fontsize > $opts->{max_autoscale_fontsize}) {
$fontsize = $opts->{max_autoscale_fontsize};
}
if (exists $opts->{min_autoscale_fontsize} && $fontsize < $opts->{min_autoscale_fontsize}) {
$fontsize = $opts->{min_autoscale_fontsize};
}
$da =~ s/ \/$fontname\s+0\s+Tf\b /\/$fontname $fontsize Tf/gxms;
}
if ($fontsize)
{
# This formula is TOTALLY empirical. It's probably wrong.
$ty = $border + 2 + (9 - $fontsize) * 0.4;
}
( run in 0.328 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )