📄 api2.pm
字号:
=item $egs->strokeadjust $boolean
=cut
sub strokeadjust {
my ($self,$var)=@_;
$self->{SA}=PDFBool($var);
return($self);
}
=item $egs->strokeoverprint $boolean
=cut
sub strokeoverprint {
my ($self,$var)=@_;
$self->{OP}=PDFBool($var);
return($self);
}
=item $egs->filloverprint $boolean
=cut
sub filloverprint {
my ($self,$var)=@_;
$self->{op}=PDFBool($var);
return($self);
}
=item $egs->overprintmode $num
=cut
sub overprintmode {
my ($self,$var)=@_;
$self->{OPM}=PDFNum($var);
return($self);
}
=item $egs->blackgeneration $obj
=cut
sub blackgeneration {
my ($self,$obj)=@_;
$self->{BG}=$obj;
return($self);
}
=item $egs->blackgeneration2 $obj
=cut
sub blackgeneration2 {
my ($self,$obj)=@_;
$self->{BG2}=$obj;
return($self);
}
=item $egs->undercolorremoval $obj
=cut
sub undercolorremoval {
my ($self,$obj)=@_;
$self->{UCR}=$obj;
return($self);
}
=item $egs->undercolorremoval2 $obj
=cut
sub undercolorremoval2 {
my ($self,$obj)=@_;
$self->{UCR2}=$obj;
return($self);
}
=item $egs->transfer $obj
=cut
sub transfer {
my ($self,$obj)=@_;
$self->{TR}=$obj;
return($self);
}
=item $egs->transfer2 $obj
=cut
sub transfer2 {
my ($self,$obj)=@_;
$self->{TR2}=$obj;
return($self);
}
=item $egs->halftone $obj
=cut
sub halftone {
my ($self,$obj)=@_;
$self->{HT}=$obj;
return($self);
}
sub halftonephase {
my ($self,$obj)=@_;
$self->{HTP}=$obj;
return($self);
}
sub smoothness {
my ($self,$var)=@_;
$self->{SM}=PDFNum($var);
return($self);
}
sub font {
my ($self,$font,$size)=@_;
$self->{Font}=PDFArray(PDFName($font->{' apiname'}),PDFNum($size));
return($self);
}
sub linewidth {
my ($self,$var)=@_;
$self->{LW}=PDFNum($var);
return($self);
}
sub linecap {
my ($self,$var)=@_;
$self->{LC}=PDFNum($var);
return($self);
}
sub linejoin {
my ($self,$var)=@_;
$self->{LJ}=PDFNum($var);
return($self);
}
sub meterlimit {
my ($self,$var)=@_;
$self->{ML}=PDFNum($var);
return($self);
}
sub dash {
my ($self,@dash)=@_;
$self->{ML}=PDFArray( map { PDFNum($_); } @dash );
return($self);
}
sub flatness {
my ($self,$var)=@_;
$self->{FL}=PDFNum($var);
return($self);
}
sub renderingintent {
my ($self,$var)=@_;
$self->{FL}=PDFName($var);
return($self);
}
#==================================================================
# PDF::API2::Font
#==================================================================
package PDF::API2::Font;
use strict;
use PDF::API2::UniMap;
use PDF::API2::Util;
use Text::PDF::Utils;
=head2 PDF::API2::Font
=item $font2 = $font->clone $subkey
Returns a clone of a font object.
=cut
sub copy { die "COPY NOT IMPLEMENTED !!!";}
sub clone {
my $self=shift @_;
my $key=shift @_ || localtime();
my $res=$self->copy($self->{' apipdf'});
$self->{' apipdf'}->new_obj($res);
$res->{' apiname'}.='_CLONEx'.pdfkey($key);
$res->{'Name'}=PDFName($res->{' apiname'});
$res->{' api'}->{pages}->{'Resources'}=$res->{' api'}->{pages}->{'Resources'} || PDFDict();
$res->{' api'}->{pages}->{'Resources'}->{'Font'}=$res->{' api'}->{pages}->{'Resources'}->{'Font'} || PDFDict();
$res->{' api'}->{pages}->{'Resources'}->{'Font'}->{$res->{' apiname'}}=$res;
return($res);
}
=item @glyphs = $font->glyphs $encoding
Returns an array with glyphnames of the specified encoding.
=cut
sub glyphs {
my ($self,$enc) = @_;
$self->{' apipdf'}->{' encoding'}=$self->{' apipdf'}->{' encoding'} || {};
$self->{' apipdf'}->{' encoding'}->{$enc}=$self->{' apipdf'}->{' encoding'}->{$enc} || PDF::API2::UniMap->new($enc);
return($self->{' apipdf'}->{' encoding'}->{$enc}->glyphs);
}
=item $font->encode $encoding
Changes the encoding of the font object. If you want more than one encoding
for one font use 'clone' and then 'encode'.
B<Note:> The following encodings are supported (as of version 0.1.16_beta):
adobe-standard adobe-symbol adobe-zapf-dingbats
cp1250 cp1251 cp1252
cp437 cp850
es es2 pt pt2
iso-8859-1 iso-8859-2 latin1 latin2
koi8-r koi8-u
macintosh
microsoft-dingbats
B<Note:> Other encodings must be seperately installed via the pdf-api2-unimaps archive.
=cut
sub encode {
my $self=shift @_;
my ($encoding,@glyphs)=@_;
if(scalar @glyphs < 1) {
eval {
@glyphs=$self->glyphs($encoding);
};
$encoding='custom';
}
if($self->{' apifontlight'}) {
$self->encodeProperLight($encoding,32,255,@glyphs);
} else {
$self->encodeProper($encoding,32,255,@glyphs);
}
}
=item $pdfstring = $font->text $text
Returns a properly formated string-representation of $text
for use in the PDF.
=cut
sub text {
my ($font,$text)=@_;
my $newtext='';
foreach my $g (0..length($text)-1) {
$newtext.=
(substr($text,$g,1)=~/[\x00-\x1f\\\{\}\[\]\(\)]/)
? sprintf('\%03lo',vec($text,$g,8))
: substr($text,$g,1) ;
}
return("($newtext)");
}
=item $wd = $font->width $text
Returns the width of $text as if it were at size 1.
=cut
sub width {
my ($self,$text)=@_;
my ($width);
foreach (unpack("C*", $text)) {
$width += $self->{' AFM'}{'wx'}{$self->{' AFM'}{'char'}[$_]};
}
$width/=1000;
return($width);
}
sub ascent { return $_[0]->{' ascent'}; }
sub descent { return $_[0]->{' descent'}; }
sub italicangle { return $_[0]->{' italicangle'}; }
sub fontbbx { return @{$_[0]->{' fontbbox'}}; }
sub capheight { return $_[0]->{' capheight'}; }
sub xheight { return $_[0]->{' xheight'}; }
#==================================================================
# PDF::API2::CoreFont
#==================================================================
package PDF::API2::CoreFont;
use strict;
use PDF::API2::Util;
use Text::PDF::Utils;
use vars qw(@ISA);
@ISA = qw( Text::PDF::AFont PDF::API2::Font );
=head2 PDF::API2::CoreFont
Subclassed from Text::PDF::AFont and PDF::API2::Font.
=item $font = PDF::API2::CoreFont->new @parameters
Returns a adobe core font object (called from $pdf->corefont).
=cut
sub new {
my ($class,$pdf,$name,$key,$light) = @_;
my ($self) = {};
$class = ref $class if ref $class;
if((defined $light) && ($light==1)) {
$self = $class->SUPER::newCoreLight($pdf,$name,$key);
$self->{' apifontlight'}=1;
} else {
$self = $class->SUPER::newCore($pdf,$name,$key);
}
$self->{' apiname'}=$key;
$self->{' apipdf'}=$pdf;
$self->encodeProperLight('latin1',32,255);
return($self);
}
sub coerce {
my ($class,$font,$pdf,$name,$key,$light) = @_;
my ($self) = {};
$class = ref $class if ref $class;
if((defined $light) && ($light==1)) {
$self = $class->SUPER::newCoreLight(undef,$name,$key);
$self->{' apifontlight'}=1;
} else {
$self = $class->SUPER::newCore(undef,$name,$key);
}
$self->{' apiname'}=$key;
$self->{' apipdf'}=$pdf;
foreach my $k (keys %{$font}) {
$self->{$k}=$font->{$k};
}
return($self);
}
#==================================================================
# PDF::API2::PSFont
#==================================================================
package PDF::API2::PSFont;
use strict;
use PDF::API2::Util;
use Text::PDF::Utils;
use vars qw(@ISA);
@ISA = qw( Text::PDF::AFont PDF::API2::Font );
=head2 PDF::API2::PSFont
Subclassed from Text::PDF::AFont and PDF::API2::Font.
=item $font = PDF::API2::PSFont->new @parameters
Returns a adobe type1 font object (called from $pdf->psfont).
=cut
sub new {
my ($class, @para) = @_;
my ($self) = {};
$class = ref $class if ref $class;
$self = $class->SUPER::new(@para);
$self->{' apiname'}=$para[3];
$self->{' apipdf'}=$para[0];
return($self);
}
#==================================================================
# PDF::API2::TTFont
#==================================================================
package PDF::API2::TTFont;
use strict;
use PDF::API2::UniMap qw( utf8_to_ucs2 );
use PDF::API2::Util;
use Text::PDF::Utils;
use vars qw(@ISA);
@ISA = qw( Text::PDF::TTFont0 PDF::API2::Font );
=head2 PDF::API2::TTFont
Subclassed from Text::PDF::TTFont0 and PDF::API2::Font.
=item $font = PDF::API2::TTFont->new $pdf,$ttffile,$pdfname
Returns a truetype font object (called from $pdf->ttfont).
=cut
sub new {
my ($class, $pdf,$file,$name) = @_;
$class = ref $class if ref $class;
my $self = $class->SUPER::new($pdf,$file,$name, -subset => 1);
my $font=$self->{' font'};
$font->{'cmap'}->read;
$font->{'hmtx'}->read;
$font->{'post'}->read;
my $upem = $font->{'head'}->read->{'unitsPerEm'};
$self->{' unicid'}=();
$self->{' uniwidth'}=();
my @map=$font->{'cmap'}->reverse;
foreach my $x (0..scalar(@map)) {
$self->{' unicid'}{$map[$x]||0}=$x;
$self->{' uniwidth'}{$map[$x]||0}=$font->{'hmtx'}{'advance'}[$x]*1000/$upem;
}
$self->{' encoding'}='latin1';
$self->{' chrcid'}={};
$self->{' chrcid'}->{'latin1'}=();
$self->{' chrwidth'}={};
$self->{' chrwidth'}->{'latin1'}=();
foreach my $x (0..255) {
$self->{' chrcid'}->{'latin1'}{$x}=$self->{' unicid'}{$x}||$self->{' unicid'}{32};
$self->{' chrwidth'}->{'latin1'}{$x}=$font->{'hmtx'}{'advance'}[$self->{' unicid'}{$x}||$self->{' unicid'}{32}]*1000/$upem;
}
$self->{' ascent'}=int($font->{'hhea'}->read->{'Ascender'} * 1000 / $upem);
$self->{' descent'}=int($font->{'hhea'}{'Descender'} * 1000 / $upem);
eval {
$self->{' capheight'}=int(
$font->{'loca'}->read->{'glyphs'}[
$font->{'post'}{'STRINGS'}{"H"}||0
]->read->{'yMax'}
* 1000 / $upem
);
};
$self->{' capheight'}||=0;
eval {
$self->{' xheight'}=int(
$font->{'loca'}->read->{'glyphs'}[
$font->{'post'}{'STRINGS'}{"x"}||0
]->read->{'yMax'}
* 1000 / $upem
);
};
$self->{' xheight'}||=0;
$self->{' italicangle'}=$font->{'post'}->read->{'italicAngle'};
$self->{' fontbbox'}=[
int($font->{'head'}{'xMin'} * 1000 / $upem),
int($font->{'head'}{'yMin'} * 1000 / $upem),
int($font->{'head'}{'xMax'} * 1000 / $upem),
int($font->{'head'}{'yMax'} * 1000 / $upem)
];
$self->{' apiname'}=$name;
$self->{' apipdf'}=$pdf;
return($self);
}
=item $pdfstring = $font->text $text
Returns a properly formated string-representation of $text
for use in the PDF.
=cut
sub text {
my ($self,$text,$enc)=@_;
$enc=$enc||$self->{' encoding'};
my ($newtext);
$self->{' subvec'}='' unless($self->{' subvec'});
foreach (unpack("C*", $text)) {
my $g=$self->{' chrcid'}{$enc}{$_};
$newtext.= sprintf('%04x',$g);
vec($self->{' subvec'},$g,1)=1;
}
return("<$newtext>");
}
=item $pdfstring = $font->text_utf8 $text
Returns a properly formated string-representation of $text
for use in the PDF but requires $text to be in UTF8.
=cut
sub text_utf8 {
my ($self,$text)=@_;
$text=utf8_to_ucs2($text);
my ($newtext);
foreach my $x (0..(length($text)>>1)-1) {
my $g=$self->{' unicid'}{vec($text,$x,16)};
$newtext.= sprintf('%04x',$g);
vec($self->{' subvec'},$g,1)=1;
}
return("<$newtext>");
}
=item $wd = $font->width $text
Returns the width of $text as if it were at size 1.
=cut
sub width {
my ($self,$text,$enc)=@_;
$enc=$enc||$self->{' encoding'};
my ($width);
foreach (unpack("C*", $text)) {
$width += $self->{' chrwidth'}{$enc}{$_};
}
$width/=1000;
return($width);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -