package Text::PDF::String; =head1 NAME Text::PDF::String - PDF String type objects and superclass for simple objects that are basically stringlike (Number, Name, etc.) =head1 METHODS =cut use strict; use vars qw(@ISA %trans %out_trans); # no warnings qw(uninitialized); use Text::PDF::Objind; @ISA = qw(Text::PDF::Objind); %trans = ( "n" => "\n", "r" => "\r", "t" => "\t", "b" => "\b", "f" => "\f", "\\" => "\\", "(" => "(", ")" => ")" ); %out_trans = ( "\n" => "n", "\r" => "r", "\t" => "t", "\b" => "b", "\f" => "f", "\\" => "\\", "(" => "(", ")" => ")" ); =head2 Text::PDF::String->from_pdf($string) Creates a new string object (not a full object yet) from a given string. The string is parsed according to input criteria with escaping working. =cut sub from_pdf { my ($class, $str) = @_; my ($self) = {}; bless $self, $class; $self->{'val'} = $self->convert($str); $self->{' realised'} = 1; return $self; } =head2 Text::PDF::String->new($string) Creates a new string object (not a full object yet) from a given string. The string is parsed according to input criteria with escaping working. =cut sub new { my ($class, $str) = @_; my ($self) = {}; bless $self, $class; $self->{'val'} = $str; $self->{' realised'} = 1; return $self; } =head2 $s->convert($str) Returns $str converted as per criteria for input from PDF file =cut sub convert { my ($self, $str) = @_; $str =~ s/\\([nrtbf\\()]|[0-7]+)/defined $trans{$1} ? $trans{$1} : chr(oct($1))/oegi; # $str =~ s/\\([0-7]+)/chr(oct($1))/oeg; # thanks to kundrat@kundrat.sk 1 while $str =~ s/\<([0-9a-f]{2})[\r\n]*/chr(hex($1))."\<"/oige; $str =~ s/\<([0-9a-f]?)\>/chr(hex($1."0"))/oige; $str =~ s/\<\>//og; return $str; } =head2 $s->val Returns the value of this string (the string itself). =cut sub val { $_[0]->{'val'}; } =head2 $->as_pdf Returns the string formatted for output as PDF for PDF File object $pdf. =cut sub as_pdf { my ($self) = @_; my ($str) = $self->{'val'}; if ($str =~ m/[^\n\r\t\b\f\040-\176\200-\377]/oi) { $str =~ s/(.)/sprintf("%02X", ord($1))/oge; return "<$str>"; } else { $str =~ s/([\n\r\t\b\f\\()])/\\$out_trans{$1}/ogi; return "($str)"; } } =head2 $s->outobjdeep Outputs the string in PDF format, complete with necessary conversions =cut sub outobjdeep { my ($self, $fh, $pdf, %opts) = @_; $fh->print($self->as_pdf ($pdf)); } =head2 $s->copy($inpdf, $res, $unique, $outpdf, %opts) Copies an object. See Text::PDF::Objind::Copy() for details =cut sub copy { my ($self, $inpdf, $res, $unique, $outpdf, %opts) = @_; my ($i); $res = $self->SUPER::copy($inpdf, $res, $unique, $outpdf, %opts); $res->{'val'} = $self->{'val'}; $res->{' realised'} = 1; $res; }