📄 api2.pm
字号:
{
# Sub-element, explicitly destruct.
my $val = $self->{$key};
delete $self->{$key};
$val->release();
}
}
elsif ($ref eq 'ARRAY')
{
# Remove sub-array (of _scalars_)
delete $self->{$key};
} elsif (UNIVERSAL::can($self->{$key},'release')) {
my $val = $self->{$key};
delete $self->{$key};
$val->release();
}
elsif ($ref eq 'IO::File')
{
# IO object, destruct silently.
delete $self->{$key};
}
elsif ($ref eq 'HASH')
{
# Remove sub-hash (of _scalars_)
delete $self->{$key};
}
else
{
delete($self->{$key});
}
}
###########################################################################
# Now that we think that we've gone back and freed up all of the memory
# that we were using, check to make sure that we don't have any keys left
# in our own hash (we shouldn't). IF we do have keys left, throw a warning
# message.
###########################################################################
foreach my $key (keys %{$self})
{
warn ref($self) . " still has '$key' key left after release.\n";
}
# foreach my $k (keys %{$self}) {
# delete $self->{$k};
# }
undef;
}
=item $pdf->info %infohash
Sets the info structure of the document.
=cut
sub info {
my $self=shift @_;
my %opt=@_;
if(!defined($self->{pdf}->{'Info'})) {
$self->{pdf}->{'Info'}=PDFDict();
$self->{pdf}->new_obj($self->{'pdf'}->{'Info'});
}
map { $self->{pdf}->{'Info'}->{$_}=PDFStr($opt{$_}) } keys %opt;
$self->{pdf}->out_obj($self->{pdf}->{'Info'});
}
=item $pdf->finishobjects @objects
Force objects to be written to file.
=cut
sub finishobjects {
my ($self,@objs)=@_;
if($self->{reopened}) {
die "invalid method invokation: no file, use 'saveas' instead.";
} elsif($self->{' filed'}) {
$self->{pdf}->ship_out(@objs);
} else {
die "invalid method invokation: no file, use 'saveas' instead.";
}
}
=item $val = $pdf->default $parameter
=item $pdf->default $parameter, $val
Gets/Sets default values for the behaviour of ::API2.
=cut
sub default {
my ($self,$parameter,$var)=@_;
$parameter=~s/[^a-zA-Z\d]//g;
$parameter=lc($parameter);
my $temp=$self->{$parameter};
if(defined $var) {
$self->{$parameter}=$var;
}
return($temp);
}
=item $font = $pdf->corefont $fontname [, $lightembed]
Returns a new or existing adobe core font object.
B<Examples:>
$font = $pdf->corefont('Times-Roman',1);
$font = $pdf->corefont('Times-Bold');
$font = $pdf->corefont('Helvetica',1);
$font = $pdf->corefont('ZapfDingbats');
=cut
sub corefont {
my ($self,$name,$light)=@_;
my $key='FFx'.pdfkey($name,$light);
my $obj;
$self->{pages}->{'Resources'}
= $self->{pages}->{'Resources'}
|| PDFDict();
$self->{pages}->{'Resources'}->{'Font'}
= $self->{pages}->{'Resources'}->{'Font'}
|| PDFDict();
if((defined $self->{pages}->{'Resources'}->{'Font'}->{$key}) && $self->{reopened}) {
# we are here because we somehow created
# the reopened pdf so we simulate a valid
# object without writing a new one
$obj= PDF::API2::CoreFont->coerce(
$self->{pages}->{'Resources'}->{'Font'}->{$key},$self->{pdf},$name,$key,$light
);
} else {
$obj= $self->{pages}->{'Resources'}->{'Font'}->{$key}
|| PDF::API2::CoreFont->new(
$self->{pdf},$name,$key,$light
);
}
$self->{pdf}->new_obj($obj) unless($obj->is_obj($self->{pdf}));
$obj->{' apiname'}=$key;
$obj->{' apipdf'}=$self->{pdf};
$obj->{' api'}=$self;
$self->resource('Font',$key,$obj);
$self->{pdf}->out_obj($self->{pages});
return($obj);
}
=item $font = $pdf->psfont $pfbfile,$afmfile
Returns a new or existing adobe type1 font object.
B<Examples:>
$font = $pdf->psfont('Times-Book.pfb','Times-Book.afm');
$font = $pdf->psfont('/fonts/Synest-FB.pfb','/fonts/Synest-FB.afm');
$font = $pdf->psfont('../Highland-URW.pfb','../Highland-URW.afm');
=cut
sub psfont {
my ($self,$pfb,$afm,$encoding,@glyphs)=@_;
my $key='PSx'.pdfkey(($pfb||'x').($afm||'y')).$self->{time};
if($^O eq 'MSWin32') {
my %opts=opts_from_pfm($pfb);
$pfb = defined $opts{-pfbfile} ? $opts{-pfbfile} : $pfb;
$afm = defined $opts{-pfbfile} ? undef : $afm;
}
my $obj=PDF::API2::PSFont->new($self->{pdf},$pfb,$afm,$key,$encoding,@glyphs);
$self->{pdf}->new_obj($obj) unless($obj->is_obj($self->{pdf}));
$obj->{' apiname'}=$key;
$obj->{' apipdf'}=$self->{pdf};
$obj->{' api'}=$self;
$self->resource('Font',$key,$obj,$self->{reopened});
$self->{pdf}->out_obj($self->{pages});
return($obj);
}
=item $font = $pdf->ttfont $ttfile
Returns a new or existing truetype font object.
B<Examples:>
$font = $pdf->ttfont('TimesNewRoman.ttf');
$font = $pdf->ttfont('/fonts/Univers-Bold.ttf');
$font = $pdf->ttfont('../Democratica-SmallCaps.ttf');
=cut
sub ttfont {
my ($self,$file)=@_;
my $key='TTx'.pdfkey($file).$self->{time};
my $obj=PDF::API2::TTFont->new($self->{pdf},$file,$key);
$self->{pdf}->new_obj($obj) unless($obj->is_obj($self->{pdf}));
$obj->{' apiname'}=$key;
$obj->{' apipdf'}=$self->{pdf};
$obj->{' api'}=$self;
$self->resource('Font',$key,$obj,$self->{reopened});
$self->{pdf}->out_obj($self->{pages});
return($obj);
}
=item $img = $pdf->image $file
Returns a new image object from a file or a GD::Image object.
B<Examples:>
$img = $pdf->image('yetanotherfun.jpg');
$img = $pdf->image('truly24bitpic.png');
$img = $pdf->image('reallargefile.pnm');
$gdimgobj=GD::Image->newFromPng('truly24bitpic.png');
$img = $pdf->image($gdimgobj);
B<Important Note:>
As of version 0.2.3.4 the development of the PNG import methods
has been discontinued in favor of the GD::Image import facility.
=cut
sub image {
my ($self,$file)=@_;
my $obj=PDF::API2::Image->new($self->{pdf},$file,$self->{time});
$self->{pdf}->new_obj($obj) unless($obj->is_obj($self->{pdf}));
if($obj->{SMask}) {
$self->{pdf}->new_obj($obj->{SMask}) unless($obj->{SMask}->is_obj($self->{pdf}));
}
# $obj->{' apipdf'}=$self->{pdf};
# $obj->{' api'}=$self;
$self->resource('XObject',$obj->{' apiname'},$obj,1);
$self->{pdf}->out_obj($self->{pages});
return($obj);
}
#=item $pdf->imagemask $img, $file
#
#Appends an image mask to image object.
#
#B<Examples:>
#
# $img=$pdf->image('yetanotherfun.jpg');
# $pdf->imagemask($img,'yetanotherfun_mask.jpg');
#
# $img=$pdf->image('truly24bitpic.png');
# $pdf->imagemask($img,'truly24bitpic.png');
#
# $img=$pdf->image('reallargefile.pnm');
# $pdf->imagemask($img,'reallargefile_mask.pnm');
#
#B<Note:> This appends a pdf1.4 (Acrobat 5.x) transparency mask
#(aka. Soft Mask) to the specified image. The mask may be a grayscale
#JPG or PNM which is used as the transparency/opacity information.
#
#B<PNG Note:> In case of a PNG the actual transparency or
#alpha-channel information is read, but works only for
#the following imagetypes:
#
# Indexed plus tRNS-Chunk
# Grayscale plus Alpha-Channel
# RGBA
#
#=cut
sub imagemask {
my ($self,$img,$file)=@_;
my $obj=PDF::API2::Image->newMask($self->{pdf},$img,$file,$self->{time});
$self->{pdf}->new_obj($obj) unless($obj->is_obj($self->{pdf}));
$obj->{' apipdf'}=$self->{pdf};
$obj->{' api'}=$self;
# $self->resource('XObject',$obj->{' apiname'},$obj,1);
$self->{pdf}->out_obj($self->{pages});
return($img);
}
=item $img = $pdf->pdfimage $file, $page_number
Returns a new image object,
which is actually a page from another pdf.
B<Examples:>
$img = $pdf->pdfimage('test1.pdf',1);
$img = $pdf->pdfimage('another-test.pdf',2);
$img = $pdf->pdfimage('really-large.pdf',1000);
=item $img = $pdf->pdfimageobj $pdfobj, $page_number
As $pdf->pdfimage, but takes an already opened pdfobject (API2->open) as parameter.
B<Note:> This is functionally the same as the one above, but far less
resource-intensive, if you use many pages (possible the same) from one single pdf.
=cut
sub pdfimageobj {
my $self=shift @_;
my $s_pdf=shift @_;
my $s_idx=shift @_||0;
my ($s_page,$t_page);
$s_page=$s_pdf->openpage($s_idx);
$t_page=PDF::API2::PdfImage->new();
$self->{apiimportcache}=$self->{apiimportcache}||{};
my $dict = $s_page->find_prop('CropBox')||$s_page->find_prop('MediaBox');
if(defined $dict) {
my ($lx,$ly,$rx,$ry)=$dict->elementsof;
$t_page->{LX}=PDFNum($lx->val);
$t_page->{' lx'}=$lx->val;
$t_page->{LY}=PDFNum($ly->val);
$t_page->{' ly'}=$ly->val;
$t_page->{RX}=PDFNum($rx->val);
$t_page->{' rx'}=$rx->val;
$t_page->{RY}=PDFNum($ry->val);
$t_page->{' ry'}=$ry->val;
}
$k='Resources';
$s_page->{$k}=$s_page->find_prop($k);
if(defined $s_page->{$k}) {
$t_page->{$k}=PDFDict();
foreach my $sk (qw( ColorSpace XObject ExtGState Font Pattern ProcSet Properties Shading )) {
next unless(defined $s_page->{$k}->{$sk});
$t_page->{$k}->{$sk}=PDFDict();
foreach my $ssk (keys %{$s_page->{$k}->{$sk}}) {
next if($ssk=~/^ /);
$t_page->{$k}->{$sk}->{$ssk} = walk_obj($self->{apiimportcache},$s_pdf->{pdf},$self->{pdf},$s_page->{$k}->{$sk}->{$ssk});
}
}
}
if(defined $s_page->{Contents}) {
$s_page->fixcontents;
foreach my $k ($s_page->{Contents}->elementsof) {
$k->realise if(ref($k)=~/Objind$/);
my $str=$k->{' stream'};
if((defined $k->{Filter}) ) {
# we need to fix filter because it MAY be
# an array BUT IT COULD BE only a name
if(ref($k->{Filter})!~/Array$/) {
$k->{Filter} = PDFArray($k->{Filter});
}
use Text::PDF::Filter;
my @filts;
my ($hasflate) = -1;
my ($temp, $i, $temp1);
for ($i = 0; $i <= $#{$k->{'Filter'}{' val'}}; $i++)
{
$temp = $k->{'Filter'}{' val'}[$i]->val;
$temp1 = "Text::PDF::$temp";
push (@filts, $temp1->new);
}
foreach my $f (@filts) {
$str = $f->infilt($str, 1);
}
}
$t_page->{' pdfimage'}.="\n$str\n";
}
}
$self->{pdf}->new_obj($t_page) unless($t_page->is_obj($self->{pdf}));
$self->{pdf}->out_obj($self->{pages});
return($t_page);
}
sub pdfimage {
my $self=shift @_;
my $s_pdf=shift @_;
my $s_idx=shift @_||0;
$s_pdf=PDF::API2->open($s_pdf);
my $t_page=$self->pdfimageobj($s_pdf,$s_idx);
$s_pdf->end;
return($t_page);
}
=item $shadeing = $pdf->shade
Returns a new shading object.
=cut
sub shade {
my ($self,%opts)=@_;
my $key='SHx'.pdfkey(%opts || 'shade'.localtime() );
my $obj=PDFDict();
# my $pat=$self->pattern(-type=>2);
$self->{pdf}->new_obj($obj) unless($obj->is_obj($self->{pdf}));
$obj->{' apiname'}=$key;
$obj->{' apipdf'}=$self->{pdf};
$obj->{' api'}=$self;
$self->resource('Shading',$key,$obj,1);
$self->{pdf}->out_obj($self->{pages});
return($obj);
}
=item $pat = $pdf->pattern
Returns a new pattern object.
=cut
sub pattern {
my ($self,%opts)=@_;
my $obj=PDF::API2::Pattern->new();
my $key=$obj->{' apiname'};
$self->{pdf}->new_obj($obj) unless($obj->is_obj($self->{pdf}));
# $obj->{' apipdf'}=$self->{pdf};
# $obj->{' api'}=$self;
$self->resource('Pattern',$key,$obj,1);
$self->{pdf}->out_obj($self->{pages});
return($obj);
}
=item $cs = $pdf->colorspace %parameters
Returns a new colorspace object.
B<Examples:>
$cs = $pdf->colorspace(
-type => 'CalRGB',
-whitepoint => [ 0.9, 1, 1.1 ],
-blackpoint => [ 0, 0, 0 ],
-gamma => [ 2.2, 2.2, 2.2 ],
-matrix => [
0.41238, 0.21259, 0.01929,
0.35757, 0.71519, 0.11919,
0.1805, 0.07217, 0.95049
]
);
$cs = $pdf->colorspace(
-type => 'CalGray',
-whitepoint => [ 0.9, 1, 1.1 ],
-blackpoint => [ 0, 0, 0 ],
-gamma => 2.2
);
$cs = $pdf->colorspace(
-type => 'Lab',
-whitepoint => [ 0.9, 1, 1.1 ],
-blackpoint => [ 0, 0, 0 ],
-gamma => [ 2.2, 2.2, 2.2 ],
-range => [ -100, 100, -100, 100 ]
);
$cs = $pdf->colorspace(
-type => 'Indexed',
-base => 'DeviceRGB',
-maxindex => 3,
-whitepoint => [ 0.9, 1, 1.1 ],
-blackpoint => [ 0, 0, 0 ],
-gamma => [ 2.2, 2.2, 2.2 ],
-colors => [
[ 0,0,0 ], # black = 0
[ 1,1,1 ], # white = 1
[ 1,0,0 ], # red = 2
[ 0,0,1 ], # blue = 3
]
);
$cs = $pdf->colorspace(
-type => 'ICCBased',
-base => 'DeviceRGB',
-components => 3,
-iccfile => 'codacus.icc'
);
=cut
sub colorspace {
my ($self,@opt)=@_;
my $key='CSx'.pdfkey('colorspace',@opt);
my $obj=PDF::API2::ColorSpace->new($self->{pdf},$key,@opt);
$self->{pdf}->new_obj($obj) unless($obj->is_obj($self->{pdf}));
$obj->{' apiname'}=$key;
# $obj->{' apipdf'}=$self->{pdf};
# $obj->{' api'}=$self;
$self->resource('ColorSpace',$key,$obj,1);
$self->{pdf}->out_obj($self->{pages});
return($obj);
}
=item $img = $pdf->barcode %options
Returns a new barcode object.
B<Note:> refer to PDF::API2::Barcode for more details.
=cut
sub barcode {
my ($self,%opts)=@_;
my $key='BCx'.pdfkey('barcode'.time().rand(0x7fffff));
my $obj=PDF::API2::Barcode->new($key,%opts);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -