PDF-Create-1.43/0000755000175000017500000000000013161531451012607 5ustar manwarmanwarPDF-Create-1.43/t/0000755000175000017500000000000013161531451013052 5ustar manwarmanwarPDF-Create-1.43/t/07-fonts.t0000644000175000017500000000646512710676465014645 0ustar manwarmanwar#!/usr/bin/perl # # PDF::Create - Test Script # # Copyright 2010- Markus Baertschi # # Please see the CHANGES and Changes file for the detailed change log # # Testing fonts # use strict; use warnings; use PDF::Create; use Test::More tests => 34; # we want the resulting pdf file to have the same name as the test my $pdfname = $0; $pdfname =~ s/\.t/\.pdf/; ################################################################### # # start testing # my $pdf = PDF::Create->new( 'filename' => "$pdfname", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Markus Baertschi', 'Title' => 'Testing Basic Stuff', ); ok( defined $pdf, "Create new PDF" ); ok( $pdf->add_comment("Testing Fonts"), "Add a comment" ); my $root = $pdf->new_page( 'MediaBox' => $pdf->get_page_size('A4') ); ok( defined $root, "Create page root" ); # Prepare font my $f1 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica' ); ok( defined $f1, "Define Font" ); # Add a page which inherits its attributes from $root my $page = $root->new_page; ok( defined $root, "Page root defined" ); # Write some text to the page $page->stringc( $f1, 40, 306, 700, 'PDF::Create' ); $page->stringc( $f1, 20, 306, 650, "version $PDF::Create::VERSION" ); $page->stringc( $f1, 20, 306, 600, "Test: $0" ); $page->stringc( $f1, 20, 306, 550, 'Markus Baertschi (markus@markus.org)' ); # Prepare fonts my %font; my $f_helv = define_font('Helvetica'); $font{'Courier'} = define_font('Courier'); $font{'Courier-Bold'} = define_font('Courier-Bold'); $font{'Courier-Oblique'} = define_font('Courier-Oblique'); $font{'Courier-BoldOblique'} = define_font('Courier-BoldOblique'); $font{'Helvetica'} = define_font('Helvetica'); $font{'Helvetica-Bold'} = define_font('Helvetica-Bold'); $font{'Helvetica-Oblique'} = define_font('Helvetica-Oblique'); $font{'Helvetica-BoldOblique'} = define_font('Helvetica-BoldOblique'); $font{'Symbol'} = define_font('Symbol', undef, 'Symbol'); $font{'Times-Roman'} = define_font('Times-Roman'); $font{'Times-Bold'} = define_font('Times-Bold'); $font{'Times-Italic'} = define_font('Times-Italic'); $font{'Times-BoldItalic'} = define_font('Times-BoldItalic'); my $y = 500; foreach my $f ( sort keys %font ) { ok( $page->stringc( $font{$f}, 20, 300, $y, $f ), "Writing with font $f" ); $y -= 30; } # Wrap up the PDF and close the file ok( !$pdf->close(), "Close PDF" ); ################################################################ # # Check the resulting pdf for errors with pdftotext # SKIP: { skip '/usr/bin/pdftotext not installed', 1 if (! -x '/usr/bin/pdftotext'); my $out = `/usr/bin/pdftotext $pdfname /dev/null 2>&1`; ok( $out eq "", "pdftotext $out"); } # # TODO: Add test with ghostscript # #echo | gs -q -sDEVICE=bbox 06-wifi-parabola-broken.pdf exit; sub define_font { my $fname = shift; my $ftype = shift; my $fencoding = shift; if ( !defined $ftype ) { $ftype = 'Type1'; } if ( !defined $fencoding ) { $fencoding = 'WinAnsiEncoding'; } ok( my $f = $pdf->font( 'BaseFont' => $fname, 'Subtype' => $ftype, 'Encoding' => $fencoding ), "Defining font $fname" ); return $f; } PDF-Create-1.43/t/09-cgi-script.pl0000644000175000017500000000262712710676465015726 0ustar manwarmanwar#!/usr/bin/perl -w # # sample cgi-script to produce a PDF on the fly # # Markus Baertschi, markus@markus.org # BEGIN { unshift @INC, "lib", "../lib" } use strict; use PDF::Create; #use CGI; # # Write HTTP header with application/pdf as doc type # # If you want the PDF to open in an external application # You should change this to # -type => 'application/x-pdf', -attachment => $pdfname # #print CGI::header( -type => 'application/pdf' ); # # Start the pdf with '-' (stdout) as filename # my $pdf = PDF::Create->new( 'filename' => "-", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Markus Baertschi', 'Title' => 'Simple Test Document', ); # create the document root my $root = $pdf->new_page( 'MediaBox' => $pdf->get_page_size('A4') ); # Prepare 2 fonts my $f1 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica' ); # Add a page which inherits its attributes from $root my $page = $root->new_page; # Write some text to the page $page->stringc( $f1, 40, 306, 700, 'PDF::Create' ); $page->stringc( $f1, 20, 306, 650, "version $PDF::Create::VERSION" ); $page->stringc( $f1, 20, 306, 600, 'Simple Test Document' ); $page->stringc( $f1, 20, 300, 300, 'Fabien Tassin' ); $page->stringc( $f1, 20, 300, 250, 'Markus Baertschi (markus@markus.org)' ); # Wrap up the PDF and close the file $pdf->close; PDF-Create-1.43/t/12-version.t0000644000175000017500000000062512710676465015165 0ustar manwarmanwar#!/usr/bin/perl use strict; use warnings; use PDF::Create; use Test::More; eval { PDF::Create->new->version(1.0) }; like($@, qr//); eval { PDF::Create->new->version(1.1) }; like($@, qr//); eval { PDF::Create->new->version(1.2) }; like($@, qr//); eval { PDF::Create->new->version(1.3) }; like($@, qr//); eval { PDF::Create->new->version(1.5) }; like($@, qr/Invalid version number/); done_testing(); PDF-Create-1.43/t/13-close.t0000644000175000017500000000177313031211100014553 0ustar manwarmanwar#!/usr/bin/perl use strict; use warnings; use PDF::Create; use File::Temp qw/tempfile/; use Test::More tests => 2; my $get_filename = sub { my ($filehandle, $filename) = tempfile(); return $filename; }; my $get_filehandle = sub { my $filehandle = tempfile(); return $filehandle; }; my $pdf_with_filename = create_pdf({ 'filename' => $get_filename->() }); my $pdf_with_filehandle = create_pdf({ 'fh' => $get_filehandle->() }); $pdf_with_filename->close(); ok(!defined fileno($pdf_with_filename->{fh}), 'pdf with filename not closed properly'); $pdf_with_filehandle->close(); ok(defined fileno($pdf_with_filehandle->{fh}), 'pdf with filehandle should not be closed'); sub create_pdf { my ($args) = @_; my $pdf = PDF::Create->new(%$args); my $root = $pdf->new_page('MediaBox' => $pdf->get_page_size('A4')); my $font = $pdf->font('Encoding' => 'WinAnsiEncoding'); my $page = $root->new_page; $page->stringc($font, 40, 306, 700, 'PDF::Create'); return $pdf; } PDF-Create-1.43/t/06-annotation.t0000644000175000017500000000602512710676465015655 0ustar manwarmanwar#!/usr/bin/perl # # PDF::Create - Test Script # # Copyright 2010- Markus Baertschi # # Please see the CHANGES and Changes file for the detailed change log # # Testing annitations # - Link # use strict; use warnings; use PDF::Create; use Test::More tests => 13; # we want the resulting pdf file to have the same name as the test my $pdfname = $0; $pdfname =~ s/\.t/\.pdf/; ################################################################### # # start testing # my $pdf = PDF::Create->new( 'filename' => "$pdfname", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Markus Baertschi', 'Title' => 'Testing Basic Stuff', ); ok( defined $pdf, "Create new PDF" ); ok( $pdf->add_comment("Testing Basic Stuff"), "Add a comment" ); my $root = $pdf->new_page( 'MediaBox' => $pdf->get_page_size('A4') ); ok( defined $root, "Create page root" ); # Prepare font my $f1 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica' ); ok( defined $f1, "Define Font" ); # Add a page which inherits its attributes from $root my $page = $root->new_page; ok( defined $root, "Page root defined" ); # Write some text to the page $page->stringc( $f1, 40, 306, 700, 'PDF::Create' ); $page->stringc( $f1, 20, 306, 650, "version $PDF::Create::VERSION" ); $page->stringc( $f1, 20, 306, 600, "Test: $0" ); $page->stringc( $f1, 20, 306, 550, 'Markus Baertschi (markus@markus.org)' ); my $uri = 'http://search.cpan.org/~markusb/PDF-Create/'; # Clickable URI with visible box around it $page->string( $f1, 15, 150, 440, "Clickable Link" ); ok( $page->string( $f1, 15, 150, 400, "$uri" ), "string" ); ok( $page->string_underline( $f1, 15, 150, 400, "$uri" ), "string_underline" ); ok( $pdf->annotation( 'Subtype' => 'Link', 'x' => 145, 'y' => 395, 'w' => 321, 'h' => 25, 'URI' => 'http://search.cpan.org/~markusb/PDF-Create', 'Border' => [ 1, 1, 1 ] ), "annotation" ); # Clickable URI with invisible box around it $page->stringc( $f1, 15, 306, 240, "Clickable Link Centered" ); ok( $page->string( $f1, 15, 306, 200, "$uri", 'c' ), "string" ); ok( my $len = $page->string_underline( $f1, 15, 306, 200, "$uri", 'c' ), "string_underline" ); ok( $pdf->annotation( 'Subtype' => 'Link', 'x' => 306 - ( $len / 2 ), 'y' => 200, 'w' => $len, 'h' => 15, 'URI' => 'http://search.cpan.org/~markusb/PDF-Create', 'Border' => [ 0, 0, 0 ] ), "annotation" ); # Wrap up the PDF and close the file ok( !$pdf->close(), "Close PDF" ); ################################################################ # # Check the resulting pdf for errors with pdftotext # SKIP: { skip '/usr/bin/pdftotext not installed', 1 if (! -x '/usr/bin/pdftotext'); my $out = `/usr/bin/pdftotext $pdfname /dev/null 2>&1`; ok( $out eq "", "pdftotext $out"); } # # TODO: Add test with ghostscript # #echo | gs -q -sDEVICE=bbox 06-wifi-parabola-broken.pdf PDF-Create-1.43/t/51-memory-leak.t0000644000175000017500000000707212700523573015716 0ustar manwarmanwaruse strict; use warnings; use File::Temp qw(tempdir); use PDF::Create; use Test::More; use Test::LeakTrace; plan tests => 4; my $dir = tempdir( CLEANUP => 1 ); no_leaks_ok { my $pdf = PDF::Create->new('filename' => "$dir/mypdf.pdf", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Fabien Tassin', 'Title' => 'My title', ); }; no_leaks_ok { my $pdf = PDF::Create->new('filename' => "$dir/mypdf.pdf", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Fabien Tassin', 'Title' => 'My title', ); my $root = $pdf->new_page('MediaBox' => [ 0, 0, 612, 792 ]); }; no_leaks_ok { my $pdf = PDF::Create->new('filename' => "$dir/mypdf.pdf", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Fabien Tassin', 'Title' => 'My title', ); my $root = $pdf->new_page('MediaBox' => [ 0, 0, 612, 792 ]); # Add a page which inherits its attributes from $root my $page = $root->new_page; # Prepare 2 fonts my $f1 = $pdf->font('Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica'); my $f2 = $pdf->font('Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica-Bold'); #$DB::signal = 1; # Prepare a Table of Content my $toc = $pdf->new_outline('Title' => 'Document', 'Destination' => $page); }; no_leaks_ok { my $pdf = PDF::Create->new('filename' => "$dir/mypdf.pdf", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Fabien Tassin', 'Title' => 'My title', ); my $root = $pdf->new_page('MediaBox' => [ 0, 0, 612, 792 ]); # Add a page which inherits its attributes from $root my $page = $root->new_page; # Prepare 2 fonts my $f1 = $pdf->font('Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica'); my $f2 = $pdf->font('Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica-Bold'); # Prepare a Table of Content my $toc = $pdf->new_outline('Title' => 'Document', 'Destination' => $page); $toc->new_outline('Title' => 'Section 1'); my $s2 = $toc->new_outline('Title' => 'Section 2', 'Status' => 'closed'); $s2->new_outline('Title' => 'Subsection 1'); $page->stringc($f2, 40, 306, 426, "PDF::Create"); $page->stringc($f1, 20, 306, 396, "version $PDF::Create::VERSION"); # Add another page my $page2 = $root->new_page; $page2->line(0, 0, 612, 792); $page2->line(0, 792, 612, 0); $toc->new_outline('Title' => 'Section 3'); $pdf->new_outline('Title' => 'Summary'); # Add something to the first page $page->stringc($f1, 20, 306, 300, 'by Fabien Tassin '); # Add the missing PDF objects and a the footer then close the file $pdf->close; }; PDF-Create-1.43/t/pdf-logo.jpg0000644000175000017500000003065412710676465015311 0ustar manwarmanwarJFIF,,C  !"$"$Cq," \ !1At"28QUWa7BTVq#6sv'3Rbr$5Su4CcGD !1QARaq23#Bb"%4r5$6T ?ܴ!BBӻN-mD[.yH M| ;V9}&LiRY!KOܙ?Hh~Oj0B;t3ڑեɞsB;3ڢw5Org'\(f&{{RMSܙ?W! ?f&{{Q43ڮ$lҞyOj?f&{{U„jRl:o39AT3qМ@ 9'n9 x;ZqpŘ-66R1k^\v :{i?D/>uE$"cK<;#h8 B՛KRo= KZzbfň!Rpq& vz=%SfNI G>Fl !!@B!!@B!!@ke3WAKf+\*mzBQ (DžRQ# d(B  D(B )Bt&i_jIZa}l[>MvNҦ)Ui(3,,3` Sε(1W>y?Cv$yx6X/M/_Qm7 RdS]#80H εvsQtViꧨdIn {[v ;BpR Dݲ9mB6wXs̷ @ !BB ! s_凱;a^>Oyew$.ø]ps_凱=bw$.ø]ps_凱=bT6oeV R;X/фHw9F6P7@!g]~ oOXqE3yX_+> oK> oOXqE3yP_/> oGܞOxgz> Me?%?'S8޼ϢBD/k 9@z=/9琑 ٿ,sf7Cvg9Vy&t]St3B ) $/ROq4Űojv.Bض@qՉ\a{PW5Vä$*&n%wȐĩ,xsz{GhfAՉ@UG) kL*dSu1kNGR4"u"Ķ}kEm0c7.w!(!U޺P5%7 Na4}8i- gx\\J5NZKUi33L L@#O(#a\!!@B=J~j@MƕgN-,y?+XW^3%?X5rL7;Zp)7ړ> b]]ߟ|oemҭZq:rowޒXFxWVEN2K\Zg;ԓ2(r߼euw~p+m:Di%OsKG+'^//y:_Ln]]ߟ2?˦U-;lHv7h7zr8#N- өOT@0&bC:N0JNuyK{gV&IgaPp(,V?A=^-ws9&" ,&-Rϵ?H<,Iǥ?&q2?8euw~5GNTdM'aˇ(>,5EZFlXafnpѮRm<6 3KZK7N-{O+XWWw[i#K/Dm"4O?՟^s_^!ѩ|2?8euw~`nm.F$)j^#78ד5P t&)g 4g&{{WWw[Amadj _eNR{W5 Tm!j[[B )oiD>S?}"jlKڵ]?p-sPWa{W-X X{V{WMӣӪrpg$Yf1<Չ@kJ=3pf.4Cnƈ]T{N0=7c4Q-]JmZLK *:ȌRxRҺ:܌S)QoI\7 B#\((5YW[פY;F\7t-7na@B!/Tb2_ň=a髭ſ돚'-~[}qX? nFyp߹_DFI!>w#=K;KnEoyC&iN|X< <>%*ѪBm-K` 8ow_2JvlQ#QhDlhLtB< 9qʾfsӹ[>S|Jsyky5u]֐`EH#bB$8._q%c}m/UeoJDM'tghh8'|rd3ĬϢbN+bYZK" x*w+)JjY=6O];ΣR S$r41nƾkDiڤN7" #oHve}-^TK},UMP* V3B}%W]שJNUhӹiifOj/vUZ4hA_%63A,#a9VnvgMнnhrf#86&ǐVny!o8r~IUrF#et_6%6[.IСLŨl.rDBDVxZ}aM__kNU3LF@ @pU_򗲻p?ѶDy86S &kcjڹ2}]뒕Qd ~ ؆so.pa'h; _wuiJl8-h~y'q*K/]F5o>ԯVΜ!6r= # OZ0I_ê_; $,H??jN~ض9Z?[ȸ 8jS9+9nj,/b潫 ڀཫڹj *ajM5YIKHV%IdV9Z[[xi>7=:P5W66R \k40Q]_Pzn9˻&A$>x#!q!jM|j髛Nb8ACat4q5e;7i*֨u z:m1탐G B 5S^3%?WfK?Qp?5u[}qX?˶iWlɚ$5?^0H5FjKb%p U(e$RnOMybeu'S.;^Jv[&Ћ\9ˏh._׍z6<.U&Zq-k\ڭLZ֜a)8tAD=n6`q zsyZezKS6[~wPi*n^Bs"A/$GҝY56VfbV*1CZ̞i? ~Bpe*zmԊu|BxlB>'"%}`:-a)p_XsQK,זs}Y/=#@&jl"֪0c44=w;{ۿ^xc|h+sI5~o#Kx3r|_yOb83r|_yOb.?mG6'Kϥ_ ܟg؎ ܟgضFPmZ ۇ*9 D89.g|4y/8[}.jFfV8pfV8Ÿ\wG໾<ޜI->5~o#O3r|_yOb83r|_yOb ;pa ON$K7>/ռ'>/ռ'm]pi ON$K7>/ռ'>/ռ'mpm ON$K7<>/ռ'mu A.ʥ F1No1e+ifM 8;ye޺YQ!]3)|ԭmlNٺ-- {ypܯxz@lk:7lvz@lC{6F(#];EށB6>_i#ck>sVP1w}bky׈>{VQΰ]J&h~{VR־]uA(Z{ +ګ}`Ҋ-bĤ\RxtZW 9hv.h;FA۟tYD N/0~iVW-;V2B;u+: b;z ;.49AV)u+]ɫPRȶ,5dʪ ]ս2B|Ĕ8458;DHB!Z}uڕW1 ˭`ԯUb@c!,,(!L @cK! $ BD)$2YQ!HY0!d!D2!d!"Q!d!"Q-,$BQ-,(BR- 1BGm"^yu}/vaRmy<֓WnXSKa XI$JxI $B@@L$B)+Fl>柞һVAʕbٙ ?RWMZH006 CS%Dm$&F {oJ槠SG>݇k>5[}W/,~q pȑ&>WoG- app)Ihpr9KZ?BaYPFnr:M7 BD/RD)B$BD BB"H 1?vs&/G^q|9}!@Bi>waRZi{<֓W~F8K HIO a $8IK 1ņȐ#CZ摰YV k*W)".{B8MNkcϳVgx Nv,R˧,&ؐ JLA7-DbCxsH?1YVO{LxK d$B!"( iBX@@D@cH 1Ev&/HnvDB!AieZO]Tv_k50)a, #ž@G )a, #8IO +=UV !?qDuO?@oh6";Q+сv*pUԔ{>fФ~P[:Js6\'):wBq%1o*BΜl [ȎGZ:'Cx r])m.' -#}E}u]j^$HQ!OšfLd$BB%2!!M, 1B!"K d/7R{]E_w1b!!@Pze}<֓WDzXy'X$I,)$0@G )a$p@C uHJ ^k)HFz xI񯥅P4e!զ] ep o~^5 )OkacJߑ}Z&aJ3yn01q;|<W֥ ۧѥY)3_H-hJglw o(Ej]麽k ʚ :vDވz Z tdɟ^.z3wZUE\cP[B&FGD+] / f} R®׵-ioYls^ƽcZr<K ia!M, BXS!"K d(HY ͝ݐw;ob }7w;obԴ!BB4òXy'X,*7L;/R}U@$8Bh@G )a$p@@FY?q(K62xN"qkOb‰Kx;x9bЫo)ѡfm77;dڼirG[3v^u~[fw$)LYZ hR&@貯>+z0]g8c=njZ֍zO)EUn}#T(js*ts@> pM_NY܆a/ ? q9=!\4Zf+T"L!yh"9Q,zfvbv*u͟ޏZ޶%,%4ˑK XFK ia!M, 1L$B_uGd 蘽*!y L@z!!@B._4FiwfsJO^@,$ )$IaK "$R_ Bz]/&c|dWYIB.Ob=hPXҦK-z`k}2ӄz%2$a31y Oލ9vwϟEqkt0>&m(Qn._g!EhB0/8PZ=r7vJXBfa%<$Ln5ICP8vpAN Rrɽgt1"ScKяr8UZ뽗CRXYR!wMrWt䲭OڏzFהdݼU6,|%zy[-mRS!<;# M*8ekYJ/'K xK ЊARK$D)0Uw&/Kך; xD(B!CiwfJO^ b攟UbpXI4 XRHI, Ms&"ӎnOa%p]5KzޞN@bz'|G7U.Hf# 4v(J4.Լg"VŦчMIl՛}OKC6&&|gMSR2ro[#0,$–Z\ߐ/iS7\r+Se41hDr\V4VfyTTk%pFtJNYp;x%\仟6Q_6*+]R Q`vbcH,)a, " aM, Y xs&/LW;!oxDB!CiofJO^ʉa攟Ubh@E XIh@$ܝn֧݈ ֏ $%%=)RipYK{eE9+b4kr?W)FRa%!61ˀ1YoZty9l6ضu[a6Giju٫bfCRn=0nj')p3Y]뱔Ap|n^޼ْZt5S/~%QS)j2mGc!uJ숗w&1ѳh#]JtZz?q8s?JT$)-Cx1_>"wBidTz~nJ}XŲ4d6MQC]>&}jQhֆөR2`qz {U2Hq K9tʤH8W5?-&ſwDo7AĒ58a=M%~ӆvTR鋓e#}t풗6!/^mNA uS' iޓ{%İrYJMpҧS5V3pqdFssl2GZƐ:B1@COsIMcϔMjԳ8㏡y5162e]СDǽw>muJ&4b^gBpMƹ\_/*>Q;Jcx.ω&F]<̣I +ԧ5N۱ ' {IoMj\)%4ˑ^f셼9}kݐׇ'u'ji$edOU޺AQ7l9#ŅЬ)YХWܵ/|DRBX@GM@E,)a,$KꮛS8rčj qh _1N# \=αnO䋉F{l~XO`i׶֜w3IR}&==zsh%6UћtnT%ak_6H?޹j%2:lHM߷= YygӬi'qL9tgh 9>\sj1y՛;vuRX%ӓofo,;XRK Ƒ^e솼9}̝ ^-atUtBhǥ"_:-Aĕa`owBڅlK]a7})Qֻ5F61>jrӦ~ח{[$%7ԒٯZ6V)M+XU*RRz)Ykϡ}%dQ 2%%㑣#>XS4qo>-~_I6mQM''W]9ָtFCs# ĞÓEҥ:Z,-/𿾶í%r9߆?r^a%$)PHBa%$ "' M@G )!a<$HM, RB)aK "cx&/Nט"oxDB!Digf:OW4Xy'a!@B MaBa%$ "BXII@EM$Bh8II,$I)%udM蘽=^a슼=@Bz> ^Z-ӳw^kÚ6 'all'; use Test::More; my $min_tcm = 0.9; eval "use Test::CheckManifest $min_tcm"; plan skip_all => "Test::CheckManifest $min_tcm required" if $@; ok_manifest(); PDF-Create-1.43/t/11-encode.t0000644000175000017500000000646512700523573014732 0ustar manwarmanwar#!/usr/bin/perl use strict; use warnings; use PDF::Create; use Test::More; # The cases array contains test-cases # In each triple the first value is the expected return value # of the encode() method. # The second and third values are the two parameters # of the encode() method. # The third parameter is optional but it can also be a complex # data structure. # expected, type, value my @cases = ( [undef, 'null'], ['anything', 'null', 'anything'], # any value [undef, 'number'], ['value', 'number', 'value'], # any value ["\n", 'cr'], ["\n", 'cr', 'abc'], # TODO: probably should complain that a 2nd, unnecesssary param was given ['true', 'boolean', 'true'], ['false', 'boolean', 'false'], ['false', 'boolean', '0'], ['true', 'boolean', '42'], # any other value as the 3rd item # ['true', 'boolean', undef], # TODO: give error or eliminate warnings ['any string', 'verbatim', 'any string'], # anything ['x', 'verbatim', 'x'], # anything # [undef, 'verbatim', undef], # TODO should give error, now fails with unknown type as the do{} fails # [0, 'verbatim', 0], # TODO should work?, now fails with unknown type as the do{} fails ['(any string)', 'string', 'any string'], # anything ['(x)', 'string', 'x'], # anything ['()', 'string', undef], # TODO what should happen? eliminate warnings ['(0)', 'string', 0], # TODO: shouldn't this check if the given value was indeed a number? ['any string', 'number', 'any string'], # anything ['x', 'number', 'x'], # anything [undef, 'number', undef], # TODO eliminate warnngs [0, 'number', 0], ['/any string', 'name', 'any string'], # anything ['/x', 'name', 'x'], # anything ['/', 'name', undef], # TODO ???, eliminate warnings ['/0', 'name', 0], ['[/anything]', 'array', [ ['name', 'anything'], ] ], ['[/42 abc]', 'array', [ ['name', 42], ['verbatim', 'abc'], ] ], # TODO more complex test cases for dictionary ["<<\n/42 /text\n/abc (qwe)\n>>", 'dictionary', { 42 => ['name', 'text'], abc => ['string', 'qwe'], } ], # TODO more complex test cases for object ["abc 43 obj\n/qwe\nendobj", 'object', [ 'abc', 43, ['name', 'qwe'] ] ], ["abc 45 R", 'ref', ['abc', 45]], ["<<\n/abc 46\n/23 /qwe\n>>\nstream\nsome data\nendstream\n", 'stream', { Data => 'some data', abc => ['number', 46], 23 => ['name', 'qwe'], } ], ); plan tests => 2 + @cases; { my @warn; local $SIG{__WARN__} = sub { push @warn, @_ }; PDF::Create::encode(); # TODO eliminat warning from code caused by undef in $type like $warn[1], qr/PDF::Create::encode: empty argument, called by/, 'no params'; }; eval { PDF::Create::encode('something'); }; like $@, qr{Error: unknown type 'something'}, 'exception'; my %too_random = map { $_ => 1 } qw(dictionary stream); foreach my $c (@cases) { my ($expected, $type, $value) = @$c; SKIP: { if ($too_random{$type}) { if (defined $ENV{PERL_PERTURB_KEYS} and $ENV{PERL_PERTURB_KEYS} == 2 and defined $ENV{PERL_HASH_SEED} and $ENV{PERL_HASH_SEED} == 1) { } else { skip 'PERL_PERTURB_KEYS=2 and PERL_HASH_SEED=1 has to be in order to have predictable Hashes', 1; } } my $name = $type . (defined $value ? ",$value" : ''); is PDF::Create::encode($type, $value), $expected, $name; } } PDF-Create-1.43/t/meta-yml.t0000644000175000017500000000130512710676465015001 0ustar manwarmanwar#!/usr/bin/perl use 5.006; use strict; use warnings; use PDF::Create; use Test::More; eval "use Test::CPAN::Meta"; plan skip_all => "Test::CPAN::Meta required for testing MYMETA.yml" if $@; my $meta = meta_spec_ok('MYMETA.yml'); my $version = $PDF::Create::VERSION; is($meta->{version}, $version, 'MYMETA.yml distribution version matches'); if($meta->{provides}) { for my $mod (keys %{$meta->{provides}}) { eval("use $mod;"); my $mod_version = eval(sprintf("\$%s::VERSION", $mod)); is($meta->{provides}{$mod}{version}, $version, "MYMETA.yml entry [$mod] version matches"); is($mod_version, $version, "Package $mod doesn't match version."); } } done_testing(); PDF-Create-1.43/t/00-load.t0000644000175000017500000000071712700523573014404 0ustar manwarmanwar#!perl -T use 5.006; use strict; use warnings FATAL => 'all'; use Test::More tests => 5; BEGIN { use_ok('PDF::Create') || print "Bail out!\n"; use_ok('PDF::Create::Page') || print "Bail out!\n"; use_ok('PDF::Create::Outline') || print "Bail out!\n"; use_ok('PDF::Image::GIF') || print "Bail out!\n"; use_ok('PDF::Image::JPEG') || print "Bail out!\n"; } diag( "Testing PDF::Create $PDF::Create::VERSION, Perl $], $^X" ); PDF-Create-1.43/t/50-versioning.t0000644000175000017500000000151712700523573015654 0ustar manwarmanwar#!/usr/bin/perl # # PDF::Create - Test Script # # Copyright 2010- Markus Baertschi # # Please see the CHANGES and Changes file for the detailed change log # # Check module versions against PDF::Create version # use strict; use warnings; use PDF::Create; use Test::More tests => 5; my $version = $PDF::Create::VERSION; ok($version eq $PDF::Create::VERSION,"PDF::Create version is $PDF::Create::VERSION"); ok($version eq $PDF::Create::Page::VERSION,"PDF::Create::Page version is $PDF::Create::Page::VERSION"); ok($version eq $PDF::Create::Outline::VERSION,"PDF::Create::Outline version is $PDF::Create::Outline::VERSION"); ok($version eq $PDF::Image::GIF::VERSION,"PDF::Image::GIF version is $PDF::Image::GIF::VERSION"); ok($version eq $PDF::Image::JPEG::VERSION,"PDF::Image::JPEG version is $PDF::Image::JPEG::VERSION"); PDF-Create-1.43/t/10-generic.t0000644000175000017500000000502212710676465015106 0ustar manwarmanwar#!/usr/bin/perl # # PDF::Create - Test Script # # Copyright 2010- Markus Baertschi # # Please see the CHANGES and Changes file for the detailed change log # # Generic Testing # use strict; use warnings; use PDF::Create; use Test::More; my $pdfname = $0; $pdfname =~ s/\.t/\.pdf/; my $pdf = PDF::Create->new( 'filename' => "$pdfname", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Markus Baertschi', 'Title' => 'Testing Basic Stuff', ); ok(defined $pdf, "Create new PDF"); ok(defined $pdf->new_page('MediaBox' => $pdf->get_page_size('A4')), "Create page root"); eval { $pdf->new_page('Xxxx' => $pdf->get_page_size('A4')) }; like($@, qr/Received invalid key/); ok (defined $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica' ), "Define Font" ); eval { $pdf->font( 'SubType' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica'); }; like($@, qr/Received invalid key/); eval { $pdf->font( 'Subtype' => 'Type6', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica'); }; like($@, qr/Received invalid value/); eval { $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding123', 'BaseFont' => 'Helvetica'); }; like($@, qr/Received invalid value/); eval { $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica123'); }; like($@, qr/Received invalid value/); eval { $pdf->get_page_size('AA') }; like($@, qr/Invalid page size name 'AA' received/); foreach (qw/A0 A1 A2 A3 A4 A4L A5 A6 LETTER BROADSHEET LEDGER TABLOID LEGAL EXECUTIVE 36X36/) { eval { $pdf->get_page_size($_) }; is($@, ''); } ok(!$pdf->close(), "Close PDF"); my %params = ('filenam' => "$pdfname", 'Versin' => 1.3, 'PageMod' => 'UseOutlines', 'Autho' => 'Test Author', 'Titl' => 'Test Title', 'Debg' => 0, 'Creatr' => 'Test Creator', 'Keyword' => 'Test Keywords'); foreach (keys %params) { eval { PDF::Create->new($_ => $params{$_}) }; like($@, qr/Invalid constructor key '$_' received/); } eval { PDF::Create->new('PageMode' => 'UseOutline') }; like($@, qr/Invalid value for key 'PageMode' received 'UseOutline'/); eval { PDF::Create->new('Debug' => 'abc') }; like($@, qr/Invalid value for key 'Debug' received 'abc'/); done_testing(); PDF-Create-1.43/t/01-basic.t0000644000175000017500000000420112710676465014551 0ustar manwarmanwar#!/usr/bin/perl # # PDF::Create - Test Script # # Copyright 2010- Markus Baertschi # # Please see the CHANGES and Changes file for the detailed change log # # Testing basic stuff # - open / close # - page root / new page # - comment # use strict; use warnings; use PDF::Create; use Test::More tests => 11; # we want the resulting pdf file to have the same name as the test my $pdfname = $0; $pdfname =~ s/\.t/\.pdf/; ################################################################### # # start testing # my $pdf = PDF::Create->new( 'filename' => "$pdfname", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Markus Baertschi', 'Title' => 'Testing Basic Stuff', ); isa_ok( $pdf, 'PDF::Create' ); ok( $pdf->add_comment("Testing Basic Stuff"), "Add a comment" ); my $root = $pdf->new_page( 'MediaBox' => $pdf->get_page_size('A4') ); #ok( defined $root, "Create page root" ); isa_ok( $root, 'PDF::Create::Page' ); # Prepare font my $f1 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica' ); ok( defined $f1, "Define Font" ); # Add a page which inherits its attributes from $root my $page = $root->new_page; ok( defined $page, "Page defined" ); # Page title and description ok( $page->stringc( $f1, 40, 306, 700, 'PDF::Create' ), "stringc" ); ok( $page->stringc( $f1, 20, 306, 650, "version $PDF::Create::VERSION" ), "stringc" ); ok( $page->stringc( $f1, 20, 306, 600, "Test: $0" ), "stringc" ); ok( $page->stringc( $f1, 20, 306, 550, 'Markus Baertschi (markus@markus.org)' ), "stringc" ); # Wrap up the PDF and close the file ok( !$pdf->close(), "Close PDF" ); ################################################################ # # Check the resulting pdf for errors with pdftotext # SKIP: { skip '/usr/bin/pdftotext not installed', 1 if (! -x '/usr/bin/pdftotext'); my $out = `/usr/bin/pdftotext $pdfname /dev/null 2>&1`; ok( $out eq "", "pdftotext $out"); } # # TODO: Add test with ghostscript # #echo | gs -q -sDEVICE=bbox 06-wifi-parabola-broken.pdf PDF-Create-1.43/t/03-image.t0000644000175000017500000000501213160436350014540 0ustar manwarmanwar#!/usr/bin/perl # # PDF::Create - Test Script # # Copyright 2010- Markus Baertschi # # Please see the CHANGES and Changes file for the detailed change log # # Testing image-related functions # - image # - JPEG/GIF # use strict; use warnings; use PDF::Create; use File::Basename; use Test::More tests => 9; # we want the resulting pdf file to have the same name as the test my $pdfname = $0; $pdfname =~ s/\.t/\.pdf/; my $gifname = dirname($0) . "/pdf-logo.gif"; my $jpgname = dirname($0) . "/pdf-logo.jpg"; ################################################################### # # start testing # my $pdf = PDF::Create->new( 'filename' => "$pdfname", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Markus Baertschi', 'Title' => 'Testing Images (jpg, gif)', ); ok( defined $pdf, "Create new PDF" ); ok( $pdf->add_comment("The is a PDF for testing"), "Add a comment" ); my $root = $pdf->new_page( 'MediaBox' => $pdf->get_page_size('A4') ); ok( defined $root, "Create page root" ); # Prepare font my $f1 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica' ); ok( defined $f1, "Define Font" ); # Add a page which inherits its attributes from $root my $page = $root->new_page; ok( defined $root, "Page root defined" ); # Write some text to the page $page->stringc( $f1, 40, 306, 700, 'PDF::Create' ); $page->stringc( $f1, 20, 306, 650, "version $PDF::Create::VERSION" ); $page->stringc( $f1, 20, 306, 600, "Test: $0" ); $page->stringc( $f1, 20, 306, 550, 'Markus Baertschi (markus@markus.org)' ); # Add a JPEG image $page->string( $f1, 20, 200, 400, 'JPEG Image:' ); my $jpg1 = $pdf->image($jpgname); ok( $page->image( 'image' => $jpg1, 'xscale' => 0.2, 'yscale' => 0.2, 'xpos' => 350, 'ypos' => 400 ), "jpg created" ); # Add a GIF image $page->string( $f1, 20, 200, 200, 'GIF Image:' ); my $gif1 = $pdf->image($gifname); ok( $page->image( 'image' => $gif1, 'xscale' => 0.2, 'yscale' => 0.2, 'xpos' => 350, 'ypos' => 200 ), "gif created" ); # Wrap up the PDF and close the file ok( !$pdf->close(), "Close PDF" ); ################################################################ # # Check the resulting pdf for errors with pdftotext # SKIP: { skip '/usr/bin/pdftotext not installed', 1 if (! -x '/usr/bin/pdftotext'); my $out = `/usr/bin/pdftotext $pdfname /dev/null 2>&1`; ok( $out eq "", "pdftotext $out"); } # # TODO: Add test with ghostscript # #echo | gs -q -sDEVICE=bbox 06-wifi-parabola-broken.pdf PDF-Create-1.43/t/pdf-logo.gif0000644000175000017500000006062012710676465015272 0ustar manwarmanwarGIF89a,q  !"$"')&*,),-+-/,342796=>˦KRY uDh(%V)[l}R*tâGl뵱ӆ]4nHdNy-K*dzz5w>&vVgu} 8vބ:,Yq !g=sFhbi+")v38HV/5,|ͭrG^\5g ^FjSrWeWHrVh5lхG7/ nyh"_xeky38xnf)za${ 9^p ".ꨫIeV3g:#Fkn+`iQ+)mљᱧU*1i۴v)e_>z-]54L$ Q6+$ۗwq$nfgZQRm1NYֲ*݂ ͙:,ž]aqF.k*ĵf 媯\ަ03[#2*`Џoqe +RE/_NBY~b^+]\)16ZbbZ'g_QcKΑ"Bx1k4 }v(4iAF@D3t:ha!s< _zrb)Fșƍ87 ?R;70S%sFc>1 !m/u`嬩 lDY0>R!WiQ/u 1:n@ݳF(W`UST+24qOK:77:Mz "=, 0wq0 08FXͳlCLBa"uhl3A ~ZCYz9+ e9F^<ŋp(6rŝۨ@CQf$orUx n|xiXTl%t'DRlCwvTi5&0|ݐ* =5ⴤ;gE9">slS-lٶta} >è, V]zxynA7t׵+ *(V0(39ٶEr{X?YF1tс][=Ѻt~rws >Ѝ5W;G麱uц 2=hT!W 6'ð+&Yک:Zh@vv#Qu<ʣ JwAwjC6O֐ u\p m0 k7F"X}x { Wg[wO3R_h|hmQ1#:;*y<vP *tU Dd|]FUc|̧6J.0kfssׄ,n@٠9g6[kzv6dvF 0949 1۵^m'؋ 0;<QQgRu^<Å[qD9\Ue8 گџв_ ꖆ xɡ<';Kp)qFUa; Tu+qiRu \۸:i }}-}ˁ" PﰹkEx uzC>tU00 > 컩3 *s9U ʹ@K*jug4XRdŰO: /gp[;r  /0| p `;p#L2Lrf4:e4́ ̻ˣ芝Qp#u:dUM / 90 Pf|ek [Ÿ* kllpppj wLu&gM֚1eX^Ŷk)I׷fB7_/гʫk~:ǫ:Knd< ,;aPF`p׷|f`m h,Ԋ n7FS;ur @Bܼ*ϋV [a X;"۷k$_,v}xM\{3]#Ǹ|p, 2{p\d6$ɛ]X-=XwU{îBƌz&R5.n亾lju,lD›n0Z`ܷ؛ʵC`g^m޵O\ cU Rp[k{BKGF֌(dd7 Osuϸ|] lY\-`h,p1pf!vWM4SjM`렼[ܙy~ς桂;DR7 M^ORwی ީe^0ko9VGPO42PENND ٌ[ߚ{c8[^ lʷh?߯}Z;Zgh>5\g/ȱ<$͐'W\l] 4مj&8h^\ ; JH^%Nnީ+~* mnpK iKvEt$ [Mڌ?꣝WX[KUi{LP7T \ӕf  ,o F˽w 3;w_4iq'|šk pN BZ:-Vi~&p 8P/fH?7/["oǦ`._k׶O4bW)V\X*U~Z@{٣WFx֭׮zCn]JuR#3&q1.n=A,ϠϞ9k挙2eȆVkذZ_EOXe͞E{.PW\Û_I}'z޼"wD]0cym1, Z%+ʕ_4^=i.v:u)]Dgsf6r3[ٜML;cʦ&lY`"Ҿ$2߯(> ̟{l1*}D˖)23Lh!B5dIEC~`{bH#z7hu@JIF`j{Np&oF!gI ):꼬܋K/9 1k2NO"KM32l̺PLsF+!Z\{.ڈni87rS|c.ĩ錔'%cucYKoVe-=0N򛓲DRx LsZv>.4Tdυ2ԡ\dLC*11jz`<]yЙsɥlh.vҦࠀ(SW)f4daz, q+[,6wLμ !01`E 1RAVIPRE!:0Q0E#u] BWFߐKpplNqqn^eթdϼH[? -縈-[1|L /ء3[@̈0+o309%+A+ZC':]FHjE$,8Tщ$VimpJ1FY4kV: ɇ-oL;]ѬH0 ߄*=~3ׇft9tTm6BD$%d&^tNJe$mDUFYU$) "(#HH $9#:0 뤵]۝%hBRo`SDg~;RĹ93g=/XDN쑺jbJb(tKe 'u6$5%bw{ρH _+ +Ca0 `3\ǙQʫBGØ,ez!q]oHLu-Mj4AHhssd7T \!H@f ehEe /W3'#;a jqsd X(,b絺pIFv(^f)GT5ae{Zhcl$T @r\KYx> Qhb+UODE^.ڭ9v"lIT4ulʄ:QwGӈ~ag_9}64EA$'}W0iEKXc'b+d!bzl7EPs2R.Rz"FaZڸQ* j#!3Q#Z+AHEHp;3̙is27+i"Ф[x‡N{躎XxQ1'nC Y*# i(Z 7 +t»O;#>ycÊ! 6԰ $ʚF# *:~2}IY%A+r2" %(R_`LA?x#>zB:! 8zOb1ЬΒ{Vjup )b(&Y\cpè9;Y+1:;]0 0AD>\:c1^H!*x1z/ʱNPA#,Z2鸦/*3FRb\ǙE7FBB"}CO[ɶDbPB>t"6{@7)MjI5{:}ڗOUZo *T*# 8-G  eITJn 7!I胐ZzDE z08<,~?J{@,JjӥyC4?)37*[D Qˬ0Bʫ c¿(N={=S̉?.䀪e@#RTbs< 7s1YFP)$ÊK"+IXMsӉ<z#cC/" 1A\!aNX:} MK?Ί?yAB&C6dPdYcEGHdѐE dKMVI!A"<#cA'ɎfUVvXeXIfa#cl:;rVgYde^I^&HbI#̐l}g 00]z ړ?eiXqC6*Xc@^VX"cAffd Q @i[QfnVu~)wQ^TvRnUN~~}֥ꢦ-d`]>x;㨎^&ݬ>dSt"F[#fjfk.XLkp1"vFndId5ż&ͼSRR8O.I^! 4%L|iWneYeX!ںe~~ _V_~Cj7hhfhVm@2a"8fH"~KgpnQbNe|iQnVgˮnЮMmW6Xb6f&F ff)҇ +FԀI'N银jXqq? !+fnf@`?hFT@pE6#sJpjULǥ n*Ύc6FsԖh5jdF7{ϰo6A'(UWYzUot.Htg/ (GSD#Nr*vOwJcP_jXqVVUV+XeŽYG"GBm?ddIAq^w,iCgvx F&^ECeJW z%a堾V0Og.5Vj6l_uomqjzOoH:s M~R\Nk unksUDorGb },>Nn/v6hvy%ΊߐFmwEF hŵNgfz̧F7$fhrjGnM6jgצpvW^cWGjcGQ33/q TUWUr0\ upં %Z4TEYV ʔ*WlJdsf3h8A gΚ5Z&ҡHeZT2f̠J*1dYfEaņ=V,Xń ,\p璭e-^zw.J SLDXf%k*W^nH hA#+ZU HQ%$ܺw)D8u)gN2gnsJRըǶsݮ5pφ5v,YowW0te}Xy2eVbA*e/B EB"GYAPlo)L6 O:4p3R8ԔR7EuUMWZ}wwYgW[G]y7%`iC%6` 9XdI&&Hn6PBbc]"^t*ivm'x(oAMM0SNATPAw)2gq`$wL%\쭵|WU,7} /4$ _vB9ak )P"!E Q1˦ld(ݾ$L= pʈqV sLcS63$dwIj䒥:|ꡇe^Xµ%u *!cEb*&^fkڝ]V-++:=MN$xMNT@U]vVި_qWZg2]rk+e f+:I焫 bs4aB2PHfi]LEN`t1^ֹK0ly"iȴA6֚yNm.'ͭP&7C*%Tj' ZъFksX}r_{R7' c,s痯o {UWHٓb3S<%TH!譙1lRG6rэ&̑o:Cs$@ _CFZB)kpaD,IfɈ1Z[B2IƔ{SD2LQejcSjJXQ4/Q9ʄ'\&) _E?. +7l1£C+TS IYo_?6q@_JL'A 9bHcwOjTaͽx -3(1ʉF/H_[ɵukX@9XP,R>rQQ 4.de IY,Y:::*JWU -06Nz&51э$aolMU9WP"T^DB V7K+0zQ0 ⠈pvQ:6!?"f21 Ydx]!y@[}}HtcJ}n3{"Ԣ[a _ I7-P;0F푋{2zbFC1W`R c(6 1VCUjK|l"w 8ALd"2sgwee3wͭ\8MYBE#HΡuܹ˘}P8F UHEIimX=?gRN:y02]U܌D=Mߺ tcќ߽[1M\qLWSKq]tU ,A/@FExıWG% J,UC޷T^i螥C5 DOD. G͈1H!"B1lԾ`!G)5[W\ aɀpL]eH'I!c= q ZaX-/Iٍݑ *< !C1 0HZąť(Z}} !JD(@"UeP"fƳ%@60`'B]3̜-لN\Z]sMaҙy&_X 4 0.j  Zݗ"bCKD(,+K01 o6X$,|7rr}]Qn eq0&1|É$43\uBY23A1`(]h "|k&A!EB1rK826pF@ikfR!'1o3[8G1@x"Ehɿ\?7R\.%҇f""Ş\>5X@ #R3h뫿Z%Μd!ņIUJ4I2BS *ף=Z촾 .q\[v0s]X ڪFJItn\tE[56.5϶Xo&QMozBg@R  ZLNNh XiFE.vtZgB|⇆_L%BKdGUoEo5-6Ꭴ4uT&jˀ2H)(1@D%А iy7Zd -[b1`稂ڗs'щ&eeug6g#1Yo]Z7sAmo*0@ BR@ǎ7 oǘz.w4#]&vd4tKOHv o.qv5v'[&{:Jq8Rvs<*+sӁ@ ( )' "tjYOt}m'[t0T:\:Ӫuov[;nJRyW R @ , [޳32 u9ր*vn/S0Hf[E_m%6%zIdpH#AJ3l,0C/5 av8xX{e0O*1k\Fã@jE0nK[26.(ۇ*w 2ܜGoZ ME6뷨h 2P {,%.[*%Y~$,=PKg;iuX[Lpa1_6RtC-n RDH'b΄);FmSgPD =XMZ={yթbBYױ;,pwoMVX7m)+~> \p虉@h&BlPXr.t&f8M܊ j߂i:n*f,RjƲ2K[; 3,1#(1& 8L:;h "J˨#g0$ްm& imtSv"Qߊ:j)ۓŨj+JPvI J ,# $?I :2!S$(A"*KeN S: [dʨCw7G(=O^|n+.jsQ:tERLgpZS6mr0)Sr͢ޅ蠃4H"<T`ݼW _0'bLS(& EEFNa"}\p-=94MP= 1ioRUKP;g,K0ep--hWd39夓{x(B[Q}*mdnQE?ֶoU2,tTuw^lUVDh#O}& ^HW fmxDFD;'v96䦲C>/&[U07 -^qT^v,Rlc%rX[JMocJ>p-WvsNkCCxJB3}AJD! XƬK(='D80HZVr8(nzT/`Ue$ C':wXɌ,n0"h,B?q"I& 2#|zFƊTъEP* T'чո媒]H1&v3c',j֜eh!!C4פ)@@ah X׿)ozSz&X e& ER)ZX(Mղ26Ƨ]3g+e_!32)4r}Fdwe3z?T*]rReRW9^3+GV5]/@ֶŜ^[2T(ÎqBYǝ( ت  3+=h&!~ $WgH# <]@ EqAϑ{aplrR^). b?!P1 GKakڼ6z-`HW'ꢟ9k1*yUrʎIeR*!] "FrmL k!q{Hia*3\ibt"#9ws/>5AUW;>kAgϸ-Ee,K#DvJ)!JHK3evѿꎱJo8ˉsGI 18.ph hV"Xo_HV[7NcPH)Ȃ)lImCݞx<5 jڅϽ[ӫ!ɄbPùJɫr[ĔN`vChJ±L8}t gx>.t $%y\5V1x`^B>MtՐHe(DӼXL`Hz䳤s2N@`Ͼ#{h0hB^#74_Jj. tz8-> ճIWgu$ AX}W0ƋSt \7?fp+ O玃88aDiȏH6E&Hb2L O@?.2a D/hFU6")xɮ`z̮vNn(6j/P1nZ=ffF ⅆ$XxzǕH#4@#y\o )Wg ia,dz(r$!P? \ZhOL2\Z ,! 24h2o@$_GrЧ>Gar~E  ~@eT lE0:4b_LU^H qiH<椧CYTp^1ɅnFS@B(œ%? Z q^ @@t$"L8‌Ol(m:oJTQZQdnY 3)$2F,#P%RgP)IAmfBNxN8R"#d"#2nL:a>4>x!$okg4$DzMvʘjNMR#6a JNՉB2 e_BlKz)yӶ1Sl"7Bu8umVeEL~R99oP>bP4HhI6CB2}'tLBdM3/H vp*q*c%%a*E?q&PmtF3GUe6Ln . ksb]H3o3#dEd ;y4AU#γbQk\'$`.~23B)EDS4jэ@(I@R6Qpy@1Z9VeU[i[@`T^F>tibnFQo-V+"^0\'5`"E jQH%PP\Jtyg4d*8 0,e6Qђ[]vRvV6A = 0B[ (~.cms|^R d_gTVք"RbA  LC9aNPF`L]B)3@'ؒ4JnVZNohj#j=43$'0*1 2ЍDo>S@hQ_h_Cr[epS7HSa/2F3ff`^M4QKuKT+YL7LQ7zÃ\Zo=(I C*wWPJEXf^Eli*ykoo~уt(%RI`kXeIhc ByGw!V2WÃqKp% =ހp`GSNIR?,#PfK7!7W׆8&wq|XZmJbS`0Kpn}8#r28_#m=\c!vJT6q|sgR39)n8y9}V9/H$F!}4-uG~pS%^) +d4MT.Lv U8U0N݉TRًgՙ߹.r5aR aرvw}T`0"W~4Qՙ :R($wI\X;xxؘZ@J9YuC )0l;:g8.?rE_lhYx_ylL6jouNI9Dڤg$1K烩[t_ڡ :.55. Hi4n8h9UNhۭ:B)G48u~tTº븺,C"X}3 @iZlE=7 5@E,J2]|f֘?CO?TYκ#BK$KDbI03R)#mf-VhPDxt¾߹-K{&慬1r7^V/y" 5!f;L1|W๚,ަA\]ǯt CKf [,a;#1Xz|,7 "v44>ʵwI#h }bhz \c LYQ{lNX)#\;Ɲ¥#x<` <^/fϡzv۩(SE%#f<%A6^`[wf/u6>ܘmyy!U8#T9~/ 8[L0^& UM=2y,W5nz₠*=i"+ȜXo*/0Ѽѧ[Q@бr/e܈LI$Lդ_Ix #nǔp6VH|뽝)|ɵd4-\2L^YZ\:}Sle9]vY/KNˉv"/6AN#j V2A$,vWWݵ^y$S= 7$H0k{]n +N.Ӝn͚жۛz'f#@$BwH!ZYLM|[*hWy@])8%B EVUR0eX•?#`)W'ʩ}[mEX`UtUK #HZFEUNم1~X32m`Y~M%HgTWxpFyVVQֆ/0p iT;Wi^agJMy <b ]DA9ܚ ">MdFWauIՑTu6z懏6IJi};B #TyU[+TB ^F'-ڒeRz*ZKЁM¸貫FNZh'U11Ʊ E/m8]*-q^9U9qj;CW^"8gy<1T|*5fcj , y Dž-3ti-5B3`l"% NK"T2n6D'rR'8Oj.J3+_hFPA.,`b%A#HFbj)(N"QJL RiH2a JItkA Oۓ?U䈙JNN|٪%J ANTUQU8t8Z@"0D]%v8໖8a\ =\6)rթ'iTds# 5EO-Jm<Qióu*kBbt.*0 "H f }:sM3;d\@ i.tr[t `{ԄkZ mkNOrhoysŭ!k?,_8pB ͂paUoE9ШB-qJdEM)cE1T|h.L;U"9AkgJA 3S}R y]r&2'gN8}Fs)x#n?f߅TQrB(fGCǶdxn lD/c.K_pz8 &luhʨfH~]m$m_AWDyN&d#mLcSn[r (j]g[>6R۱ezܦ9_y&wl=3DHwm[ )}Z8Kr^X@mJ oE{`mx \Է(n4r(l缪x]J $9i-1GHŅֿ߱T coCtv7.>us;^w_ڕq gG7>?x\?$?w~wyΓ]d K<_r{kq}}{^LJg7_ԇ[O@Om|~>@H  _Baȁ!(#H%h)+Ȃ-/*'H5h79(Ђ>BXB;PDF-Create-1.43/t/99-wifi-parabola.t0000644000175000017500000001152312710676465016233 0ustar manwarmanwar#!/usr/bin/perl # # PDF::Create - Test Script # # Copyright 2010- Markus Baertschi # # Please see the CHANGES and Changes file for the detailed change log # # As example we draw a parabola which can be used to focus wifi signals # # This has not much to do with testing, but I like it, so it remains :-). # use strict; use warnings; use PDF::Create; use Test::More tests => 1; my $pdfname = $0; $pdfname =~ s/\.t/\.pdf/; my $pdf = PDF::Create->new( 'filename' => "$pdfname", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Markus Baertschi', 'Title' => 'Parabolic WiFi Antenna' ); my $root = $pdf->new_page( 'MediaBox' => $pdf->get_page_size('A4') ); # Prepare 2 fonts my $f1 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica' ); my $f2 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica-Bold' ); # Add a page which inherits its attributes from $root my $page = $root->new_page; # Write the title $page->stringc( $f2, 25, 300, 770, 'Parabolic WiFi Reflector Template' ); $page->stringc( $f1, 12, 300, 740, 'Markus Baertschi (markus@markus.org)' ); # General parameters my $dy = 310; # y offset from page origin my $ay = 280; # y amplitude my $dx = 100; # x offset from page origin my $p = 100; # distance from back to focal point $page->stringl( $f2, 10, 100, 710, 'Introduction' ); $page->stringl( $f1, 10, 100, 700, 'This template allows you to build a simple, but effective WiFi range extender. The reflector described' ); $page->stringl( $f1, 10, 100, 690, 'here will concentrate the signal of your access point in one direction. THe range in this direction will' ); $page->stringl( $f1, 10, 100, 680, 'be much better at the expense of the range in all other directions.' ); # Write instructions $page->stringl( $f2, 10, 100, 660, 'Instructions:' ); $page->stringl( $f1, 10, 100, 650, '- Make square or rectangular reflector from metallic material (Tin foil, etc)' ); $page->stringl( $f1, 10, 100, 640, '- Bend reflector to parabolic shape' ); $page->stringl( $f1, 10, 100, 630, '- Fix reflector with the antenna at the focal point' ); # Write the labels $page->stringl( $f1, 12, $dx + $p + 10, 460, 'Parabola (The reflector must be shaped like this)' ); $page->stringl( $f1, 10, $dx + $p + 30, $ay - 10, 'Focal Point (Antenna goes here)' ); # Draw the focal point my $l = 30; # Length of cross $page->line( $dx + $p - $l, $dy, $dx + $p + $l, $dy ); $page->line( $dx + $p, $dy - $l, $dx + $p, $dy + $l ); $page->newpath; $page->set_width(0.5); $page->setrgbcolorstroke( 0, 0, 0 ); $page->moveto( $dx + $p - $l / 2, $dy ); $page->curveto( $dx + $p - $l / 2, $dy + $l / 2 * 0.55, $dx + $p - $l / 2 * 0.55, $dy + $l / 2, $dx + $p, $dy + $l / 2 ); $page->curveto( $dx + $p + $l / 2 * 0.55, $dy + $l / 2, $dx + $p + $l / 2, $dy + $l / 2 * 0.55, $dx + $p + $l / 2, $dy ); $page->curveto( $dx + $p + $l / 2, $dy - $l / 2 * 0.55, $dx + $p + $l / 2 * 0.55, $dy - $l / 2, $dx + $p, $dy - $l / 2 ); $page->curveto( $dx + $p - $l / 2 * 0.55, $dy - $l / 2, $dx + $p - $l / 2, $dy - $l / 2 * 0.55, $dx + $p - $l / 2, $dy ); $page->stroke; $ay = 50; # y amplitude $dy = 100; # y offset from page origin $dx = 300; # x offset from page origin $p = 10; # distance from back to focal point $page->newpath; $page->set_width(2); $page->setrgbcolorstroke( 0.1, 0.2, 1 ); $page->moveto( $ay * $ay / ( 4 * $p ), -$ay ); for ( my $y = -$ay ; $y <= $ay ; $y = $y + 2 ) { my $x = $y * $y / ( 4 * $p ); $page->lineto( $x + $dx, $y + $dy ); } $page->stroke; my $i = 0; $page->newpath; $page->set_width(1); $page->setrgbcolorstroke( 0.1, 0.2, 1 ); $page->moveto( $ay * $ay / ( 4 * $p ), -$ay ); for ( my $y = -$ay ; $y <= $ay ; $y = $y + 2 ) { my $x = $y * $y / ( 4 * $p ); $page->lineto( $x + $dx + $i, $y + $dy ); $i++; $i++; } $page->stroke; $page->newpath; $i = 0; $page->moveto( $ay * $ay / ( 4 * $p ), -$ay ); for ( my $y = -$ay ; $y <= $ay ; $y = $y + 2 ) { my $x = $y * $y / ( 4 * $p ); $page->lineto( $x + $dx + $i, $y + $dy + $ay * 2 ); $i++; $i++; } $page->stroke; $page->line( $dx + $ay + 12, $dy - $ay, $dx + $ay + 12, $dy + $ay ); $page->line( $dx + $ay - 10, $dy - $ay + 30, $dx + $ay - 10, $dy + $ay + 30 ); $page->line( $dx + $ay * 3 + 12, $dy + $ay, $dx + $ay * 3 + 12, $dy + $ay * 3 ); $page->set_width(3); $page->line( $dx + $ay * 2, $dy, $dx + $ay * 2, $dy + $ay * 2 ); # Wrap up the PDF and close the file $pdf->close; ################################################################ # # Check the resulting pdf for errors with pdftotext # SKIP: { skip '/usr/bin/pdftotext not installed', 1 if (! -x '/usr/bin/pdftotext'); my $out = `/usr/bin/pdftotext $pdfname /dev/null 2>&1`; ok( $out eq "", "pdftotext $out"); } PDF-Create-1.43/t/04-drawing.t0000644000175000017500000000637212710676465015141 0ustar manwarmanwar#!/usr/bin/perl # # PDF::Create - Test Script # # Copyright 2010- Markus Baertschi # # Please see the CHANGES and Changes file for the detailed change log # # Testing drawing-related functions # - line, path, stroke # - color # use strict; use warnings; use PDF::Create; use Test::More tests => 21; # we want the resulting pdf file to have the same name as the test my $pdfname = $0; $pdfname =~ s/\.t/\.pdf/; ################################################################### # # start testing # my $pdf = PDF::Create->new( 'filename' => "$pdfname", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Markus Baertschi', 'Title' => 'Simple Test Document', ); ok( defined $pdf, "Create new PDF" ); ok( $pdf->add_comment("The is a PDF for testing"), "Add a comment" ); my $root = $pdf->new_page( 'MediaBox' => $pdf->get_page_size('A4') ); ok( defined $root, "Create page root" ); # Prepare font my $f1 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica' ); ok( defined $f1, "Define Font" ); # Add a page which inherits its attributes from $root my $page = $root->new_page; ok( defined $root, "Page root defined" ); # Write some text to the page $page->stringc( $f1, 40, 306, 700, 'PDF::Create' ); $page->stringc( $f1, 20, 306, 650, "version $PDF::Create::VERSION" ); $page->stringc( $f1, 20, 306, 620, "Test: $0" ); $page->stringc( $f1, 20, 306, 590, 'Markus Baertschi (markus@markus.org)' ); # Draw some graphics ok( $page->line( 100, 200, 100, 600 ), "line" ); $page->line( 100, 200, 500, 200 ); $page->line( 100, 600, 500, 600 ); $page->line( 500, 200, 500, 600 ); $page->line( 300, 200, 300, 600 ); $page->line( 100, 400, 500, 400 ); for ( my $x = 100 ; $x <= 500 ; $x = $x + 25 ) { $page->line( $x, 395, $x, 405 ); } for ( my $y = 200 ; $y <= 600 ; $y = $y + 25 ) { $page->line( 295, $y, 305, $y ); } #ok($page->newpath(),"newp0ath"); #ok($page->setrgbcolorstroke(1, 0.0, 0.0),"setrgbcolorstroke"); ok($page->setrgbcolor(0.1, 0.3, 0.8),"setrgbcolor"); ok($page->set_width(10),"setwidth"); ok($page->moveto(270,100),"moveto"); ok($page->lineto(300,160),"lineto"); ok($page->lineto(330,100),"lineto"); ok($page->lineto(270,100),"lineto"); #ok($page->closepath(),"closepath"); #ok($page->closestroke(),"stroke"); ok($page->fill(),"fill"); ok($page->stroke(),"stroke"); ok( $page->set_width(2), "set_width" ); my ( $x, $y, $x2, $y2 ); ok( $page->newpath, "newpath" ); ok( $page->setrgbcolorstroke( 0.1, 0.2, 1 ), "setrgbcolorstroke" ); ok( $page->moveto( 100, 400 ), "moveto" ); for ( $x = -3.14 ; $x <= 3.14 ; $x = $x + 0.03 ) { $y = sin($x); $y2 = 400 + int( $y * 2000 ) / 10; $x2 = 300 + int( $x * 2000 / 3.14 ) / 10; $page->lineto( $x2, $y2 ); } ok( $page->stroke, "stroke" ); # Wrap up the PDF and close the file ok( !$pdf->close(), "Close PDF" ); ################################################################ # # Check the resulting pdf for errors with pdftotext # SKIP: { skip '/usr/bin/pdftotext not installed', 1 if (! -x '/usr/bin/pdftotext'); my $out = `/usr/bin/pdftotext $pdfname /dev/null 2>&1`; ok( $out eq "", "pdftotext $out"); } # # TODO: Add test with ghostscript # #echo | gs -q -sDEVICE=bbox 06-wifi-parabola-broken.pdf PDF-Create-1.43/t/meta-json.t0000644000175000017500000000132512710676465015153 0ustar manwarmanwar#!/usr/bin/perl use 5.006; use strict; use warnings; use PDF::Create; use Test::More; eval "use Test::CPAN::Meta::JSON"; plan skip_all => "Test::CPAN::Meta::JSON required for testing MYMETA.json" if $@; my $meta = meta_spec_ok('MYMETA.json'); my $version = $PDF::Create::VERSION; is($meta->{version}, $version, 'MYMETA.json distribution version matches'); if($meta->{provides}) { for my $mod (keys %{$meta->{provides}}) { eval("use $mod;"); my $mod_version = eval(sprintf("\$%s::VERSION", $mod)); is($meta->{provides}{$mod}{version}, $version, "MYMETA.json entry [$mod] version matches"); is($mod_version, $version, "Package $mod doesn't match version."); } } done_testing(); PDF-Create-1.43/t/pod.t0000644000175000017500000000040112700523573014020 0ustar manwarmanwar#!perl -T use 5.006; use strict; use warnings FATAL => 'all'; use Test::More; # Ensure a recent version of Test::Pod my $min_tp = 1.22; eval "use Test::Pod $min_tp"; plan skip_all => "Test::Pod $min_tp required for testing POD" if $@; all_pod_files_ok(); PDF-Create-1.43/t/02-string.t0000644000175000017500000000613612710676465015010 0ustar manwarmanwar#!/usr/bin/perl # # PDF::Create - Test Script # # Copyright 2010- Markus Baertschi # # Please see the CHANGES and Changes file for the detailed change log # # Testing string functions # - string l/r/c # - string_underline # use strict; use warnings; use PDF::Create; use Test::More tests => 19; # we want the resulting pdf file to have the same name as the test my $pdfname = $0; $pdfname =~ s/\.t/\.pdf/; ################################################################### # # start testing # my $pdf = PDF::Create->new( 'filename' => "$pdfname", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Markus Baertschi', 'Title' => 'Testing String Functions', 'Debug' => 0, ); ok( defined $pdf, "Create new PDF" ); ok( $pdf->add_comment("The is a PDF for testing"), "Add a comment" ); my $root = $pdf->new_page( 'MediaBox' => $pdf->get_page_size('A4') ); ok( defined $root, "Create page root" ); # Prepare font my $f1 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica' ); ok( defined $f1, "Define Font" ); # Add a page which inherits its attributes from $root my $page = $root->new_page; ok( defined $root, "Page root defined" ); # Page title and description $page->stringc( $f1, 40, 306, 700, 'PDF::Create' ); $page->stringc( $f1, 20, 306, 650, "version $PDF::Create::VERSION" ); $page->stringc( $f1, 20, 306, 600, "Test: $0" ); $page->stringc( $f1, 20, 306, 550, 'Markus Baertschi (markus@markus.org)' ); # Use the string functions ok( $page->string( $f1, 15, 306, 380, 'Default string' ), "string" ); ok( $page->stringc( $f1, 15, 306, 360, 'Centered string (stringc)' ), "stringc" ); ok( $page->stringl( $f1, 15, 306, 340, 'Left aligned string (stringl)' ), "stringl" ); ok( $page->stringr( $f1, 15, 306, 320, 'Right aligned string (stringr)' ), "stringr" ); ok( $page->string( $f1, 15, 306, 280, 'Default string underlined' ), "string" ); ok( $page->string_underline( $f1, 15, 306, 280, 'Default string underlined' ), "string_underline" ); ok( $page->string( $f1, 15, 306, 260, 'Left string underlined', 'l' ), "string l" ); ok( $page->string_underline( $f1, 15, 306, 260, 'Left string underlined', 'l' ), "string_underline l" ); ok( $page->string( $f1, 15, 306, 240, 'Right string underlined', 'r' ), "string r" ); ok( $page->string_underline( $f1, 15, 306, 240, 'Right string underlined', 'r' ), "string_underline r" ); ok( $page->string( $f1, 15, 306, 220, 'Centered string underlined', 'c' ), "string c" ); ok( $page->string_underline( $f1, 15, 306, 220, 'Centered string underlined', 'c' ), "string_underline c" ); # Wrap up the PDF and close the file ok( !$pdf->close(), "Close PDF" ); ################################################################ # # Check the resulting pdf for errors with pdftotext # SKIP: { skip '/usr/bin/pdftotext not installed', 1 if (! -x '/usr/bin/pdftotext'); my $out = `/usr/bin/pdftotext $pdfname /dev/null 2>&1`; ok( $out eq "", "pdftotext $out"); } # # TODO: Add test with ghostscript # #echo | gs -q -sDEVICE=bbox 06-wifi-parabola-broken.pdf PDF-Create-1.43/t/05-outline.t0000644000175000017500000000602012710676465015154 0ustar manwarmanwar#!/usr/bin/perl # # PDF::Create - Test Script # # Copyright 2010- Markus Baertschi # # Please see the CHANGES and Changes file for the detailed change log # # Testing TOC/Outline # use strict; use warnings; use PDF::Create; use Test::More tests => 13; # we want the resulting pdf file to have the same name as the test my $pdfname = $0; $pdfname =~ s/\.t/\.pdf/; ################################################################### # # start testing # my $pdf = PDF::Create->new( 'filename' => "$pdfname", 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'Markus Baertschi', 'Title' => 'Simple Test Document', ); ok( defined $pdf, "Create new PDF" ); ok( $pdf->add_comment("The is a PDF for testing"), "Add a comment" ); my $root = $pdf->new_page( 'MediaBox' => $pdf->get_page_size('A4') ); ok( defined $root, "Create page root" ); # Prepare font my $f1 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica' ); ok( defined $f1, "Define Font" ); # Add a page which inherits its attributes from $root my $page = $root->new_page; ok( defined $root, "Page root defined" ); # Write some text to the page $page->stringc( $f1, 40, 306, 700, 'PDF::Create' ); $page->stringc( $f1, 20, 306, 650, "version $PDF::Create::VERSION" ); $page->stringc( $f1, 20, 306, 600, "Test: $0" ); $page->stringc( $f1, 20, 306, 550, 'Markus Baertschi (markus@markus.org)' ); # Create a Outline/TOC ok( my $out0 = $pdf->new_outline( 'Title' => 'Title page', 'Destination' => $page ), "new_outline" ); # Some more pages with outline $page = $root->new_page; $page->stringc( $f1, 40, 306, 700, 'Section 1' ); ok( my $out1 = $pdf->new_outline( 'Title' => 'Section 1', 'Destination' => $page ), "new_outline" ); $page = $root->new_page; $page->stringc( $f1, 40, 306, 700, 'Section 2' ); ok( my $out2 = $pdf->new_outline( 'Title' => 'Section 2', 'Destination' => $page ), "new_outline" ); $page = $root->new_page; $page->stringc( $f1, 40, 306, 700, 'Section 2.1' ); ok( my $out21 = $pdf->new_outline( 'Title' => 'Section 2.1', 'Destination' => $page, 'Parent' => $out2 ), "new_outline with parent" ); $page = $root->new_page; $page->stringc( $f1, 40, 306, 700, 'Section 2.2' ); ok( my $out22 = $pdf->new_outline( 'Title' => 'Section 2.2', 'Destination' => $page, 'Parent' => $out2 ), "new_outline with parent" ); $page = $root->new_page; $page->stringc( $f1, 40, 306, 700, 'Appendix' ); ok( my $app = $pdf->new_outline( 'Title' => 'Appendix', 'Destination' => $page ), "new_outline" ); # Wrap up the PDF and close the file ok( !$pdf->close(), "Close PDF" ); ################################################################ # # Check the resulting pdf for errors with pdftotext # SKIP: { skip '/usr/bin/pdftotext not installed', 1 if (! -x '/usr/bin/pdftotext'); my $out = `/usr/bin/pdftotext $pdfname /dev/null 2>&1`; ok( $out eq "", "pdftotext $out"); } # # TODO: Add test with ghostscript # #echo | gs -q -sDEVICE=bbox 06-wifi-parabola-broken.pdf PDF-Create-1.43/t/09-cgi.t0000644000175000017500000000154612710676465014253 0ustar manwarmanwar#!/usr/bin/perl # # 09-cgi.t # # cgi test script # # run the cgi-test and check the resulting output # use strict; use warnings; use File::Basename qw(dirname); use File::Spec; use PDF::Create; use Test::More tests => 2; use Config; my $pdfname = $0; $pdfname =~ s/\.t/\.pdf/; my $cginame = File::Spec->catfile(dirname($0) . "/09-cgi-script.pl"); # # run the cgi # my @out = `$Config{"perlpath"} $cginame`; #shift @out; #shift @out; #diag $out; diag $pdfname; if (open my $fh, '>', $pdfname) { print $fh @out; close $fh; } ok scalar(@out), "CGI executes"; ################################################################ # # Check the resulting pdf for errors with pdftotext # SKIP: { skip '/usr/bin/pdftotext not installed', 1 if (! -x '/usr/bin/pdftotext'); my $out = `/usr/bin/pdftotext $pdfname /dev/null 2>&1`; ok( $out eq "", "pdftotext $out"); } PDF-Create-1.43/t/changes.t0000644000175000017500000000027112700523573014653 0ustar manwarmanwar#!/usr/bin/perl use 5.006; use strict; use warnings; use Test::More; eval 'use Test::CPAN::Changes'; plan skip_all => 'Test::CPAN::Changes required for this test' if $@; changes_ok();PDF-Create-1.43/lib/0000755000175000017500000000000013161531451013355 5ustar manwarmanwarPDF-Create-1.43/lib/PDF/0000755000175000017500000000000013161531451013766 5ustar manwarmanwarPDF-Create-1.43/lib/PDF/Create.pm0000644000175000017500000015615213161526115015542 0ustar manwarmanwarpackage PDF::Create; our $VERSION = '1.43'; =head1 NAME PDF::Create - Create PDF files. =head1 VERSION Version 1.43 =cut use 5.006; use strict; use warnings; use Carp qw(confess croak cluck carp); use Data::Dumper; use FileHandle; use Scalar::Util qw(weaken); use PDF::Image::GIF; use PDF::Image::JPEG; use PDF::Create::Page; use PDF::Create::Outline; my $DEBUG = 0; =encoding utf8 =head1 DESCRIPTION C allows you to create PDF document using a number of primitives.The result is as a PDF file or stream. PDF stands for Portable Document Format. Documents can have several pages, a table of content, an information section and many other PDF elements. =head1 SYNOPSIS C provides an easy module to create PDF output from your perl script. It is designed to be easy to use and simple to install and maintain. It provides a couple of subroutines to handle text, fonts, images and drawing primitives. Simple documents are easy to create with the supplied routines. In addition to be reasonable simple C is written in pure Perl and has no external dependencies (libraries, other modules, etc.). It should run on any platform where perl is available. For complex stuff some understanding of the underlying Postscript/PDF format is necessary. In this case it might be better go with the more complete L modules to gain more features at the expense of a steeper learning curve. Example PDF creation with C (see L for details of methods available on a page): use strict; use warnings; use PDF::Create; my $pdf = PDF::Create->new( 'filename' => 'sample.pdf', 'Author' => 'John Doe', 'Title' => 'Sample PDF', 'CreationDate' => [ localtime ] ); # Add a A4 sized page my $root = $pdf->new_page('MediaBox' => $pdf->get_page_size('A4')); # Add a page which inherits its attributes from $root my $page1 = $root->new_page; # Prepare a font my $font = $pdf->font('BaseFont' => 'Helvetica'); # Prepare a Table of Content my $toc = $pdf->new_outline('Title' => 'Title Page', 'Destination' => $page1); # Write some text $page1->stringc($font, 40, 306, 426, 'PDF::Create'); $page1->stringc($font, 20, 306, 396, "version $PDF::Create::VERSION"); $page1->stringc($font, 20, 306, 300, 'by John Doe '); # Add another page my $page2 = $root->new_page; # Draw some lines $page2->line(0, 0, 592, 840); $page2->line(0, 840, 592, 0); $toc->new_outline('Title' => 'Second Page', 'Destination' => $page2); # Close the file and write the PDF $pdf->close; =head1 CONSTRUCTOR The method C create a new pdf structure for your PDF. It returns an object handle which can be used to add more stuff to the PDF. The parameter keys to the constructor are detailed as below: +--------------+------------------------------------------------------------+ | Key | Description | +--------------+------------------------------------------------------------+ | | | | filename | Destination file that will contain resulting PDF or '-' for| | | stdout. If neither filename or fh are specified, the | | | content will be stored in memory and returned when calling | | | close(). | | | | | fh | Already opened filehandle that will contain resulting PDF. | | | See comment above regarding close(). | | | | | Version | PDF Version to claim, can be 1.0 to 1.3 (default: 1. | | | | | PageMode | How the document should appear when opened.Possible values | | | UseNone (Default), UseOutlines, UseThumbs and FullScreen | | | | | Author | The name of the person who created this document. | | | | | Creator | If the document was converted into a PDF document from | | | another form, this is the name of the application that | | | created the document. | | | | | Title | The title of the document. | | | | | Subject | The subject of the document. | | | | | Keywords | Keywords associated with the document. | | | | | CreationDate | The date the document was created.This is passed as an | | | anonymous array in the same format as localtime returns. | | | | | Debug | The debug level, defaults to 0. It can be any positive | | | integers. | | | | +--------------+------------------------------------------------------------+ Example: my $pdf = PDF::Create->new( 'filename' => 'sample.pdf', 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'John Doe', 'Title' => 'My Title', 'CreationDate' => [ localtime ] ); If you are writing a CGI you can send your PDF on the fly to stdout / directly to the browser using '-' as filename. CGI Example: use CGI; use PDF::Create; print CGI::header(-type => 'application/x-pdf', -attachment => 'sample.pdf'); my $pdf = PDF::Create->new( 'filename' => '-', 'Author' => 'John Doe', 'Title' => 'My title', 'CreationDate' => [ localtime ] ); =cut sub new { my ($this, %params) = @_; # validate constructor keys my %valid_constructor_keys = ( 'fh' => 1, 'filename' => 1, 'Version' => 1, 'PageMode' => 1, 'Author' => 1, 'Creator' => 1, 'Title' => 1, 'Subject' => 1, 'Keywords' => 1, 'Debug' => 1, 'CreationDate' => 1, ); foreach (keys %params) { croak "Invalid constructor key '$_' received." unless (exists $valid_constructor_keys{$_}); } if (exists $params{PageMode} && defined $params{PageMode}) { # validate PageMode key value my %valid_page_mode_values = ( 'UseNone' => 1, 'UseOutlines' => 1, 'UseThumbs' => 1, 'FullScreen' => 1); croak "Invalid value for key 'PageMode' received '". $params{PageMode} . "'" unless (exists $valid_page_mode_values{$params{PageMode}}); } if (exists $params{Debug} && defined $params{Debug}) { # validate Debug key value croak "Invalid value for key 'Debug' received '". $params{Debug} . "'" unless (($params{Debug} =~ /^\d+$/) && ($params{Debug} >= 0)); } my $class = ref($this) || $this; my $self = {}; bless $self, $class; $self->{'data'} = ''; $self->{'version'} = $params{'Version'} || "1.2"; $self->{'trailer'} = {}; $self->{'pages'} = PDF::Create::Page->new(); $self->{'current_page'} = $self->{'pages'}; # circular reference $self->{'pages'}->{'pdf'} = $self; weaken $self->{pages}{pdf}; $self->{'page_count'} = 0; $self->{'outline_count'} = 0; # cross-reference table start address $self->{'crossreftblstartaddr'} = 0; $self->{'generation_number'} = 0; $self->{'object_number'} = 0; if ( defined $params{'fh'} ) { $self->{'fh'} = $params{'fh'}; } elsif ( defined $params{'filename'} ) { $self->{'filename'} = $params{'filename'}; my $fh = FileHandle->new( "> $self->{'filename'}" ); carp "PDF::Create.pm: $self->{'filename'}: $!\n" unless defined $fh; binmode $fh; $self->{'fh'} = $fh; } $self->{'catalog'} = {}; $self->{'catalog'}{'PageMode'} = $params{'PageMode'} if defined $params{'PageMode'}; # Header: add version $self->add_version; # Info $self->{'Author'} = $params{'Author'} if defined $params{'Author'}; $self->{'Creator'} = $params{'Creator'} if defined $params{'Creator'}; $self->{'Title'} = $params{'Title'} if defined $params{'Title'}; $self->{'Subject'} = $params{'Subject'} if defined $params{'Subject'}; $self->{'Keywords'} = $params{'Keywords'} if defined $params{'Keywords'}; # TODO: Default creation date from system date if ( defined $params{'CreationDate'} ) { $self->{'CreationDate'} = sprintf "D:%4u%0.2u%0.2u%0.2u%0.2u%0.2u", $params{'CreationDate'}->[5] + 1900, $params{'CreationDate'}->[4] + 1, $params{'CreationDate'}->[3], $params{'CreationDate'}->[2], $params{'CreationDate'}->[1], $params{'CreationDate'}->[0]; } if ( defined $params{'Debug'} ) { $DEBUG = $params{'Debug'}; # Enable stack trace for PDF::Create internal routines $Carp::Internal{ ('PDF::Create') }++; } debug( 1, "Debugging level $DEBUG" ); return $self; } =head1 METHODS =head2 new_page(%params) Add a page to the document using the given parameters. C must be called first to initialize a root page, used as model for further pages.Returns a handle to the newly created page. Parameters can be: +-----------+---------------------------------------------------------------+ | Key | Description | +-----------+---------------------------------------------------------------+ | | | | Parent | The parent of this page in the pages tree.This is page object.| | | | | Resources | Resources required by this page. | | | | | MediaBox | Rectangle specifying the natural size of the page,for example | | | the dimensions of an A4 sheet of paper. The coordinates are | | | measured in default user space units It must be the reference | | | of 4 values array.You can use C to get to get | | | the size of standard paper sizes.C knows about | | | A0-A6, A4L (landscape), Letter, Legal, Broadsheet, Ledger, | | | Tabloid, Executive and 36x36. | | CropBox | Rectangle specifying the default clipping region for the page | | | when displayed or printed. The default is the value of the | | | MediaBox. | | | | | ArtBox | Rectangle specifying an area of the page to be used when | | | placing PDF content into another application. The default is | | | the value of the CropBox. [PDF 1.3] | | | | | TrimBox | Rectangle specifying the intended finished size of the page | | | (for example, the dimensions of an A4 sheet of paper).In some | | | cases,the MediaBox will be a larger rectangle, which includes | | | printing instructions, cut marks or other content.The default | | | is the value of the CropBox. [PDF 1.3]. | | | | | BleedBox | Rectangle specifying the region to which all page content | | | should be clipped if the page is being output in a production | | | environment. In such environments, a bleed area is desired, | | | to accommodate physical limitations of cutting, folding, and | | | trimming equipment. The actual printed page may include | | | printer's marks that fall outside the bleed box. The default | | | is the value of the CropBox.[PDF 1.3] | | | | | Rotate | Specifies the number of degrees the page should be rotated | | | clockwise when it is displayed or printed. This value must be | | | zero (the default) or a multiple of 90. The entire page, | | | including contents is rotated. | | | | +-----------+---------------------------------------------------------------+ Example: my $a4 = $pdf->new_page( 'MediaBox' => $pdf->get_page_size('A4') ); my $page1 = $a4->new_page; $page1->string($f1, 20, 306, 396, "some text on page 1"); my $page2 = $a4->new_page; $page2->string($f1, 20, 306, 396, "some text on page 2"); =cut sub new_page { my ($self, %params) = @_; my %valid_new_page_parameters = map { $_ => 1 } (qw/Parent Resources MediaBox CropBox ArtBox TrimBox BleedBox Rotate/); foreach my $key (keys %params) { croak "PDF::Create.pm - new_page(): Received invalid key [$key]" unless (exists $valid_new_page_parameters{$key}); } my $parent = $params{'Parent'} || $self->{'pages'}; my $name = "Page " . ++$self->{'page_count'}; my $page = $parent->add( $self->reserve( $name, "Page" ), $name ); $page->{'resources'} = $params{'Resources'} if defined $params{'Resources'}; $page->{'mediabox'} = $params{'MediaBox'} if defined $params{'MediaBox'}; $page->{'cropbox'} = $params{'CropBox'} if defined $params{'CropBox'}; $page->{'artbox'} = $params{'ArtBox'} if defined $params{'ArtBox'}; $page->{'trimbox'} = $params{'TrimBox'} if defined $params{'TrimBox'}; $page->{'bleedbox'} = $params{'BleedBox'} if defined $params{'BleedBox'}; $page->{'rotate'} = $params{'Rotate'} if defined $params{'Rotate'}; $self->{'current_page'} = $page; $page; } =head2 font(%params) Prepare a font using the given arguments. This font will be added to the document only if it is used at least once before the close method is called.Parameters are listed below: +----------+----------------------------------------------------------------+ | Key | Description | +----------+----------------------------------------------------------------+ | Subtype | Type of font. PDF defines some types of fonts. It must be one | | | of the predefined type Type1, Type3, TrueType or Type0.In this | | | version, only Type1 is supported. This is the default value. | | | | | Encoding | Specifies the encoding from which the new encoding differs. | | | It must be one of the predefined encodings MacRomanEncoding, | | | MacExpertEncoding or WinAnsiEncoding. In this version, only | | | WinAnsiEncoding is supported. This is the default value. | | | | | BaseFont | The PostScript name of the font. It can be one of the following| | | base fonts: Courier, Courier-Bold, Courier-BoldOblique, | | | Courier-Oblique, Helvetica, Helvetica-Bold, | | | Helvetica-BoldOblique, Helvetica-Oblique, Times-Roman, | | | Times-Bold, Times-Italic, Times-BoldItalic or Symbol. | +----------+----------------------------------------------------------------+ The ZapfDingbats font is not supported in this version.Default font is Helvetica. my $f1 = $pdf->font('BaseFont' => 'Helvetica'); =cut sub font { my ($self, %params) = @_; my %valid_font_parameters = ( 'Subtype' => { map { $_ => 1 } qw/Type0 Type1 Type3 TrueType/ }, 'Encoding' => { map { $_ => 1 } qw/MacRomanEncoding MacExpertEncoding WinAnsiEncoding Symbol/ }, 'BaseFont' => { map { $_ => 1 } qw/Courier Courier-Bold Courier-BoldOblique Courier-Oblique Helvetica Helvetica-Bold Helvetica-BoldOblique Helvetica-Oblique Times-Roman Times-Bold Times-Italic Times-BoldItalic Symbol/ }, ); foreach my $key (keys %params) { croak "PDF::Create.pm - font(): Received invalid key [$key]" unless (exists $valid_font_parameters{$key}); my $value = $params{$key}; croak "PDF::Create.pm - font(): Received invalid value [$value] for key [$key]" if (defined $value && !(exists $valid_font_parameters{$key}->{$value})); } my $num = 1 + scalar keys %{ $self->{'fonts'} }; $self->{'fonts'}{$num} = { 'Subtype' => $self->name( $params{'Subtype'} || 'Type1' ), 'Encoding' => $self->name( $params{'Encoding'} || 'WinAnsiEncoding' ), 'BaseFont' => $self->name( $params{'BaseFont'} || 'Helvetica' ), 'Name' => $self->name("F$num"), 'Type' => $self->name("Font"), }; $num; } =head2 new_outline(%params) Adds an outline to the document using the given parameters. Return the newly created outline. Parameters can be: +-------------+-------------------------------------------------------------+ | Key | Description | +-------------+-------------------------------------------------------------+ | | | | Title | The title of the outline. Mandatory. | | | | | Destination | The Destination of this outline item. In this version,it is | | | only possible to give a page as destination. The default | | | destination is the current page. | | | | | Parent | The parent of this outline in the outlines tree. This is an | | | outline object. This way you represent the tree of your | | | outlines. | | | | +-------------+-------------------------------------------------------------+ Example: my $outline = $pdf->new_outline('Title' => 'Item 1'); $pdf->new_outline('Title' => 'Item 1.1', 'Parent' => $outline); $pdf->new_outline('Title' => 'Item 1.2', 'Parent' => $outline); $pdf->new_outline('Title' => 'Item 2'); =cut sub new_outline { my ($self, %params) = @_; croak "PDF::Create - new_outline(): Missing required key [Title]." unless (exists $params{'Title'}); croak "PDF::Create - new_outline(): Required key [Title] undefined." unless (defined $params{'Title'}); if (defined $params{Destination}) { croak "PDF::Create - new_outline(): Invalid value for key [Destination]." unless (ref($params{Destination}) eq 'PDF::Create::Page'); } if (defined $params{Parent}) { croak "PDF::Create - new_outline(): Invalid value for key [Parent]." unless (ref($params{Parent}) eq 'PDF::Create::Outline'); } unless ( defined $self->{'outlines'} ) { $self->{'outlines'} = PDF::Create::Outline->new(); # circular reference $self->{'outlines'}->{'pdf'} = $self; weaken $self->{'outlines'}->{'pdf'}; $self->{'outlines'}->{'Status'} = 'opened'; } my $parent = $params{'Parent'} || $self->{'outlines'}; my $name = "Outline " . ++$self->{'outline_count'}; $params{'Destination'} = $self->{'current_page'} unless defined $params{'Destination'}; my $outline = $parent->add( $self->reserve( $name, "Outline" ), $name, %params ); $outline; } =head2 get_page_size($name) Returns the size of standard paper used for MediaBox-parameter of C. C has one optional parameter to specify the paper name. Possible values are a0-a6, a4l,letter,broadsheet,ledger,tabloid,legal,executive and 36x36. Default is a4. my $root = $pdf->new_page( 'MediaBox' => $pdf->get_page_size('A4') ); =cut sub get_page_size { my ($self, $name) = @_; my %pagesizes = ( 'A0' => [ 0, 0, 2380, 3368 ], 'A1' => [ 0, 0, 1684, 2380 ], 'A2' => [ 0, 0, 1190, 1684 ], 'A3' => [ 0, 0, 842, 1190 ], 'A4' => [ 0, 0, 595, 842 ], 'A4L' => [ 0, 0, 842, 595 ], 'A5' => [ 0, 0, 421, 595 ], 'A6' => [ 0, 0, 297, 421 ], 'LETTER' => [ 0, 0, 612, 792 ], 'BROADSHEET' => [ 0, 0, 1296, 1584 ], 'LEDGER' => [ 0, 0, 1224, 792 ], 'TABLOID' => [ 0, 0, 792, 1224 ], 'LEGAL' => [ 0, 0, 612, 1008 ], 'EXECUTIVE' => [ 0, 0, 522, 756 ], '36X36' => [ 0, 0, 2592, 2592 ], ); if (defined $name) { $name = uc($name); # validate page size croak "Invalid page size name '$name' received." unless (exists $pagesizes{$name}); } else { $name = 'A4'; } return $pagesizes{$name}; } =head2 version($number) Set and return version number. Valid version numbers are 1.0, 1.1, 1.2 and 1.3. =cut sub version { my ($self, $v) = @_; if (defined $v) { croak "ERROR: Invalid version number $v received.\n" unless ($v =~ /^1\.[0,1,2,3]$/); $self->{'version'} = $v; } $self->{'version'}; } =head2 close(%params) Close does the work of creating the PDF data from the objects collected before. You must call C after you have added all the contents as most of the real work building the PDF is performed there. If omit calling close you get no PDF output. Returns the raw content of the PDF. If C was provided when creating object of C then it does not try to close the file handle. It is, therefore, advised you call C rather than C. =cut sub close { my ($self, %params) = @_; debug( 2, "Closing PDF" ); my $raw_data = $self->flush; if (defined $self->{'fh'} && defined $self->{'filename'}) { $self->{'fh'}->close; } return $raw_data; } =head2 flush() Generate the PDF content and returns the raw content as it is. =cut sub flush { my ($self) = @_; debug( 2, "Flushing PDF" ); $self->page_stream; $self->add_outlines if defined $self->{'outlines'}; $self->add_catalog; $self->add_pages; $self->add_info; $self->add_crossrefsection; $self->add_trailer; return $self->{data}; } =head2 reserve($name, $type) Reserve the next object number for the given object type. =cut sub reserve { my ($self, $name, $type) = @_;; $type = $name unless defined $type; confess "Error: an object has already been reserved using this name '$name' " if defined $self->{'reservations'}{$name}; $self->{'object_number'}++; debug( 2, "reserve(): name=$name type=$type number=$self->{'object_number'} generation=$self->{'generation_number'}" ); $self->{'reservations'}{$name} = [ $self->{'object_number'}, $self->{'generation_number'}, $type ]; # Annotations added here by Gary Lieberman. # # Store the Object ID and the Generation Number for later use when we write # out the /Page object. if ($type eq 'Annotation') { $self->{'Annots'}{ $self->{'object_number'} } = $self->{'generation_number'}; } [ $self->{'object_number'}, $self->{'generation_number'} ]; } =head2 add_comment($message) Add comment to the document.The string will show up in the PDF as postscript-style comment: % this is a postscript comment =cut sub add_comment { my ($self, $comment) = @_; $comment = '' unless defined $comment; debug( 2, "add_comment(): $comment" ); $self->add( "%" . $comment ); $self->cr; } =head2 annotation(%params) Adds an annotation object, for the time being we only do the 'Link' - 'URI' kind This is a sensitive area in the PDF document where text annotations are shown or links launched. C only supports URI links at this time. URI links have two components,the text or graphics object and the area where the mouseclick should occur. For the object to be clicked on you'll use standard text of drawing methods. To define the click-sensitive area and the destination URI. Example: # Draw a string and undeline it to show it is a link $pdf->string($f1, 10, 450, 200, 'http://www.cpan.org'); my $line = $pdf->string_underline($f1, 10, 450, 200, 'http://www.cpan.org'); # Create the hot area with the link to open on click $pdf->annotation( Subtype => 'Link', URI => 'http://www.cpan.org', x => 450, y => 200, w => $l, h => 15, Border => [0,0,0] ); The point (x, y) is the bottom left corner of the rectangle containing hotspot rectangle, (w, h) are the width and height of the hotspot rectangle. The Border describes the thickness of the border surrounding the rectangle hotspot. The function C returns the width of the string, this can be used directly for the width of the hotspot rectangle. =cut sub annotation { my ($self, %params) = @_; debug( 2, "annotation(): Subtype=$params{'Subtype'}" ); if ( $params{'Subtype'} eq 'Link' ) { confess "Must specify 'URI' for Link" unless defined $params{'URI'}; confess "Must specify 'x' for Link" unless defined $params{'x'}; confess "Must specify 'y' for Link" unless defined $params{'y'}; confess "Must specify 'w' for Link" unless defined $params{'w'}; confess "Must specify 'h' for Link" unless defined $params{'h'}; my $num = 1 + scalar keys %{ $self->{'annotations'} }; my $action = { 'Type' => $self->name('Action'), 'S' => $self->name('URI'), 'URI' => $self->string( $params{'URI'} ), }; my $x2 = $params{'x'} + $params{'w'}; my $y2 = $params{'y'} + $params{'h'}; $self->{'annotations'}{$num} = { 'Subtype' => $self->name('Link'), 'Rect' => $self->verbatim( sprintf "[%f %f %f %f]", $params{'x'}, $params{'y'}, $x2, $y2 ), 'A' => $self->dictionary(%$action), }; if ( defined $params{'Border'} ) { $self->{'annotations'}{$num}{'Border'} = $self->verbatim( sprintf "[%f %f %f]", $params{'Border'}[0], $params{'Border'}[1], $params{'Border'}[2] ); } $self->{'annot'}{$num}{'page_name'} = "Page " . $self->{'page_count'}; debug( 2, "annotation(): annotation number: $num, page name: $self->{'annot'}{$num}{'page_name'}" ); 1; } else { confess "Only Annotations with Subtype 'Link' are supported for now\n"; } } =head2 image($filename) Prepare an XObject (image) using the given arguments. This image will be added to the document if it is referenced at least once before the close method is called. In this version GIF,interlaced GIF and JPEG is supported. Usage of interlaced GIFs are slower because they are decompressed, modified and compressed again. The gif support is limited to images with a LZW minimum code size of 8. Small images with few colors can have a smaller minimum code size and will not work. If you get errors regarding JPEG compression, then the compression method used in your JPEG file is not supported by C. Try resaving the JPEG file with different compression options (for example, disable progressive compression). Example: my $img = $pdf->image('image.jpg'); $page->image( image => $img, xscale => 0.25, # scale image for better quality yscale => 0.25, xpos => 50, ypos => 60, xalign => 0, yalign => 2, ); =cut sub image { my ($self, $filename) = @_; my $num = 1 + scalar keys %{ $self->{'xobjects'} }; my $image; my $colorspace; my @a; if ( $filename =~ /\.gif$/i ) { $self->{'images'}{$num} = PDF::Image::GIF->new(); } elsif ( $filename =~ /\.jpg$/i || $filename =~ /\.jpeg$/i ) { $self->{'images'}{$num} = PDF::Image::JPEG->new(); } $image = $self->{'images'}{$num}; if ( !$image->Open($filename) ) { print $image->{error} . "\n"; return 0; } $self->{'xobjects'}{$num} = { 'Subtype' => $self->name('Image'), 'Name' => $self->name("Image$num"), 'Type' => $self->name('XObject'), 'Width' => $self->number( $image->{width} ), 'Height' => $self->number( $image->{height} ), 'BitsPerComponent' => $self->number( $image->{bpc} ), 'Data' => $image->ReadData(), 'Length' => $self->number( $image->{imagesize} ), }; # Indexed colorspace? if ($image->{colorspacesize}) { $colorspace = $self->reserve("ImageColorSpace$num"); $self->{'xobjects_colorspace'}{$num} = { 'Data' => $image->{colorspacedata}, 'Length' => $self->number( $image->{colorspacesize} ), }; $self->{'xobjects'}{$num}->{'ColorSpace'} = $self->array( $self->name('Indexed'), $self->name( $image->{colorspace} ), $self->number(255), $self->indirect_ref(@$colorspace) ); } else { $self->{'xobjects'}{$num}->{'ColorSpace'} = $self->array( $self->name( $image->{colorspace} ) ); } # Set Filter $#a = -1; foreach my $s ( @{ $image->{filter} } ) { push @a, $self->name($s); } if ( $#a >= 0 ) { $self->{'xobjects'}{$num}->{'Filter'} = $self->array(@a); } # Set additional DecodeParms $#a = -1; foreach my $s ( keys %{ $image->{decodeparms} } ) { push @a, $s; push @a, $self->number( $image->{decodeparms}{$s} ); } $self->{'xobjects'}{$num}->{'DecodeParms'} = $self->array( $self->dictionary(@a) ); # Transparent? if ( $image->{transparent} ) { $self->{'xobjects'}{$num}->{'Mask'} = $self->array( $self->number( $image->{mask} ), $self->number( $image->{mask} ) ); } return { 'num' => $num, 'width' => $image->{width}, 'height' => $image->{height} }; } sub add_outlines { my ($self, %params) = @_; debug( 2, "add_outlines" ); my $outlines = $self->reserve("Outlines"); my ($First, $Last); my @list = $self->{'outlines'}->list; my $i = -1; for my $outline (@list) { $i++; my $name = $outline->{'name'}; $First = $outline->{'id'} unless defined $First; $Last = $outline->{'id'}; my $content = { 'Title' => $self->string( $outline->{'Title'} ) }; if ( defined $outline->{'Kids'} && scalar @{ $outline->{'Kids'} } ) { my $t = $outline->{'Kids'}; $$content{'First'} = $self->indirect_ref( @{ $$t[0]->{'id'} } ); $$content{'Last'} = $self->indirect_ref( @{ $$t[$#$t]->{'id'} } ); } my $brothers = $outline->{'Parent'}->{'Kids'}; my $j = -1; for my $brother (@$brothers) { $j++; last if $brother == $outline; } $$content{'Next'} = $self->indirect_ref( @{ $$brothers[ $j + 1 ]->{'id'} } ) if $j < $#$brothers; $$content{'Prev'} = $self->indirect_ref( @{ $$brothers[ $j - 1 ]->{'id'} } ) if $j; $outline->{'Parent'}->{'id'} = $outlines unless defined $outline->{'Parent'}->{'id'}; $$content{'Parent'} = $self->indirect_ref( @{ $outline->{'Parent'}->{'id'} } ); $$content{'Dest'} = $self->array( $self->indirect_ref( @{ $outline->{'Dest'}->{'id'} } ), $self->name('Fit'), $self->null, $self->null, $self->null ); my $count = $outline->count; $$content{'Count'} = $self->number($count) if $count; my $t = $self->add_object( $self->indirect_obj( $self->dictionary(%$content), $name ) ); $self->cr; } # Type (required) my $content = { 'Type' => $self->name('Outlines') }; # Count my $count = $self->{'outlines'}->count; $$content{'Count'} = $self->number($count) if $count; $$content{'First'} = $self->indirect_ref(@$First); $$content{'Last'} = $self->indirect_ref(@$Last); $self->add_object( $self->indirect_obj( $self->dictionary(%$content) ) ); $self->cr; } sub add_pages { my ($self) = @_; debug( 2, "add_pages():" ); # Type (required) my $content = { 'Type' => $self->name('Pages') }; # Kids (required) my $t = $self->{'pages'}->kids; confess "Error: document MUST contains at least one page. Abort." unless scalar @$t; my $kids = []; map { push @$kids, $self->indirect_ref(@$_) } @$t; $$content{'Kids'} = $self->array(@$kids); $$content{'Count'} = $self->number( $self->{'pages'}->count ); $self->add_object( $self->indirect_obj( $self->dictionary(%$content) ) ); $self->cr; for my $font ( sort keys %{ $self->{'fonts'} } ) { debug( 2, "add_pages(): font: $font" ); $self->{'fontobj'}{$font} = $self->reserve('Font'); $self->add_object( $self->indirect_obj( $self->dictionary( %{ $self->{'fonts'}{$font} } ), 'Font' ) ); $self->cr; } for my $xobject (sort keys %{$self->{'xobjects'}}) { debug( 2, "add_pages(): xobject: $xobject" ); $self->{'xobj'}{$xobject} = $self->reserve('XObject'); $self->add_object( $self->indirect_obj( $self->stream( %{ $self->{'xobjects'}{$xobject} } ), 'XObject' ) ); $self->cr; if ( defined $self->{'reservations'}{"ImageColorSpace$xobject"}) { $self->add_object( $self->indirect_obj( $self->stream( %{ $self->{'xobjects_colorspace'}{$xobject} } ), "ImageColorSpace$xobject" ) ); $self->cr; } } for my $annotation (sort keys %{$self->{'annotations'}}) { $self->{'annot'}{$annotation}{'object_info'} = $self->reserve('Annotation'); $self->add_object( $self->indirect_obj( $self->dictionary( %{ $self->{'annotations'}{$annotation} } ), 'Annotation' ) ); $self->cr; } for my $page ($self->{'pages'}->list) { my $name = $page->{'name'}; debug( 2, "add_pages: page: $name" ); my $type = 'Page' . ( defined $page->{'Kids'} && scalar @{ $page->{'Kids'} } ? 's' : '' ); # Type (required) my $content = { 'Type' => $self->name($type) }; # Resources (required, may be inherited). See page 195. my $resources = {}; for my $k ( keys %{ $page->{'resources'} } ) { my $v = $page->{'resources'}{$k}; ( $k eq 'ProcSet' ) && do { my $l = []; if ( ref($v) eq 'ARRAY' ) { map { push @$l, $self->name($_) } @$v; } else { push @$l, $self->name($v); } $$resources{'ProcSet'} = $self->array(@$l); } || ( $k eq 'fonts' ) && do { my $l = {}; map { $$l{"F$_"} = $self->indirect_ref( @{ $self->{'fontobj'}{$_} } ); } keys %{ $page->{'resources'}{'fonts'} }; $$resources{'Font'} = $self->dictionary(%$l); } || ( $k eq 'xobjects' ) && do { my $l = {}; map { $$l{"Image$_"} = $self->indirect_ref( @{ $self->{'xobj'}{$_} } ); } keys %{ $page->{'resources'}{'xobjects'} }; $$resources{'XObject'} = $self->dictionary(%$l); }; } if ( defined( $$resources{'Annotation'} ) ) { my $r = $self->add_object( $self->indirect_obj( $self->dictionary(%$resources) ) ); $self->cr; $$content{'Resources'} = [ 'ref', [ $$r[0], $$r[1] ] ]; } if ( defined( $$resources{'XObject'} ) ) { my $r = $self->add_object( $self->indirect_obj( $self->dictionary(%$resources) ) ); $self->cr; $$content{'Resources'} = [ 'ref', [ $$r[0], $$r[1] ] ]; } else { $$content{'Resources'} = $self->dictionary(%$resources) if scalar keys %$resources; } for my $K ( 'MediaBox', 'CropBox', 'ArtBox', 'TrimBox', 'BleedBox' ) { my $k = lc $K; if ( defined $page->{$k} ) { my $l = []; map { push @$l, $self->number($_) } @{ $page->{$k} }; $$content{$K} = $self->array(@$l); } } $$content{'Rotate'} = $self->number( $page->{'rotate'} ) if defined $page->{'rotate'}; if ( $type eq 'Page' ) { $$content{'Parent'} = $self->indirect_ref( @{ $page->{'Parent'}{'id'} } ); # Content if ( defined $page->{'contents'} ) { my $contents = []; map { push @$contents, $self->indirect_ref(@$_); } @{ $page->{'contents'} }; $$content{'Contents'} = $self->array(@$contents); } # Annotations added here by Gary Lieberman # # Tell the /Page object that annotations need to be drawn. if ( defined $self->{'annot'} ) { my $Annots = '[ '; my $is_annots = 0; foreach my $annot_number ( keys %{ $self->{'annot'} } ) { next if ( $self->{'annot'}{$annot_number}{'page_name'} ne $name ); $is_annots = 1; debug( 2, sprintf "annotation number: $annot_number, page name: $self->{'annot'}{$annot_number}{'page_name'}" ); my $object_number = $self->{'annot'}{$annot_number}{'object_info'}[0]; my $generation_number = $self->{'annot'}{$annot_number}{'object_info'}[1]; debug( 2, sprintf "object_number: $object_number, generation_number: $generation_number" ); $Annots .= sprintf( "%s %s R ", $object_number, $generation_number ); } $$content{'Annots'} = $self->verbatim( $Annots . ']' ) if ($is_annots); } } else { my $kids = []; map { push @$kids, $self->indirect_ref(@$_) } @{ $page->kids }; $$content{'Kids'} = $self->array(@$kids); $$content{'Parent'} = $self->indirect_ref( @{ $page->{'Parent'}{'id'} } ) if defined $page->{'Parent'}; $$content{'Count'} = $self->number( $page->count ); } $self->add_object( $self->indirect_obj( $self->dictionary(%$content), $name ) ); $self->cr; } } sub add_crossrefsection { my ($self) = @_; debug( 2, "add_crossrefsection():" ); # ::= # xref # + $self->{'crossrefstartpoint'} = $self->position; $self->add('xref'); $self->cr; confess "Fatal error: should contains at least one cross reference subsection." unless defined $self->{'crossrefsubsection'}; for my $subsection ( sort keys %{ $self->{'crossrefsubsection'} } ) { $self->add_crossrefsubsection($subsection); } } sub add_crossrefsubsection { my ($self, $subsection) = @_; debug( 2, "add_crossrefsubsection():" ); # ::= # # # + # # ::= | # # ::= n # # ::= # | # | # # ::= # # f $self->add( 0, ' ', 1 + scalar @{ $self->{'crossrefsubsection'}{$subsection} } ); $self->cr; $self->add( sprintf "%010d %05d %s ", 0, 65535, 'f' ); $self->cr; for my $entry ( sort { $$a[0] <=> $$b[0] } @{ $self->{'crossrefsubsection'}{$subsection} } ) { $self->add( sprintf "%010d %05d %s ", $$entry[1], $subsection, $$entry[2] ? 'n' : 'f' ); # printf "%010d %010x %05d n\n", $$entry[1], $$entry[1], $subsection; $self->cr; } } sub add_trailer { my $self = shift; debug( 2, "add_trailer():" ); # ::= trailer # << # + # >> # startxref # # %%EOF my @keys = ( 'Size', # integer (required) 'Prev', # integer (req only if more than one cross-ref section) 'Root', # dictionary (required) 'Info', # dictionary (optional) 'ID', # array (optional) (PDF 1.1) 'Encrypt' # dictionary (req if encrypted) (PDF 1.1) ); # TODO: should check for required fields $self->add('trailer'); $self->cr; $self->add('<<'); $self->cr; $self->{'trailer'}{'Size'} = 1; map { $self->{'trailer'}{'Size'} += scalar @{ $self->{'crossrefsubsection'}{$_} } } keys %{ $self->{'crossrefsubsection'} }; $self->{'trailer'}{'Root'} = &encode( @{ $self->indirect_ref( @{ $self->{'catalog'} } ) } ); $self->{'trailer'}{'Info'} = &encode( @{ $self->indirect_ref( @{ $self->{'info'} } ) } ) if defined $self->{'info'}; for my $k (@keys) { next unless defined $self->{'trailer'}{$k}; $self->add( "/$k ", ref $self->{'trailer'}{$k} eq 'ARRAY' ? join( ' ', @{ $self->{'trailer'}{$k} } ) : $self->{'trailer'}{$k} ); $self->cr; } $self->add('>>'); $self->cr; $self->add('startxref'); $self->cr; $self->add( $self->{'crossrefstartpoint'} ); $self->cr; $self->add('%%EOF'); $self->cr; } sub cr { my ($self) = @_; debug( 3, "cr():" ); $self->add( &encode('cr') ); } sub page_stream { my ($self, $page) = @_; debug( 2, "page_stream():" ); if (defined $self->{'reservations'}{'stream_length'}) { ## If it is the same page, use the same stream. $self->cr, return if defined $page && defined $self->{'stream_page'} && $page == $self->{'current_page'} && $self->{'stream_page'} == $page; # Remember the position my $len = $self->position - $self->{'stream_pos'} + 1; # Close the stream and the object $self->cr; $self->add('endstream'); $self->cr; $self->add('endobj'); $self->cr; $self->cr; # Add the length $self->add_object( $self->indirect_obj( $self->number($len), 'stream_length' ) ); $self->cr; } # open a new stream if needed if (defined $page) { # get an object id for the stream my $obj = $self->reserve('stream'); # release it delete $self->{'reservations'}{'stream'}; # get another one for the length of this stream my $stream_length = $self->reserve('stream_length'); push @$stream_length, 'R'; push @{ $page->{'contents'} }, $obj; # write the beginning of the object push @{ $self->{'crossrefsubsection'}{ $$obj[1] } }, [ $$obj[0], $self->position, 1 ]; $self->add("$$obj[0] $$obj[1] obj"); $self->cr; $self->add('<<'); $self->cr; $self->add( '/Length ', join( ' ', @$stream_length ) ); $self->cr; $self->add('>>'); $self->cr; $self->add('stream'); $self->cr; $self->{'stream_pos'} = $self->position; $self->{'stream_page'} = $page; } } =head2 get_data() If you did not ask the $pdf object to write its output to a file, you can pick up the pdf code by calling this method. It returns a big string. You need to call C first. =cut sub get_data { shift->{'data'}; } sub uses_font { my ($self, $page, $font) = @_; $page->{'resources'}{'fonts'}{$font} = 1; $page->{'resources'}{'ProcSet'} = [ 'PDF', 'Text' ]; $self->{'fontobj'}{$font} = 1; } sub uses_xobject { my ($self, $page, $xobject) = @_; $page->{'resources'}{'xobjects'}{$xobject} = 1; $page->{'resources'}{'ProcSet'} = [ 'PDF', 'Text' ]; $self->{'xobj'}{$xobject} = 1; } sub debug { my ($level, $msg) = @_; return unless ( $DEBUG >= $level ); my $s = scalar @_ ? sprintf $msg, @_ : $msg; warn "DEBUG ($level): $s\n"; } sub add { my $self = shift; my $data = join '', @_; $self->{'size'} += length $data; if ( defined $self->{'fh'} ) { my $fh = $self->{'fh'}; print $fh $data; } else { $self->{'data'} .= $data; } } sub position { my ($self) = @_; $self->{'size'}; } sub add_version { my ($self) = @_; debug( 2, "add_version(): $self->{'version'}" ); $self->add( "%PDF-" . $self->{'version'} ); $self->cr; } sub add_object { my ($self, $v) = @_; my $val = &encode(@$v); $self->add($val); $self->cr; debug( 3, "add_object(): $v -> $val" ); [ $$v[1][0], $$v[1][1] ]; } sub null { my ($self) = @_;; [ 'null', 'null' ]; } sub boolean { my ($self, $val) = @_; [ 'boolean', $val ]; } sub number { my ($self, $val) = @_;; [ 'number', $val ]; } sub name { my ($self, $val) = @_; [ 'name', $val ]; } sub string { my ($self, $val) = @_; [ 'string', $val ]; } sub verbatim { my ($self, $val) = @_; [ 'verbatim', $val ]; } sub array { my $self = shift; [ 'array', [@_] ]; } sub dictionary { my $self = shift; [ 'dictionary', {@_} ]; } sub indirect_obj { my $self = shift; my ($id, $gen, $type, $name); $name = $_[1]; $type = $_[0][1]{'Type'}[1] if defined $_[0][1] && ref $_[0][1] eq 'HASH' && defined $_[0][1]{'Type'}; if ( defined $name && defined $self->{'reservations'}{$name} ) { ( $id, $gen ) = @{ $self->{'reservations'}{$name} }; delete $self->{'reservations'}{$name}; } elsif ( defined $type && defined $self->{'reservations'}{$type} ) { ( $id, $gen ) = @{ $self->{'reservations'}{$type} }; delete $self->{'reservations'}{$type}; } else { $id = ++$self->{'object_number'}; $gen = $self->{'generation_number'}; } debug( 3, "indirect_obj(): " . $self->position ); push @{ $self->{'crossrefsubsection'}{$gen} }, [ $id, $self->position, 1 ]; [ 'object', [ $id, $gen, @_ ] ]; } sub indirect_ref { my $self = shift; [ 'ref', [@_] ]; } sub stream { my $self = shift; [ 'stream', {@_} ]; } sub add_info { my $self = shift; debug( 2, "add_info():" ); my %params = @_; $params{'Author'} = $self->{'Author'} if defined $self->{'Author'}; $params{'Creator'} = $self->{'Creator'} if defined $self->{'Creator'}; $params{'Title'} = $self->{'Title'} if defined $self->{'Title'}; $params{'Subject'} = $self->{'Subject'} if defined $self->{'Subject'}; $params{'Keywords'} = $self->{'Keywords'} if defined $self->{'Keywords'}; $params{'CreationDate'} = $self->{'CreationDate'} if defined $self->{'CreationDate'}; $self->{'info'} = $self->reserve('Info'); my $content = { 'Producer' => $self->string("PDF::Create version $VERSION"), 'Type' => $self->name('Info') }; $$content{'Author'} = $self->string( $params{'Author'} ) if defined $params{'Author'}; $$content{'Creator'} = $self->string( $params{'Creator'} ) if defined $params{'Creator'}; $$content{'Title'} = $self->string( $params{'Title'} ) if defined $params{'Title'}; $$content{'Subject'} = $self->string( $params{'Subject'} ) if defined $params{'Subject'}; $$content{'Keywords'} = $self->string( $params{'Keywords'} ) if defined $params{'Keywords'}; $$content{'CreationDate'} = $self->string( $params{'CreationDate'} ) if defined $params{'CreationDate'}; $self->add_object( $self->indirect_obj( $self->dictionary(%$content) ), 'Info' ); $self->cr; } sub add_catalog { my $self = shift; debug( 2, "add_catalog" ); my %params = %{ $self->{'catalog'} }; # Type (mandatory) $self->{'catalog'} = $self->reserve('Catalog'); my $content = { 'Type' => $self->name('Catalog') }; # Pages (mandatory) [indirected reference] my $pages = $self->reserve('Pages'); $$content{'Pages'} = $self->indirect_ref(@$pages); $self->{'pages'}{'id'} = $$content{'Pages'}[1]; # Outlines [indirected reference] $$content{'Outlines'} = $self->indirect_ref( @{ $self->{'outlines'}->{'id'} } ) if defined $self->{'outlines'}; # PageMode $$content{'PageMode'} = $self->name($params{'PageMode'}) if defined $params{'PageMode'}; $self->add_object( $self->indirect_obj( $self->dictionary(%$content) ) ); $self->cr; } sub encode { my ($type, $val) = @_; if ($val) { debug( 4, "encode(): $type $val" ); } else { debug( 4, "encode(): $type (no val)" ); } if (!$type) { cluck "PDF::Create::encode: empty argument, called by "; return 1; } ( $type eq 'null' || $type eq 'number' ) && do { 1; # do nothing } || $type eq 'cr' && do { $val = "\n"; } || $type eq 'boolean' && do { $val = $val eq 'true' ? $val : $val eq 'false' ? $val : $val eq '0' ? 'false' : 'true'; } || $type eq 'verbatim' && do { $val = "$val"; } || $type eq 'string' && do { $val = '' if not defined $val; # TODO: split it. Quote parentheses. $val = "($val)"; } || $type eq 'number' && do { $val = "$val"; } || $type eq 'name' && do { $val = '' if not defined $val; $val = "/$val"; } || $type eq 'array' && do { # array, encode contents individually my $s = '['; for my $v (@$val) { $s .= &encode( $$v[0], $$v[1] ) . " "; } # remove the trailing space chop $s; $val = $s . "]"; } || $type eq 'dictionary' && do { my $s = '<<' . &encode('cr'); for my $v ( keys %$val ) { $s .= &encode( 'name', $v ) . " "; $s .= &encode( ${ $$val{$v} }[0], ${ $$val{$v} }[1] ); # . " "; $s .= &encode('cr'); } $val = $s . ">>"; } || $type eq 'object' && do { my $s = &encode( 'number', $$val[0] ) . " " . &encode( 'number', $$val[1] ) . " obj"; $s .= &encode('cr'); $s .= &encode( $$val[2][0], $$val[2][1] ); # . " "; $s .= &encode('cr'); $val = $s . "endobj"; } || $type eq 'ref' && do { my $s = &encode( 'number', $$val[0] ) . " " . &encode( 'number', $$val[1] ) . " R"; $val = $s; } || $type eq 'stream' && do { my $data = delete $$val{'Data'}; my $s = '<<' . &encode('cr'); for my $v ( keys %$val ) { $s .= &encode( 'name', $v ) . " "; $s .= &encode( ${ $$val{$v} }[0], ${ $$val{$v} }[1] ); # . " "; $s .= &encode('cr'); } $s .= ">>" . &encode('cr') . "stream" . &encode('cr'); $s .= $data . &encode('cr'); $val = $s . "endstream" . &encode('cr'); } || confess "Error: unknown type '$type'"; # TODO: add type 'text'; $val; } =head1 LIMITATIONS C comes with a couple of limitations or known caveats: =head2 PDF Size / Memory Unless using a filehandle, C assembles the entire PDF in memory. If you create very large documents on a machine with a small amount of memory your program can fail because it runs out of memory. If using a filehandle, data will be written immediately to the filehandle after each method. =head2 Small GIF images Some gif images get created with a minimal lzw code size of less than 8. C can not decode those and they must be converted. =head1 SUPPORT I support C in my spare time between work and family, so the amount of work I put in is limited. If you experience a problem make sure you are at the latest version first many of things have already been fixed. Please register bug at the CPAN bug tracking system at L or send email to C Be sure to include the following information: =over 4 =item - PDF::Create Version you are running =item - Perl version (perl -v) =item - Operating System vendor and version =item - Details about your operating environment that might be related to the issue being described =item - Exact cut and pasted error or warning messages =item - The shortest, clearest code you can manage to write which reproduces the bug described. =back I appreciate patches against the latest released version of C which fix the bug. B can be submitted like bugs. If you provide patch for a feature which does not go against the C philosophy (keep it simple) then you have a good chance for it to be accepted. =head1 SEE ALSO L L Routines to produce formatted pages of mailing labels in PDF, uses L internally. L Perl interface to Haru Free PDF Library. L PDF creation from a one-file module, similar to L. L Yet another PDF creation module L A wrapper written for L. =head1 AUTHORS Fabien Tassin GIF and JPEG-support: Michael Gross (info@mdgrosse.net) Maintenance since 2007: Markus Baertschi (markus@markus.org) Currently maintained by Mohammad S Anwar (MANWAR) C<< >> =head1 REPOSITORY L =head1 COPYRIGHT Copyright 1999-2001,Fabien Tassin.All rights reserved.It may be used and modified freely, but I do request that this copyright notice remain attached to the file. You may modify this module as you wish,but if you redistribute a modified version , please attach a note listing the modifications you have made. Copyright 2007 Markus Baertschi Copyright 2010 Gary Lieberman =head1 LICENSE This is free software; you can redistribute it and / or modify it under the same terms as Perl 5.6.0. =cut 1; PDF-Create-1.43/lib/PDF/Create/0000755000175000017500000000000013161531451015171 5ustar manwarmanwarPDF-Create-1.43/lib/PDF/Create/Outline.pm0000644000175000017500000000376413161526161017162 0ustar manwarmanwar# # PDF::Create::Outline - PDF outline support for PDF::Create # # Author: Fabien Tassin # # Copyright 1999-2001 Fabien Tassin # Copyright 2007 Markus Baertschi # Copyright 2010 Gary Lieberman # # Please see the CHANGES and Changes file for the detailed change log # # Please do not use any of the methods here directly. You will be # punished with your application no longer working after an upgrade ! # package PDF::Create::Outline; use 5.006; use strict; use warnings; use Carp; use FileHandle; use Data::Dumper; use Scalar::Util qw(weaken); our $VERSION = '1.43'; our $DEBUG = 0; sub new { my $this = shift; my $class = ref($this) || $this; my $self = {}; bless $self, $class; $self->{'Kids'} = []; $self; } sub add { my $self = shift; my $outline = PDF::Create::Outline->new(); $outline->{'id'} = shift; $outline->{'name'} = shift; $outline->{'Parent'} = $self; weaken $outline->{Parent}; $outline->{'pdf'} = $self->{'pdf'}; weaken $outline->{pdf}; my %params = @_; $outline->{'Title'} = $params{'Title'} if defined $params{'Title'}; $outline->{'Action'} = $params{'Action'} if defined $params{'Action'}; $outline->{'Status'} = defined $params{'Status'} && ( $params{'Status'} eq 'closed' || !$params{'Status'} ) ? 0 : 1; $outline->{'Dest'} = $params{'Destination'} if defined $params{'Destination'}; push @{ $self->{'Kids'} }, $outline; $outline; } sub count { my $self = shift; my $c = scalar @{ $self->{'Kids'} }; return $c unless $c; for my $outline ( @{ $self->{'Kids'} } ) { my $v = $outline->count; $c += $v if $outline->{'Status'}; } $c *= -1 unless $self->{'Status'}; $c; } sub kids { my $self = shift; my $t = []; map { push @$t, $_->{'id'} } @{ $self->{'Kids'} }; $t; } sub list { my $self = shift; my @l; for my $e ( @{ $self->{'Kids'} } ) { my @t = $e->list; push @l, $e; push @l, @t if scalar @t; } @l; } sub new_outline { my $self = shift; $self->{'pdf'}->new_outline( 'Parent' => $self, @_ ); } 1; PDF-Create-1.43/lib/PDF/Create/Page.pm0000644000175000017500000006406313161526141016414 0ustar manwarmanwarpackage PDF::Create::Page; our $VERSION = '1.43'; =encoding utf8 =head1 NAME PDF::Create::Page - PDF pages tree for PDF::Create =head1 VERSION Version 1.43 =cut use 5.006; use strict; use warnings; use Carp; use FileHandle; use Data::Dumper; use POSIX qw(setlocale LC_NUMERIC); use Scalar::Util qw(weaken); use PDF::Font; our $DEBUG = 0; our $DEFAULT_FONT_WIDTH = 1000; my $font_widths = &init_widths; # Global variable for text function my $ptext = ''; =head1 DESCRIPTION B =cut sub new { my ($this) = @_; my $class = ref($this) || $this; my $self = {}; bless $self, $class; $self->{'Kids'} = []; $self->{'Content'} = []; return $self; } =head1 METHODS =head2 add($id, $name) Adds a page to the PDF document. =cut sub add { my ($self, $id, $name) = @_; my $page = PDF::Create::Page->new(); $page->{'pdf'} = $self->{'pdf'}; weaken $page->{pdf}; $page->{'Parent'} = $self; weaken $page->{Parent}; $page->{'id'} = $id; $page->{'name'} = $name; push @{$self->{'Kids'}}, $page; return $page; } =head2 count() Returns page count. =cut sub count { my ($self) = @_; my $c = 0; $c++ unless scalar @{$self->{'Kids'}}; foreach my $page (@{$self->{'Kids'}}) { $c += $page->count; } return $c; } =head2 kids() Returns ref to a list of page ids. =cut sub kids { my ($self) = @_; my $t = []; map { push @$t, $_->{'id'} } @{$self->{'Kids'}}; return $t; } =head2 list() Returns page list. =cut sub list { my ($self) = @_; my @l; foreach my $e (@{$self->{'Kids'}}) { my @t = $e->list; push @l, $e; push @l, @t if scalar @t; } return @l; } =head2 new_page() Return new page. =cut sub new_page { my ($self, @params) = @_; return $self->{'pdf'}->new_page('Parent' => $self, @params); } # # # Drawing functions =head2 moveto($x, $y) Moves the current point to (x, y), omitting any connecting line segment. =cut sub moveto { my ($self, $x, $y) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("$x $y m"); } =head2 lineto($x, $y) Appends a straight line segment from the current point to (x, y). =cut sub lineto { my ($self, $x, $y) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("$x $y l"); } =head2 curveto($x1, $y1, $x2, $y2, $x3, $y3) Appends a Bezier curve to the path. The curve extends from the current point to (x3 ,y3) using (x1 ,y1) and (x2 ,y2) as the Bezier control points.The new current point is (x3 ,y3). =cut sub curveto { my ($self, $x1, $y1, $x2, $y2, $x3, $y3) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("$x1 $y1 $x2 $y2 $x3 $y3 c"); } =head2 rectangle($x, $y, $w, $h) Adds a rectangle to the current path. =cut sub rectangle { my ($self, $x, $y, $w, $h) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("$x $y $w $h re"); } =head2 closepath() Closes the current subpath by appending a straight line segment from the current point to the starting point of the subpath. =cut sub closepath { my ($self) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("h"); } =head2 newpath() Ends the path without filling or stroking it. =cut sub newpath { my ($self) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("n"); } =head2 stroke() Strokes the path. =cut sub stroke { my ($self) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("S"); } =head2 closestroke() Closes and strokes the path. =cut sub closestroke { my ($self) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("s"); } =head2 fill() Fills the path using the non-zero winding number rule. =cut sub fill { my ($self) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("f"); } =head2 fill2() Fills the path using the even-odd rule. =cut sub fill2 { my ($self) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("f*"); } =head2 line($x1, $y1, $x2, $y2) Draw a line between ($x1, $y1) and ($x2, $y2). Combined moveto / lineto / stroke command. =cut sub line { my ($self, $x1, $y1, $x2, $y2) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("$x1 $y1 m $x2 $y2 l S"); } =head2 set_width($w) Set the width of subsequent lines to C points. =cut sub set_width { my ($self, $w) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("$w w"); } # # # Color functions =head2 setgray($value) Sets the color space to DeviceGray and sets the gray tint to use for filling paths. =cut sub setgray { my ($self, $val) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("$val g"); } =head2 setgraystroke($value) Sets the color space to DeviceGray and sets the gray tint to use for stroking paths. =cut sub setgraystroke { my ($self, $val) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("$val G"); } =head2 setrgbcolor($r, $g, $b) Sets the fill colors used for normal text or filled objects. =cut sub setrgbcolor { my ($self, $r, $g, $b) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("$r $g $b rg"); } =head2 setrgbcolorstroke($r, $g, $b) Set the color of the subsequent drawing operations. Valid r, g, and b values are each between 0.0 and 1.0, inclusive. Each color ranges from 0.0 to 1.0, i.e., darkest red (0.0) to brightest red(1.0). The same holds for green and blue. These three colors mix additively to produce the colors between black (0.0, 0.0, 0.0) and white (1.0, 1.0, 1.0). PDF distinguishes between the stroke and fill operations and provides separate color settings for each. =cut sub setrgbcolorstroke { my ($self, $r, $g, $b) = @_; croak "Error setting colors, need three values" if !defined $b; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add("$r $g $b RG"); } # # # Text functions =head2 text(%params) Renders the text. Parameters are explained as below: +--------+------------------------------------------------------------------+ | Key | Description | +--------+------------------------------------------------------------------+ | start | The start marker, add directive BT | | end | The end marker, add directive ET | | text | Text to add to the pdf | | F | Font index to be used, add directive /F | | Tf | Font size for the text, add directive Tf | | Ts | Text rise (super/subscript), add directive Ts | | Tr | Text rendering mode, add directive Tr | | TL | Text leading, add directive TL | | Tc | Character spacing, add directive Tc | | Tw | Word spacing, add directive Tw | | Tz | Horizontal scaling, add directive Tz | | Td | Move to, add directive Td | | TD | Move to and set TL, add directive TD | | rot | Move to and rotate ( ), add directive | | | , , , , , Tm | | T* | Add new line. | +--------+------------------------------------------------------------------+ =cut sub text { my ($self, %params) = @_; PDF::Create::debug( 2, "text(%params):" ); my @directives = (); if (defined $params{'start'}) { push @directives, "BT"; } # Font index if (defined $params{'F'}) { push @directives, "/F$params{'F'}"; $self->{'pdf'}->uses_font($self, $params{'F'}); } # Font size if (defined $params{'Tf'}) { push @directives, "$params{'Tf'} Tf"; } # Text Rise (Super/Subscript) if (defined $params{'Ts'}) { push @directives, "$params{'Ts'} Ts"; } # Rendering Mode if (defined $params{'Tr'}) { push @directives, "$params{'Tr'} Tr"; } # Text Leading if (defined $params{'TL'}) { push @directives, "$params{'TL'} TL"; } # Character spacing if (defined $params{'Tc'}) { push @directives, "$params{'Tc'} Tc"; } # Word Spacing if (defined $params{'Tw'}) { push @directives, "$params{'Tw'} Tw"; } else { push @directives, "0 Tw"; } # Horizontal Scaling if (defined $params{'Tz'}) { push @directives, "$params{'Tz'} Tz"; } # Moveto if (defined $params{'Td'}) { push @directives, "$params{'Td'} Td"; } # Moveto and set TL if (defined $params{'TD'}) { push @directives, "$params{'TD'} TD"; } # Moveto and rotateOA my $pi = atan2(1, 1) * 4; my $piover180 = $pi / 180; if (defined $params{'rot'}) { my ($r, $x, $y) = split( /\s+/, $params{'rot'}, 3 ); $x = 0 unless ($x > 0); $y = 0 unless ($y > 0); my $cos = cos($r * $piover180); my $sin = sin($r * $piover180); push @directives, sprintf("%.5f %.5f -%.5f %.5f %s %s Tm", $cos, $sin, $sin, $cos, $x, $y); } # New line if (defined $params{'T*'}) { push @directives, "T*"; } if (defined $params{'text'}) { $params{'text'} =~ s|([()])|\\$1|g; push @directives, "($params{'text'}) Tj"; } if (defined $params{'end'}) { push @directives, "ET"; $ptext = join(' ', @directives); $self->{'pdf'}->page_stream($self); $self->{'pdf'}->add($ptext); } PDF::Create::debug( 3, "text(): $ptext" ); 1; } =head2 string($font, $size, $x, $y, $text $alignment) Add text to the current page using the font object at the given size and position. The point (x, y) is the bottom left corner of the rectangle containing the text. The optional alignment can be 'r' for right-alignment and 'c' for centered. Example : my $f1 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica' ); $page->string($f1, 20, 306, 396, "some text"); =cut sub string { my ($self, $font, $size, $x, $y, $string, $align, $char_spacing, $word_spacing) = @_; $align = 'L' unless defined $align; if (uc($align) eq "R") { $x -= $size * $self->string_width($font, $string); } elsif (uc($align) eq "C") { $x -= $size * $self->string_width($font, $string) / 2; } my @directives = ( 'BT', "/F$font", "$size Tf", ); if (defined $char_spacing && $char_spacing =~ m/[0-9]+\.?[0-9]*/) { push @directives, sprintf("%s Tc", $char_spacing); } if (defined $word_spacing && $word_spacing =~ m/[0-9]+\.?[0-9]*/) { push @directives, sprintf("%s Tw", $word_spacing); } $string =~ s|([()])|\\$1|g; push @directives, "$x $y Td", "($string) Tj", 'ET'; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->uses_font($self, $font); $self->{'pdf'}->add(join(' ', @directives)); } =head2 string_underline($font, $size, $x, $y, $text, $alignment) Draw a line for underlining.The parameters are the same as for the string function but only the line is drawn. To draw an underlined string you must call both,string and string_underline. To change the color of your text use the C. It returns the length of the string. So its return value can be used directly for the bounding box of an annotation. Example : $page->string($f1, 20, 306, 396, "some underlined text"); $page->string_underline($f1, 20, 306, 396, "some underlined text"); =cut sub string_underline { my ($self, $font, $size, $x, $y, $string, $align) = @_; $align = 'L' unless defined $align; my $len1 = $self->string_width($font, $string) * $size; my $len2 = $len1 / 2; if (uc($align) eq "R") { $self->line($x - $len1, $y - 1, $x, $y - 1); } elsif (uc($align) eq "C") { $self->line($x - $len2, $y - 1, $x + $len2, $y - 1); } else { $self->line($x, $y - 1, $x + $len1, $y - 1); } return $len1; } =head2 stringl($font, $size, $x, $y $text) Same as C. =cut sub stringl { my ($self, $font, $size, $x, $y, $string) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->uses_font($self, $font); $string =~ s|([()])|\\$1|g; $self->{'pdf'}->add("BT /F$font $size Tf $x $y Td ($string) Tj ET"); } =head2 stringr($font, $size, $x, $y, $text) Same as C but right aligned (alignment 'r'). =cut sub stringr { my ($self, $font, $size, $x, $y, $string) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->uses_font($self, $font); $x -= $size * $self->string_width($font, $string); $string =~ s|([()])|\\$1|g; $self->{'pdf'}->add(" BT /F$font $size Tf $x $y Td ($string) Tj ET"); } =head2 stringc($font, $size, $x, $y, $text) Same as C but centered (alignment 'c'). =cut sub stringc { my ($self, $font, $size, $x, $y, $string) = @_; $self->{'pdf'}->page_stream($self); $self->{'pdf'}->uses_font($self, $font); $x -= $size * $self->string_width($font, $string) / 2; $string =~ s|([()])|\\$1|g; $self->{'pdf'}->add(" BT /F$font $size Tf $x $y Td ($string) Tj ET"); } =head2 string_width($font, $text) Return the size of the text using the given font in default user space units.This does not contain the size of the font yet, to get the length you must multiply by the font size. =cut sub string_width { my ($self, $font, $string) = @_; croak 'No string given' unless defined $string; my $fname = $self->{'pdf'}{'fonts'}{$font}{'BaseFont'}[1]; croak('Unknown font: ' . $fname) unless defined $$font_widths{$fname}[ ord "M" ]; my $w = 0; for my $c ( split '', $string ) { $w += $$font_widths{$fname}[ ord $c ] || $DEFAULT_FONT_WIDTH; } return $w / 1000; } =head2 printnl($text, $font, $size, $x, $y) Similar to C but parses the string for newline and prints each part on a separate line. Lines spacing is the same as the font-size.Returns the number of lines. Note the different parameter sequence.The first call should specify all parameters, font is the absolute minimum, a warning will be given for the missing y position and 800 will be assumed. All subsequent invocations can omit all but the string parameters. ATTENTION:There is no provision for changing pages.If you run out of space on the current page this will draw the string(s) outside the page and it will be invisible. =cut sub printnl { my ($self, $s, $font, $size, $x, $y) = @_; $self->{'current_font'} = $font if defined $font; croak 'No font found !' if !defined $self->{'current_font'}; # set up current_x/y used in stringml $self->{'current_y'} = $y if defined $y; carp 'No starting position given, using 800' if !defined $self->{'current_y'}; $self->{'current_y'} = 800 if !defined $self->{'current_y'}; $self->{'current_x'} = $x if defined $x; $self->{'current_x'} = 20 if !defined $self->{'current_x'}; $self->{'current_size'} = $size if defined $size; $self->{'current_size'} = 12 if !defined $self->{'current_size'}; # print the line(s) my $n = 0; for my $line ( split '\n', $s ) { $n++; $self->string($self->{'current_font'}, $self->{'current_size'}, $self->{'current_x'}, $self->{'current_y'}, $line); $self->{'current_y'} = $self->{'current_y'} - $self->{'current_size'}; } return $n; } =head2 block_text(\%params) Add block of text to the page. Parameters are explained as below: +------------+--------------------------------------------------------------+ | Key | Description | +------------+--------------------------------------------------------------+ | page | Object of type PDF::Create::Page | | font | Font index to be used. | | text | Text block to be used. | | font_size | Font size for the text. | | text_color | Text color as arrayref i.e. [r, g, b] | | line_width | Line width (in points) | | start_y | First row number (in points) when adding new page. | | end_y | Last row number (in points) when to add new page. | | x | x co-ordinate to start the text. | | y | y co-ordinate to start the text. | +------------+--------------------------------------------------------------+ use strict; use warnings; use PDF::Create; my $pdf = PDF::Create->new('filename'=>"$0.pdf", 'Author'=>'MANWAR', 'Title'=>'Create::PDF'); my $root = $pdf->new_page('MediaBox' => $pdf->get_page_size('A4')); my $page = $root->new_page; my $font = $pdf->font('BaseFont' => 'Helvetica'); $page->rectangle(30, 780, 535, 40); $page->setrgbcolor(0,1,0); $page->fill; $page->setrgbcolorstroke(1,0,0); $page->line(30, 778, 565, 778); $page->setrgbcolor(0,0,1); $page->string($font, 15, 102, 792, 'MANWAR - PDF::Create'); my $text = qq{ Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into ele-It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions }; $page->block_text({ page => $page, font => $font, text => $text, font_size => 6, text_color => [0,0,1], line_width => 535, start_y => 780, end_y => 60, 'x' => 30, 'y' => 770, }); $pdf->close; =cut sub block_text { my ($self, $params) = @_; croak "ERROR: parameters to method block_text() should be hashref.\n" unless (defined $params && (ref($params) eq 'HASH')); my $page = $params->{page}; my $font = $params->{font}; my $text = $params->{text}; my $font_size = $params->{font_size}; my $text_color = $params->{text_color}; my $line_width = $params->{line_width}; my $start_y = $params->{start_y} || 0; my $end_y = $params->{end_y} || 0; my $x = $params->{x}; my $y = $params->{y}; my $one_space = $page->string_width($font, ' ') * $font_size; my $para_space_factor = 1.5; $para_space_factor = $params->{para_space_factor} if (exists $params->{para_space_factor} && defined $params->{para_space_factor}); my @lines = (); foreach my $block (split /\n/, $text) { my @words = split(/ /, $block); my $para_last_line = 0; while (@words) { my $num_words = 1; my $string_width = 0; my $space_width = undef; while (1) { $string_width = $font_size * $page->string_width( $font, _get_text(\@words, $num_words)); # Shorter, try one more word if ($string_width + $one_space < $line_width) { if (scalar(@words) > $num_words) { $num_words++; next; } } last if ($num_words == 1); # Longer, chop a word off, then space accordingly $para_last_line = scalar(@words) == $num_words; if ($string_width + $one_space > $line_width || $para_last_line) { unless ($para_last_line) { $num_words--; } $string_width = $font_size * $page->string_width( $font, _get_text(\@words, $num_words)); $space_width = ($line_width - $string_width) / $num_words; last; } } my %text_param = ( start => 1, Tw => $space_width, F => $font, Tf => $font_size, Td => "$x $y", text => _get_text(\@words, $num_words), end => 1, ); if ($para_last_line) { delete $text_param{Tw}; } $page->text(%text_param); if ($y <= $end_y) { $y = $start_y; $page = $page->{'Parent'}->new_page(); $page->setrgbcolor(@$text_color); } else { $y -= int($font_size * $para_space_factor); if ($para_last_line) { $y -= int($font_size * $para_space_factor); } } splice(@words, 0, $num_words); } } } =head2 image(%params) Inserts an image. Parameters can be: +----------------+----------------------------------------------------------+ | Key | Description | +----------------+----------------------------------------------------------+ | | | | image | Image id returned by PDF::image (required). | | | | | xpos, ypos | Position of image (required). | | | | | xalign, yalign | Alignment of image.0 is left/bottom, 1 is centered and 2 | | | is right, top. | | | | | xscale, yscale | Scaling of image. 1.0 is original size. | | | | | rotate | Rotation of image.0 is no rotation,2*pi is 360° rotation.| | | | | xskew, yskew | Skew of image. | | | | +----------------+----------------------------------------------------------+ Example jpeg image: # include a jpeg image with scaling to 20% size my $jpg = $pdf->image("image.jpg"); $page->image( 'image' => $jpg, 'xscale' => 0.2, 'yscale' => 0.2, 'xpos' => 350, 'ypos' => 400 ); =cut sub image { my ($self, %params) = @_; # Switch to the 'C' locale, we need printf floats with a '.', not a ',' my $savedLocale = setlocale(LC_NUMERIC); setlocale(LC_NUMERIC,'C'); my $img = $params{'image'} || "1.2"; my $image = $img->{num}; my $xpos = $params{'xpos'} || 0; my $ypos = $params{'ypos'} || 0; my $xalign = $params{'xalign'} || 0; my $yalign = $params{'yalign'} || 0; my $xscale = $params{'xscale'} || 1; my $yscale = $params{'yscale'} || 1; my $rotate = $params{'rotate'} || 0; my $xskew = $params{'xskew'} || 0; my $yskew = $params{'yskew'} || 0; $xscale *= $img->{width}; $yscale *= $img->{height}; if ($xalign == 1) { $xpos -= $xscale / 2; } elsif ($xalign == 2) { $xpos -= $xscale; } if ($yalign == 1) { $ypos -= $yscale / 2; } elsif ($yalign == 2) { $ypos -= $yscale; } $self->{'pdf'}->page_stream($self); $self->{'pdf'}->uses_xobject( $self, $image ); $self->{'pdf'}->add("q\n"); # TODO: image: Merge position with rotate $self->{'pdf'}->add("1 0 0 1 $xpos $ypos cm\n") if ($xpos || $ypos); if ($rotate) { my $sinth = sin($rotate); my $costh = cos($rotate); $self->{'pdf'}->add("$costh $sinth -$sinth $costh 0 0 cm\n"); } if ($xscale || $yscale) { $self->{'pdf'}->add("$xscale 0 0 $yscale 0 0 cm\n"); } if ($xskew || $yskew) { my $tana = sin($xskew) / cos($xskew); my $tanb = sin($yskew) / cos($xskew); $self->{'pdf'}->add("1 $tana $tanb 1 0 0 cm\n"); } $self->{'pdf'}->add("/Image$image Do\n"); $self->{'pdf'}->add("Q\n"); # Switch to the 'C' locale, we need printf floats with a '.', not a ',' setlocale(LC_NUMERIC,$savedLocale); } # Table with font widths for the supported fonts. sub init_widths { my $font_widths = {}; foreach my $name (keys %{$PDF::Font::SUPPORTED_FONTS}) { $font_widths->{$name} = PDF::Font->new($name)->char_width; } return $font_widths; } # # # PRIVATE METHODS sub _get_text ($$) { my ($words, $num_words) = @_; if (scalar @$words < $num_words) { die @_ }; return join(' ', map { $$words[$_] } (0..($num_words-1))); } =head1 AUTHORS Fabien Tassin GIF and JPEG-support: Michael Gross (info@mdgrosse.net) Maintenance since 2007: Markus Baertschi (markus@markus.org) Currently maintained by Mohammad S Anwar (MANWAR) C<< >> =head1 REPOSITORY L =head1 COPYRIGHT Copyright 1999-2001,Fabien Tassin.All rights reserved.It may be used and modified freely, but I do request that this copyright notice remain attached to the file. You may modify this module as you wish,but if you redistribute a modified version, please attach a note listing the modifications you have made. Copyright 2007 Markus Baertschi Copyright 2010 Gary Lieberman =head1 LICENSE This is free software; you can redistribute it and / or modify it under the same terms as Perl 5.6.0. =cut 1; PDF-Create-1.43/lib/PDF/Font.pm0000644000175000017500000006540313161526207015245 0ustar manwarmanwarpackage PDF::Font; our $VERSION = '1.43'; =head1 NAME PDF::Font - Base font class for PDF::Create. =head1 VERSION Version 1.43 =cut use 5.006; use strict; use warnings; use utf8; use Carp qw(croak); use Data::Dumper; use JSON; use File::Share ':all'; =encoding utf8 =head1 DESCRIPTION Base font class to support font families approved by L. This is used in the method C inside the package L. =head1 SYNOPSIS use strict; use warnings; use PDF::Font; my $font = PDF::Font->new('Helvetica'); my $char_widths = $font->char_width; print "Character width: ", $font->get_char_width(ord('A')), "\n"; print "Character name: ", $font->get_char_name(ord('A')) , "\n"; =head1 CONSTRUCTOR Expects C as the only parameter. It can be one of the following names: =over 4 =item * Courier =item * Courier-Bold =item * Courier-BoldOblique =item * Courier-Oblique =item * Helvetica =item * Helvetica-Bold =item * Helvetica-BoldOblique =item * Helvetica-Oblique =item * Times-Bold =item * Times-BoldItalic =item * Times-Italic =item * Times-Roman =item * Symbol =back =cut our $DEBUG = 0; our $SUPPORTED_FONTS = { 'Courier' => 1, 'Courier-Bold' => 1, 'Courier-BoldOblique' => 1, 'Courier-Oblique' => 1, 'Helvetica' => 1, 'Helvetica-Bold' => 1, 'Helvetica-BoldOblique' => 1, 'Helvetica-Oblique' => 1, 'Times-Bold' => 1, 'Times-BoldItalic' => 1, 'Times-Italic' => 1, 'Times-Roman' => 1, 'Symbol' => 1, }; sub new { my ($class, $font_name) = @_; croak "Missing font name." unless defined $font_name; croak "Invalid font name [$font_name]." unless (exists $SUPPORTED_FONTS->{$font_name}); my $self = { debug => $DEBUG, font_name => $font_name }; bless $self, $class; $self->{char_width} = $self->_generate_char_width; $self->{charset} = $self->_generate_charset; return $self; } =head1 METHODS =head2 char_width() Returns arrayref of all characters width (0..255). =cut sub char_width { my ($self) = @_; return $self->{char_width}; } =head2 get_char_width($codepoint) Returns the character width for the given C<$codepoint>. =cut sub get_char_width { my ($self, $codepoint) = @_; croak "Invalid codepoint [$codepoint] received." unless (exists $self->{charset}->{$codepoint}); return $self->{charset}->{$codepoint}->{char_width}; } =head2 get_char_name($codepoint) Returns the character name for the given C<$codepoint>. =cut sub get_char_name { my ($self, $codepoint) = @_; croak "Invalid codepoint [$codepoint] received." unless (exists $self->{charset}->{$codepoint}); return $self->{charset}->{$codepoint}->{name}; } # # # PRIVATE METHODS sub _generate_char_width { my ($self) = @_; my $name = sprintf("%s.json", lc($self->{font_name})); my $file = dist_file('PDF-Create', $name); my $data = _load_data($file); my $sorted_data = [ sort { $a->{codepoint} <=> $b->{codepoint} } @$data ]; my $char_width = []; foreach my $char (@$sorted_data) { push @$char_width, $char->{width}; } return $char_width; } sub _generate_charset { my ($self) = @_; my $charset = {}; my $char_width = $self->{char_width}; my $supported_characters = _supported_characters(); foreach my $index (0..$#$char_width) { if ($self->{debug}) { print "Code Point [$index]: ", $supported_characters->[$index]->{code_point}; print "Width: ", $char_width->[$index], "\n"; } $supported_characters->[$index]->{char_width} = $char_width->[$index]; $charset->{$supported_characters->[$index]->{code_point}} = $supported_characters->[$index]; } return $charset; } sub _load_data { my ($file) = @_; open(my $fh, $file); local $/; my $json = <$fh>; my $data = from_json($json); close($fh); return $data; } sub _supported_characters { return [ # Control Codes: C0 { code_point => 0, name => 'Null character NUL' }, { code_point => 1, name => 'Start of Heading SOH' }, { code_point => 2, name => 'Start of Text STX' }, { code_point => 3, name => 'End-of-text character ETX' }, { code_point => 4, name => 'End-of-transmission character EOT' }, { code_point => 5, name => 'Enquiry character ENQ' }, { code_point => 6, name => 'Acknowledge character ACK' }, { code_point => 7, name => 'Bell character BEL' }, { code_point => 8, name => 'Backspace BS' }, { code_point => 9, name => 'Horizontal tab HT' }, { code_point => 10, name => 'Line feed LF' }, { code_point => 11, name => 'Vertical tab VT' }, { code_point => 12, name => 'Form feed FF' }, { code_point => 13, name => 'Carriage return CR' }, { code_point => 14, name => 'Shift Out SO' }, { code_point => 15, name => 'Shift In SI' }, { code_point => 16, name => 'Data Link Escape DLE' }, { code_point => 17, name => 'Device Control 1 DC1' }, { code_point => 18, name => 'Device Control 2 DC2' }, { code_point => 19, name => 'Device Control 3 DC3' }, { code_point => 20, name => 'Device Control 4 DC4' }, { code_point => 21, name => 'Negative-acknowledge character NAK' }, { code_point => 22, name => 'Synchronous Idle SYN' }, { code_point => 23, name => 'End of Transmission Block ETB' }, { code_point => 24, name => 'Cancel character CAN' }, { code_point => 25, name => 'End of Medium EM' }, { code_point => 26, name => 'Substitute character SUB' }, { code_point => 27, name => 'Escape character ESC' }, { code_point => 28, name => 'File Separator FS' }, { code_point => 29, name => 'Group Separator GS' }, { code_point => 30, name => 'Record Separator RS' }, { code_point => 31, name => 'Unit Separator US' }, # ASCII Punctuation & Symbols { code_point => 32, name => 'Space' }, { code_point => 33, name => 'Exclamation' }, { code_point => 34, name => 'Quotation mark' }, { code_point => 35, name => 'Number sign, Hashtag, Octothorpe, Sharp' }, { code_point => 36, name => 'Dollar sign' }, { code_point => 37, name => 'Percent sign' }, { code_point => 38, name => 'Ampersand' }, { code_point => 39, name => 'Apostrophe' }, { code_point => 40, name => 'Left parenthesis' }, { code_point => 41, name => 'Right parenthesis' }, { code_point => 42, name => 'Asterisk' }, { code_point => 43, name => 'Plus sign' }, { code_point => 44, name => 'Comma' }, { code_point => 45, name => 'Hyphen-minus' }, { code_point => 46, name => 'Full stop' }, { code_point => 47, name => 'Slash (Solidus)' }, # ASCII Digits { code_point => 48, name => 'Digit Zero' }, { code_point => 49, name => 'Digit One' }, { code_point => 50, name => 'Digit Two' }, { code_point => 51, name => 'Digit Three' }, { code_point => 52, name => 'Digit Four' }, { code_point => 53, name => 'Digit Five' }, { code_point => 54, name => 'Digit Six' }, { code_point => 55, name => 'Digit Seven' }, { code_point => 56, name => 'Digit Eight' }, { code_point => 57, name => 'Digit Nine' }, # ASCII Punctuation & Symbols { code_point => 58, name => 'Colon' }, { code_point => 59, name => 'Semicolon' }, { code_point => 60, name => 'Less-than sign' }, { code_point => 61, name => 'Equal sign' }, { code_point => 62, name => 'Greater-than sign' }, { code_point => 63, name => 'Question mark' }, { code_point => 64, name => 'At sign' }, # Latin Alphabet: Uppercase { code_point => 65, name => 'Latin Capital letter A' }, { code_point => 66, name => 'Latin Capital letter B' }, { code_point => 67, name => 'Latin Capital letter C' }, { code_point => 68, name => 'Latin Capital letter D' }, { code_point => 69, name => 'Latin Capital letter E' }, { code_point => 70, name => 'Latin Capital letter F' }, { code_point => 71, name => 'Latin Capital letter G' }, { code_point => 72, name => 'Latin Capital letter H' }, { code_point => 73, name => 'Latin Capital letter I' }, { code_point => 74, name => 'Latin Capital letter J' }, { code_point => 75, name => 'Latin Capital letter K' }, { code_point => 76, name => 'Latin Capital letter L' }, { code_point => 77, name => 'Latin Capital letter M' }, { code_point => 78, name => 'Latin Capital letter N' }, { code_point => 79, name => 'Latin Capital letter O' }, { code_point => 80, name => 'Latin Capital letter P' }, { code_point => 81, name => 'Latin Capital letter Q' }, { code_point => 82, name => 'Latin Capital letter R' }, { code_point => 83, name => 'Latin Capital letter S' }, { code_point => 84, name => 'Latin Capital letter T' }, { code_point => 85, name => 'Latin Capital letter U' }, { code_point => 86, name => 'Latin Capital letter V' }, { code_point => 87, name => 'Latin Capital letter W' }, { code_point => 88, name => 'Latin Capital letter X' }, { code_point => 89, name => 'Latin Capital letter Y' }, { code_point => 90, name => 'Latin Capital letter Z' }, # ASCII Punctuation & Symbols { code_point => 91, name => 'Left Square Bracket' }, { code_point => 92, name => 'Backlash' }, { code_point => 93, name => 'Right Square Bracket' }, { code_point => 94, name => 'Circumflex' }, { code_point => 95, name => 'Low line' }, { code_point => 96, name => 'Grave' }, # Latin Alphabet: Smallcase { code_point => 97, name => 'Latin Small letter a' }, { code_point => 98, name => 'Latin Small letter b' }, { code_point => 99, name => 'Latin Small letter c' }, { code_point => 100, name => 'Latin Small letter d' }, { code_point => 101, name => 'Latin Small letter e' }, { code_point => 102, name => 'Latin Small letter f' }, { code_point => 103, name => 'Latin Small letter g' }, { code_point => 104, name => 'Latin Small letter h' }, { code_point => 105, name => 'Latin Small letter i' }, { code_point => 106, name => 'Latin Small letter j' }, { code_point => 107, name => 'Latin Small letter k' }, { code_point => 108, name => 'Latin Small letter l' }, { code_point => 109, name => 'Latin Small letter m' }, { code_point => 110, name => 'Latin Small letter n' }, { code_point => 111, name => 'Latin Small letter o' }, { code_point => 112, name => 'Latin Small letter p' }, { code_point => 113, name => 'Latin Small letter q' }, { code_point => 114, name => 'Latin Small letter r' }, { code_point => 115, name => 'Latin Small letter s' }, { code_point => 116, name => 'Latin Small letter t' }, { code_point => 117, name => 'Latin Small letter u' }, { code_point => 118, name => 'Latin Small letter v' }, { code_point => 119, name => 'Latin Small letter w' }, { code_point => 120, name => 'Latin Small letter x' }, { code_point => 121, name => 'Latin Small letter y' }, { code_point => 122, name => 'Latin Small letter z' }, # ASCII Punctuation & Symbols { code_point => 123, name => 'Left Curly Bracket' }, { code_point => 124, name => 'Vertical bar' }, { code_point => 125, name => 'Right Curly Bracket' }, { code_point => 126, name => 'Tilde' }, # Control Codes: C1 { code_point => 127, name => 'Delete DEL' }, { code_point => 128, name => 'Padding Character PAD' }, { code_point => 129, name => 'High Octet Preset HOP' }, { code_point => 130, name => 'Break Permitted Here BPH' }, { code_point => 131, name => 'No Break Here NBH' }, { code_point => 132, name => 'Index IND' }, { code_point => 133, name => 'Next Line NEL' }, { code_point => 134, name => 'Start of Selected Area SSA' }, { code_point => 135, name => 'End of Selected Area ESA' }, { code_point => 136, name => 'Character Tabulation Set HTS' }, { code_point => 137, name => 'Character Tabulation with Justification HTJ' }, { code_point => 138, name => 'Line Tabulation Set VTS' }, { code_point => 139, name => 'Partial Line Forward PLD' }, { code_point => 140, name => 'Partial Line Backward PLU' }, { code_point => 141, name => 'Reverse Line Feed RI' }, { code_point => 142, name => 'Single-Shift Two SS2' }, { code_point => 143, name => 'Single-Shift Three SS3' }, { code_point => 144, name => 'Device Control String DCS' }, { code_point => 145, name => 'Private Use 1 PU1' }, { code_point => 146, name => 'Private Use 2 PU2' }, { code_point => 147, name => 'Set Transmit State STS' }, { code_point => 148, name => 'Cancel character CCH' }, { code_point => 149, name => 'Message Waiting MW' }, { code_point => 150, name => 'Start of Protected Area SPA' }, { code_point => 151, name => 'End of Protected Area EPA' }, { code_point => 152, name => 'Start of String SOS' }, { code_point => 153, name => 'Single Graphic Character Introducer SGCI' }, { code_point => 154, name => 'Single Character Intro Introducer SCI' }, { code_point => 155, name => 'Control Sequence Introducer CSI' }, { code_point => 156, name => 'String Terminator ST' }, { code_point => 157, name => 'Operating System Command OSC' }, { code_point => 158, name => 'Private Message PM' }, { code_point => 159, name => 'Application Program Command APC' }, # Latin-1 Punctuation & Symbols { code_point => 160, name => 'Non-breaking space' }, { code_point => 161, name => 'Inverted Exclamation Mark' }, { code_point => 162, name => 'Cent sign' }, { code_point => 163, name => 'Pound sign' }, { code_point => 164, name => 'Currency sign' }, { code_point => 165, name => 'Yen sign' }, { code_point => 166, name => 'Broken bar' }, { code_point => 167, name => 'Section sign' }, { code_point => 168, name => 'Diaeresis (Umlaut)' }, { code_point => 169, name => 'Copyright sign' }, { code_point => 170, name => 'Feminine Ordinal Indicator' }, { code_point => 171, name => 'Left-pointing double angle quotation mark' }, { code_point => 172, name => 'Not sign' }, { code_point => 173, name => 'Soft hyphen' }, { code_point => 174, name => 'Registered sign' }, { code_point => 175, name => 'Macron' }, { code_point => 176, name => 'Degree symbol' }, { code_point => 177, name => 'Plus-minus sign' }, { code_point => 178, name => 'Superscript two' }, { code_point => 179, name => 'Superscript three' }, { code_point => 180, name => 'Acute accent' }, { code_point => 181, name => 'Micro sign' }, { code_point => 182, name => 'Pilcrow sign' }, { code_point => 183, name => 'Middle dot' }, { code_point => 184, name => 'Cedilla' }, { code_point => 185, name => 'Superscript one' }, { code_point => 186, name => 'Masculine ordinal indicator' }, { code_point => 187, name => 'Right-pointing double angle quotation mark' }, { code_point => 188, name => 'Vulgar fraction one quarter' }, { code_point => 189, name => 'Vulgar fraction one half' }, { code_point => 190, name => 'Vulgar fraction three quarters' }, { code_point => 191, name => 'Inverted Question Mark' }, # Latin-1 Letter: Uppercase { code_point => 192, name => 'Latin Capital Letter A with grave' }, { code_point => 193, name => 'Latin Capital letter A with acute' }, { code_point => 194, name => 'Latin Capital letter A with circumflex' }, { code_point => 195, name => 'Latin Capital letter A with tilde' }, { code_point => 196, name => 'Latin Capital letter A with diaeresis' }, { code_point => 197, name => 'Latin Capital letter A with ring above' }, { code_point => 198, name => 'Latin Capital letter Æ' }, { code_point => 199, name => 'Latin Capital letter C with cedilla' }, { code_point => 200, name => 'Latin Capital letter E with grave' }, { code_point => 201, name => 'Latin Capital letter E with acute' }, { code_point => 202, name => 'Latin Capital letter E with circumflex' }, { code_point => 203, name => 'Latin Capital letter E with diaeresis' }, { code_point => 204, name => 'Latin Capital letter I with grave' }, { code_point => 205, name => 'Latin Capital letter I with acute' }, { code_point => 206, name => 'Latin Capital letter I with circumflex' }, { code_point => 207, name => 'Latin Capital letter I with diaeresis' }, { code_point => 208, name => 'Latin Capital letter Eth' }, { code_point => 209, name => 'Latin Capital letter N with tilde' }, { code_point => 210, name => 'Latin Capital letter O with grave' }, { code_point => 211, name => 'Latin Capital letter O with acute' }, { code_point => 212, name => 'Latin Capital letter O with circumflex' }, { code_point => 213, name => 'Latin Capital letter O with tilde' }, { code_point => 214, name => 'Latin Capital letter O with diaeresis' }, # Latin-1: Math { code_point => 215, name => 'Multiplication sign' }, # Latin-1 Letter: Uppercase { code_point => 216, name => 'Latin Capital letter O with stroke' }, { code_point => 217, name => 'Latin Capital letter U with grave' }, { code_point => 218, name => 'Latin Capital letter U with acute' }, { code_point => 219, name => 'Latin Capital Letter U with circumflex' }, { code_point => 220, name => 'Latin Capital Letter U with diaeresis' }, { code_point => 221, name => 'Latin Capital Letter Y with acute' }, { code_point => 222, name => 'Latin Capital Letter Thorn' }, # Latin-1 Letter: Lowercase { code_point => 223, name => 'Latin Small Letter sharp' }, { code_point => 224, name => 'Latin Small Letter A with grave' }, { code_point => 225, name => 'Latin Small Letter A with acute' }, { code_point => 226, name => 'Latin Small Letter A with circumflex' }, { code_point => 227, name => 'Latin Small Letter A with tilde' }, { code_point => 228, name => 'Latin Small Letter A with diaeresis' }, { code_point => 229, name => 'Latin Small Letter A with ring above' }, { code_point => 230, name => 'Latin Small Letter Æ' }, { code_point => 231, name => 'Latin Small Letter C with cedilla' }, { code_point => 232, name => 'Latin Small Letter E with grave' }, { code_point => 233, name => 'Latin Small Letter E with acute' }, { code_point => 234, name => 'Latin Small Letter E with circumflex' }, { code_point => 235, name => 'Latin Small Letter E with diaeresis' }, { code_point => 236, name => 'Latin Small Letter I with grave' }, { code_point => 237, name => 'Latin Small Letter I with acute' }, { code_point => 238, name => 'Latin Small Letter I with circumflex' }, { code_point => 239, name => 'Latin Small Letter I with diaeresis' }, { code_point => 240, name => 'Latin Small Letter Eth' }, { code_point => 241, name => 'Latin Small Letter N with tilde' }, { code_point => 242, name => 'Latin Small Letter O with grave' }, { code_point => 243, name => 'Latin Small Letter O with acute' }, { code_point => 244, name => 'Latin Small Letter O with circumflex' }, { code_point => 245, name => 'Latin Small Letter O with tilde' }, { code_point => 246, name => 'Latin Small Letter O with diaeresis' }, # Latin-1: Math { code_point => 247, name => 'Division sign' }, # Latin-1 Letter: Lowercase { code_point => 248, name => 'Latin Small Letter O with stroke' }, { code_point => 249, name => 'Latin Small Letter U with grave' }, { code_point => 250, name => 'Latin Small Letter U with acute' }, { code_point => 251, name => 'Latin Small Letter U with circumflex' }, { code_point => 252, name => 'Latin Small Letter U with diaeresis' }, { code_point => 253, name => 'Latin Small Letter Y with acute' }, { code_point => 254, name => 'Latin Small Letter Thorn' }, { code_point => 255, name => 'Latin Small Letter Y with diaeresis' }, ]; } =head1 AUTHORS Mohammad S Anwar (MANWAR) C<< >> =head1 REPOSITORY L =head1 COPYRIGHT Copyright 1999-2001,Fabien Tassin.All rights reserved.It may be used and modified freely, but I do request that this copyright notice remain attached to the file. You may modify this module as you wish,but if you redistribute a modified version , please attach a note listing the modifications you have made. Copyright 2007 Markus Baertschi Copyright 2010 Gary Lieberman =head1 LICENSE This is free software; you can redistribute it and / or modify it under the same terms as Perl 5.6.0. =cut 1; # End of PDF::Font PDF-Create-1.43/lib/PDF/Image/0000755000175000017500000000000013161531451015010 5ustar manwarmanwarPDF-Create-1.43/lib/PDF/Image/GIF.pm0000644000175000017500000002736413161526250015770 0ustar manwarmanwar# # PDF::Image::GIF - GIF image support for PDF::Create # # Author: Michael Gross # # Copyright 1999-2001 Fabien Tassin # Copyright 2007 Markus Baertschi # # Please see the CHANGES and Changes file for the detailed change log # # Please do not use any of the methods here directly. You will be # punished with your application no longer working after an upgrade ! # package PDF::Image::GIF; use 5.006; use strict; use warnings; use FileHandle; our $VERSION = '1.43'; our $DEBUG = 0; sub new { my $self = {}; $self->{private} = {}; $self->{colorspace} = 0; $self->{width} = 0; $self->{height} = 0; $self->{colorspace} = "DeviceRGB"; $self->{colorspacedata} = ""; $self->{colorspacesize} = 0; $self->{filename} = ""; $self->{error} = ""; $self->{imagesize} = 0; $self->{transparent} = 0; $self->{filter} = ["LZWDecode"]; $self->{decodeparms} = { 'EarlyChange' => 0 }; $self->{private}->{interlaced} = 0; bless($self); return $self; } sub LZW { my $self = shift; my $data = shift; my $result = ""; my $prefix = ""; my $c; my %hash; my $num; my $codesize = 9; #init hash-table for ( $num = 0 ; $num < 256 ; $num++ ) { $hash{ chr($num) } = $num; } #start with a clear $num = 258; my $currentvalue = 256; my $bits = 9; my $pos = 0; while ( $pos < length($data) ) { $c = substr( $data, $pos, 1 ); if ( exists( $hash{ $prefix . $c } ) ) { $prefix .= $c; } else { #save $hash{$prefix} $currentvalue <<= $codesize; $currentvalue |= $hash{$prefix}; $bits += $codesize; while ( $bits >= 8 ) { $result .= chr( ( $currentvalue >> ( $bits - 8 ) ) & 255 ); $bits -= 8; $currentvalue &= ( 1 << $bits ) - 1; } $hash{ $prefix . $c } = $num; $prefix = $c; $num++; #increase code size? if ( $num == 513 || $num == 1025 || $num == 2049 ) { $codesize++; } #hash table overflow? if ( $num == 4097 ) { #save clear $currentvalue <<= $codesize; $currentvalue |= 256; $bits += $codesize; while ( $bits >= 8 ) { $result .= chr( ( $currentvalue >> ( $bits - 8 ) ) & 255 ); $bits -= 8; $currentvalue &= ( 1 << $bits ) - 1; } #reset hash table $codesize = 9; %hash = (); for ( $num = 0 ; $num < 256 ; $num++ ) { $hash{ chr($num) } = $num; } $num = 258; } } $pos++; } #save value for prefix $currentvalue <<= $codesize; $currentvalue |= $hash{$prefix}; $bits += $codesize; while ( $bits >= 8 ) { $result .= chr( ( $currentvalue >> ( $bits - 8 ) ) & 255 ); $bits -= 8; $currentvalue &= ( 1 << $bits ) - 1; } #save eoi $currentvalue <<= $codesize; $currentvalue |= 257; $bits += $codesize; while ( $bits >= 8 ) { $result .= chr( ( $currentvalue >> ( $bits - 8 ) ) & 255 ); $bits -= 8; $currentvalue &= ( 1 << $bits ) - 1; } #save remainder in $currentvalue if ( $bits > 0 ) { $currentvalue = $currentvalue << ( 8 - $bits ); $result .= chr( $currentvalue & 255 ); } $result; } sub UnLZW { my $self = shift; my $data = shift; my $result = ""; my $bits = 0; my $currentvalue = 0; my $codesize = 9; my $pos = 0; my $prefix = ""; my $suffix; my @table; #initialize lookup-table my $num; for ( $num = 0 ; $num < 256 ; $num++ ) { $table[$num] = chr($num); } $table[256] = ""; $num = 257; my $c1; #get first word while ( $bits < $codesize ) { my $d = ord( substr( $data, $pos, 1 ) ); $currentvalue = ( $currentvalue << 8 ) + $d; $bits += 8; $pos++; } my $c2 = $currentvalue >> ( $bits - $codesize ); $bits -= $codesize; my $mask = ( 1 << $bits ) - 1; $currentvalue = $currentvalue & $mask; DECOMPRESS: while ( $pos < length($data) ) { $c1 = $c2; #get next word while ( $bits < $codesize ) { my $d = ord( substr( $data, $pos, 1 ) ); $currentvalue = ( $currentvalue << 8 ) + $d; $bits += 8; $pos++; } $c2 = $currentvalue >> ( $bits - $codesize ); $bits -= $codesize; $mask = ( 1 << $bits ) - 1; $currentvalue = $currentvalue & $mask; #clear code? if ( $c2 == 256 ) { $result .= $table[$c1]; $#table = 256; $codesize = 9; $num = 257; next DECOMPRESS; } #End Of Image? if ( $c2 == 257 ) { last DECOMPRESS; } #get prefix if ( $c1 < $num ) { $prefix = $table[$c1]; } else { print "Compression Error ($c1>=$num)\n"; } #write prefix $result .= $prefix; #get suffix if ( $c2 < $num ) { $suffix = substr( $table[$c2], 0, 1 ); } elsif ( $c2 == $num ) { $suffix = substr( $prefix, 0, 1 ); } else { print "Compression Error ($c2>$num)\n"; } #new table entry is prefix.suffix $table[$num] = $prefix . $suffix; #next table entry $num++; #increase code size? if ( $num == 512 || $num == 1024 || $num == 2048 ) { $codesize++; } } $result .= $table[$c1] if defined $table[$c1]; $result; } sub UnInterlace { my $self = shift; my $data = shift; my $row; my @result; my $width = $self->{width}; my $height = $self->{height}; my $idx = 0; #Pass 1 - every 8th row, starting with row 0 $row = 0; while ( $row < $height ) { $result[$row] = substr( $data, $idx * $width, $width ); $row += 8; $idx++; } #Pass 2 - every 8th row, starting with row 4 $row = 4; while ( $row < $height ) { $result[$row] = substr( $data, $idx * $width, $width ); $row += 8; $idx++; } #Pass 3 - every 4th row, starting with row 2 $row = 2; while ( $row < $height ) { $result[$row] = substr( $data, $idx * $width, $width ); $row += 4; $idx++; } #Pass 4 - every 2th row, starting with row 1 $row = 1; while ( $row < $height ) { $result[$row] = substr( $data, $idx * $width, $width ); $row += 2; $idx++; } join( '', @result ); } sub GetDataBlock { my $self = shift; my $fh = shift; my $s; my $count; my $buf; read $fh, $s, 1; $count = unpack( "C", $s ); if ($count) { read $fh, $buf, $count; } ( $count, $buf ); } sub ReadColorMap { my $self = shift; my $fh = shift; read $fh, $self->{'colorspacedata'}, 3 * $self->{'colormapsize'}; 1; } sub DoExtension { my $self = shift; my $label = shift; my $fh = shift; my $res; my $buf; my $c; my $c2; my $c3; if ( $label eq "\001" ) { #Plain Text Extension } elsif ( ord($label) == 0xFF ) { #Application Extension } elsif ( ord($label) == 0xFE ) { #Comment Extension } elsif ( ord($label) == 0xF9 ) { #Grapgic Control Extension ( $res, $buf ) = $self->GetDataBlock($fh); #(p, image, (unsigned char*) buf); ( $c, $c2, $c2, $c3 ) = unpack( "CCCC", $buf ); if ( $c && 0x1 != 0 ) { $self->{transparent} = 1; $self->{mask} = $c3; } } BLOCK: while (1) { ( $res, $buf ) = $self->GetDataBlock($fh); if ( $res == 0 ) { last BLOCK; } } 1; } sub Open { my $self = shift; my $filename = shift; my $PDF_STRING_GIF = "\107\111\106"; my $PDF_STRING_87a = "\070\067\141"; my $PDF_STRING_89a = "\070\071\141"; my $LOCALCOLORMAP = 0x80; my $INTERLACE = 0x40; my $s; my $c; my $ar; my $flags; $self->{filename} = $filename; my $fh = FileHandle->new("$filename"); if ( !defined $fh ) { $self->{error} = "PDF::Image::GIF.pm: $filename: $!"; return 0 } binmode $fh; read $fh, $s, 3; if ( $s ne $PDF_STRING_GIF ) { close $fh; $self->{error} = "PDF::Image::GIF.pm: Not a gif file."; return 0; } read $fh, $s, 3; if ( $s ne $PDF_STRING_87a && $s ne $PDF_STRING_89a ) { close $fh; $self->{error} = "PDF::Image::GIF.pm: GIF version $s not supported."; return 0; } read $fh, $s, 7; ( $self->{width}, $self->{height}, $flags, $self->{private}->{background}, $ar ) = unpack( "vvCCC", $s ); $self->{colormapsize} = 2 << ( $flags & 0x07 ); $self->{colorspacesize} = 3 * $self->{colormapsize}; if ( $flags & $LOCALCOLORMAP ) { if ( !$self->ReadColorMap($fh) ) { close $fh; $self->{error} = "PDF::Image::GIF.pm: Cant read color map."; return 0; } } if ( $ar != 0 ) { $self->{private}->{dpi_x} = -( $ar + 15.0 ) / 64.0; $self->{private}->{dpi_y} = -1.0; } my $imageCount = 0; IMAGES: while (1) { read $fh, $c, 1; if ( $c eq ";" ) { #GIF file terminator close $fh; $self->{error} = "PDF::Image::GIF.pm: Cant find image in gif file."; return 0; } if ( $c eq "!" ) { #Extension read $fh, $c, 1; $self->DoExtension( $c, $fh ); next; } if ( $c ne "," ) { #must be comma next; #ignore } $imageCount++; read $fh, $s, 9; my $x; ( $x, $c, $self->{width}, $self->{height}, $flags ) = unpack( "vvvvC", $s ); if ( $flags && $INTERLACE ) { $self->{private}->{interlaced} = 1; } if ( $flags & $LOCALCOLORMAP ) { if ( !$self->ReadColorMap($fh) ) { close $fh; $self->{error} = "PDF::Image::GIF.pm: Cant read color map."; return 0; } } read $fh, $s, 1; #read "LZW initial code size" $self->{bpc} = unpack( "C", $s ); if ( $self->{bpc} != 8 ) { close $fh; $self->{error} = "PDF::Image::GIF.pm: LZW minimum code size is " . $self->{bpc} . ", must be 8 to be supported."; return 0; } if ( $imageCount == 1 ) { last IMAGES; } } $self->{private}->{datapos} = tell($fh); close $fh; 1; } sub ReadData { my $self = shift; # init the LZW transformation vars my $c_size = 9; # initial code size my $t_size = 257; # initial "table" size my $i_buff = 0; # input buffer my $i_bits = 0; # input buffer empty my $o_bits = 0; # output buffer empty my $o_buff = 0; my $c_mask; my $bytes_available = 0; my $n_bytes; my $s; my $c; my $flag13; my $code; my $w_bits; my $result = ""; my $fh = FileHandle->new($self->{filename}); if ( !defined $fh ) { $self->{error} = "PDF::Image::GIF.pm: $self->{filename}: $!"; return 0 } binmode $fh; seek( $fh, $self->{private}->{datapos}, 0 ); my $pos = 0; my $data; read $fh, $data, ( -s $self->{filename} ); use integer; $self->{imagesize} = 0; BLOCKS: while (1) { $s = substr( $data, $pos, 1 ); $pos++; $n_bytes = unpack( "C", $s ); if ( !$n_bytes ) { last BLOCKS; } $c_mask = ( 1 << $c_size ) - 1; $flag13 = 0; BLOCK: while (1) { $w_bits = $c_size; # number of bits to write $code = 0; #get at least c_size bits into i_buff while ( $i_bits < $c_size ) { if ( $n_bytes == 0 ) { last BLOCK; } $n_bytes--; $s = substr( $data, $pos, 1 ); $pos++; $c = unpack( "C", $s ); $i_buff |= $c << $i_bits; #EOF will be caught later $i_bits += 8; } $code = $i_buff & $c_mask; $i_bits -= $c_size; $i_buff >>= $c_size; if ( $flag13 && $code != 256 && $code != 257 ) { $self->{error} = "PDF::Image::GIF.pm: LZW code size overflow."; return 0; } if ( $o_bits > 0 ) { $o_buff |= $code >> ( $c_size - 8 + $o_bits ); $w_bits -= 8 - $o_bits; $result .= chr( $o_buff & 255 ); } if ( $w_bits >= 8 ) { $w_bits -= 8; $result .= chr( ( $code >> $w_bits ) & 255 ); } $o_bits = $w_bits; if ( $o_bits > 0 ) { $o_buff = $code << ( 8 - $o_bits ); } $t_size++; if ( $code == 256 ) { #clear code $c_size = 9; $c_mask = ( 1 << $c_size ) - 1; $t_size = 257; $flag13 = 0; } if ( $code == 257 ) { #end code last BLOCK; } if ( $t_size == ( 1 << $c_size ) ) { if ( ++$c_size > 12 ) { $c_size--; $flag13 = 1; } else { $c_mask = ( 1 << $c_size ) - 1; } } } # while () for block } # while () for all blocks #interlaced? if ( $self->{private}->{interlaced} ) { #when interlaced first uncompress image $result = $self->UnLZW($result); #remove interlacing $result = $self->UnInterlace($result); #compress image again $result = $self->LZW($result); } $self->{imagesize} = length($result); $result; } 1; PDF-Create-1.43/lib/PDF/Image/JPEG.pm0000644000175000017500000002213413161526263016102 0ustar manwarmanwar# # PDF::Image::JPEG - JPEG image support for PDF::Create # # Author: Michael Gross # # Copyright 1999-2001 Fabien Tassin # Copyright 2007 Markus Baertschi # # Please see the CHANGES and Changes file for the detailed change log # # Please do not use any of the methods here directly. You will be # punished with your application no longer working after an upgrade ! # package PDF::Image::JPEG; use 5.006; use strict; use warnings; use FileHandle; our $VERSION = '1.43'; our $DEBUG = 0; sub new { my $self = {}; $self->{private} = {}; $self->{width} = 0; $self->{height} = 0; $self->{colorspacedata} = ""; $self->{colorspace} = ""; $self->{colorspacesize} = 0; $self->{filename} = ""; $self->{error} = ""; $self->{imagesize} = 0; $self->{transparent} = 0; $self->{filter} = ["DCTDecode"]; $self->{decodeparms} = {}; bless($self); return $self; } sub pdf_next_jpeg_marker { my $self = shift; my $fh = shift; my $c = 0; my $s; my $M_ERROR = 0x100; #dummy marker, internal use only #my $dbg = ""; while ( $c == 0 ) { while ( $c != 0xFF ) { if ( eof($fh) ) { #print "EOF in next_marker ($dbg)\n"; return $M_ERROR; } read $fh, $s, 1; $c = unpack( "C", $s ); #$dbg.=" " . sprintf("%x", $c); } while ( $c == 0xFF ) { if ( eof($fh) ) { #print "EOF in next_marker ($dbg)\n"; return $M_ERROR; } read $fh, $s, 1; $c = unpack( "C", $s ); #$dbg.=" " . sprintf("%x", $c); } } #print "next_marker: $dbg\n"; return $c; } sub Open { my $self = shift; my $filename = shift; $self->{filename} = $filename; my $M_SOF0 = 0xc0; # baseline DCT my $M_SOF1 = 0xc1; # extended sequential DCT my $M_SOF2 = 0xc2; # progressive DCT my $M_SOF3 = 0xc3; # lossless (sequential) my $M_SOF5 = 0xc5; # differential sequential DCT my $M_SOF6 = 0xc6; # differential progressive DCT my $M_SOF7 = 0xc7; # differential lossless my $M_JPG = 0xc8; # JPEG extensions my $M_SOF9 = 0xc9; # extended sequential DCT my $M_SOF10 = 0xca; # progressive DCT my $M_SOF11 = 0xcb; # lossless (sequential) my $M_SOF13 = 0xcd; # differential sequential DCT my $M_SOF14 = 0xce; # differential progressive DCT my $M_SOF15 = 0xcf; # differential lossless my $M_DHT = 0xc4; # define Huffman tables my $M_DAC = 0xcc; # define arithmetic conditioning table my $M_RST0 = 0xd0; # restart my $M_RST1 = 0xd1; # restart my $M_RST2 = 0xd2; # restart my $M_RST3 = 0xd3; # restart my $M_RST4 = 0xd4; # restart my $M_RST5 = 0xd5; # restart my $M_RST6 = 0xd6; # restart my $M_RST7 = 0xd7; # restart my $M_SOI = 0xd8; # start of image my $M_EOI = 0xd9; # end of image my $M_SOS = 0xda; # start of scan my $M_DQT = 0xdb; # define quantization tables my $M_DNL = 0xdc; # define number of lines my $M_DRI = 0xdd; # define restart interval my $M_DHP = 0xde; # define hierarchical progression my $M_EXP = 0xdf; # expand reference image(s) my $M_APP0 = 0xe0; # application marker, used for JFIF my $M_APP1 = 0xe1; # application marker my $M_APP2 = 0xe2; # application marker my $M_APP3 = 0xe3; # application marker my $M_APP4 = 0xe4; # application marker my $M_APP5 = 0xe5; # application marker my $M_APP6 = 0xe6; # application marker my $M_APP7 = 0xe7; # application marker my $M_APP8 = 0xe8; # application marker my $M_APP9 = 0xe9; # application marker my $M_APP10 = 0xea; # application marker my $M_APP11 = 0xeb; # application marker my $M_APP12 = 0xec; # application marker my $M_APP13 = 0xed; # application marker my $M_APP14 = 0xee; # application marker, used by Adobe my $M_APP15 = 0xef; # application marker my $M_JPG0 = 0xf0; # reserved for JPEG extensions my $M_JPG13 = 0xfd; # reserved for JPEG extensions my $M_COM = 0xfe; # comment my $M_TEM = 0x01; # temporary use my $M_ERROR = 0x100; #dummy marker, internal use only my $b; my $c; my $s; my $i; my $length; my $APP_MAX = 255; my $appstring; my $SOF_done = 0; my $mask = -1; my $adobeflag = 0; my $components = 0; my $fh = FileHandle->new($filename); if ( !defined $fh ) { $self->{error} = "PDF::Image::JPEG.pm: $filename: $!"; return 0 } binmode $fh; #Tommy's special trick for Macintosh JPEGs: simply skip some # hundred bytes at the beginning of the file! MACTrick: while ( !eof($fh) ) { $c = 0; while ( !eof($fh) && $c != 0xFF ) { # skip if not FF read $fh, $s, 1; $c = unpack( "C", $s ); } if ( eof($fh) ) { close($fh); $self->{error} = "PDF::Image::JPEG.pm: Not a JPEG file."; return 0; } while ( !eof($fh) && $c == 0xFF ) { # skip repeated FFs read $fh, $s, 1; $c = unpack( "C", $s ); } $self->{private}->{datapos} = tell($fh) - 2; if ( $c == $M_SOI ) { seek( $fh, $self->{private}->{datapos}, 0 ); last MACTrick; } } my $BOGUS_LENGTH = 768; #Heuristics: if we are that far from the start chances are # it is a TIFF file with embedded JPEG data which we cannot # handle - regard as hopeless... if ( eof($fh) || $self->{private}->{datapos} > $BOGUS_LENGTH ) { close($fh); $self->{error} = "PDF::Image::JPEG.pm: Not a JPEG file."; return 0; } #process JPEG markers */ JPEGMarkers: while ( !$SOF_done && ( $c = $self->pdf_next_jpeg_marker($fh) ) != $M_EOI ) { #print "Marker: " . sprintf("%x", $c) . "\n"; if ( $c == $M_ERROR || $c == $M_SOF3 || $c == $M_SOF5 || $c == $M_SOF6 || $c == $M_SOF7 || $c == $M_SOF9 || $c == $M_SOF11 || $c == $M_SOF13 || $c == $M_SOF14 || $c == $M_SOF15 ) { close($fh); $self->{error} = "PDF::Image::JPEG.pm: JPEG compression type " . ord($c) . " not supported in PDF 1.3.", return 0; } if ( $c == $M_SOF2 || $c == $M_SOF10 ) { close($fh); $self->{error} = "PDF::Image::JPEG.pm: JPEG compression type " . ord($c) . " not supported in PDF 1.2.", return 0; } if ( $c == $M_SOF0 || $c == $M_SOF1 ) { read $fh, $s, 12; ( $c, $self->{bpc}, $self->{height}, $self->{width}, $components ) = unpack( "nCnnC", $s ); $SOF_done = 1; last JPEGMarkers; } elsif ( $c == $M_APP0 ) { read $fh, $s, 2; $length = unpack( "n", $s ) - 2; read $fh, $appstring, $length; #Check for JFIF application marker and read density values # per JFIF spec version 1.02. my $ASPECT_RATIO = 0; #JFIF unit byte: aspect ratio only my $DOTS_PER_INCH = 1; #JFIF unit byte: dots per inch my $DOTS_PER_CM = 2; #JFIF unit byte: dots per cm if ( $length >= 12 && $appstring =~ /^JFIF/ ) { ( $c, $c, $c, $c, $c, $c, $c, $self->{private}->{unit}, $self->{dpi_x}, $self->{dpi_y} ) = unpack( "CCCCCCCCnn", $appstring ); if ( $self->{dpi_x} <= 0 || $self->{dpi_y} <= 0 ) { $self->{dpi_x} = 0; $self->{dpi_y} = 0; } elsif ( $self->{private}->{unit} == $DOTS_PER_INCH ) { } elsif ( $self->{private}->{unit} == $DOTS_PER_CM ) { $self->{dpi_x} *= 2.54; $self->{dpi_y} *= 2.54; } elsif ( $self->{private}->{unit} == $ASPECT_RATIO ) { $self->{dpi_x} *= -1; $self->{dpi_y} *= -1; } } } elsif ( $c == $M_APP14 ) { #check for Adobe marker read $fh, $s, 2; $length = unpack( "n", $s ) - 2; read $fh, $appstring, $length; #Check for Adobe application marker. It is known (per Adobe's TN5116) #to contain the string "Adobe" at the start of the APP14 marker. if ( $length >= 10 && $appstring =~ /^Adobe/ ) { $adobeflag = 1; } } elsif ( $c == $M_SOI || $c == $M_EOI || $c == $M_TEM || $c == $M_RST0 || $c == $M_RST1 || $c == $M_RST2 || $c == $M_RST3 || $c == $M_RST4 || $c == $M_RST5 || $c == $M_RST6 || $c == $M_RST7 ) { #no parameters --> ignore } else { #skip variable length markers read $fh, $s, 2; $length = unpack( "n", $s ) - 2; read $fh, $s, $length; } } if ( $self->{height} <= 0 || $self->{width} <= 0 || $components <= 0 ) { close($fh); $self->{error} = "PDF::Image::JPEG.pm: Bad image parameters in JPEG file."; return 0; } if ( $self->{bpc} != 8 ) { close($fh); $self->{error} = "PDF::Image::JPEG.pm: Bad bpc in JPEG file."; return 0; } if ( $components == 1 ) { $self->{colorspace} = "DeviceGray"; } elsif ( $components == 3 ) { $self->{colorspace} = "DeviceRGB"; } elsif ( $components == 4 ) { $self->{colorspace} = "DeviceCMYK"; #special handling of Photoshop-generated CMYK JPEG files if ($adobeflag) { $self->{invert} = 1; } } else { close($fh); $self->{error} = "PDF::Image::JPEG.pm: Unknown number of color components in JPEG file.", return 0; } close($fh); 1; } sub ReadData { my $self = shift; my $s = ""; my $result; my $JPEG_BUFSIZE = 1024; my $fh = FileHandle->new($self->{filename}); if ( !defined $fh ) { $self->{error} = "PDF::Image::JPEG.pm: $self->{filename}: $!"; return 0 } binmode $fh; seek( $fh, $self->{private}->{datapos}, 0 ); while ( read( $fh, $s, $JPEG_BUFSIZE ) > 0 ) { $result .= $s; } $self->{imagesize} = length($result); close $fh; $result; } 1; PDF-Create-1.43/Makefile.PL0000644000175000017500000000365513161526522014575 0ustar manwarmanwar#!/usr/bin/perl use 5.006; use strict; use warnings FATAL => 'all'; use ExtUtils::MakeMaker; use File::ShareDir::Install; install_share dist => 'share'; WriteMakefile( NAME => 'PDF::Create', VERSION_FROM => 'lib/PDF/Create.pm', ABSTRACT_FROM => 'lib/PDF/Create.pm', LICENSE => "perl", EXE_FILES => [ 'eg/verify-char-width' ], MIN_PERL_VERSION => 5.006, CONFIGURE_REQUIRES => { 'ExtUtils::MakeMaker' => 0, 'File::ShareDir::Install' => 0, }, PREREQ_PM => { 'JSON' => 0, 'Carp' => 0, 'FileHandle' => 0, 'Data::Dumper' => 0, 'Scalar::Util' => 0, 'File::Share' => '0.25', }, TEST_REQUIRES => { 'Test::More' => '1.00', 'Test::LeakTrace' => '0.14', 'File::Temp' => 0, }, dist => { COMPRESS => "gzip", SUFFIX => "gz" }, clean => { FILES => 'PDF-Create*' }, META_MERGE => { 'meta-spec' => { version => 2 }, provides => { 'PDF::Create' => { file => 'lib/PDF/Create.pm' , version => '1.43' }, 'PDF::Create::Page' => { file => 'lib/PDF/Create/Page.pm' , version => '1.43' }, 'PDF::Create::Outline' => { file => 'lib/PDF/Create/Outline.pm', version => '1.43' }, 'PDF::Image::GIF' => { file => 'lib/PDF/Image/GIF.pm' , version => '1.43' }, 'PDF::Image::JPEG' => { file => 'lib/PDF/Image/JPEG.pm' , version => '1.43' }, 'PDF::Font' => { file => 'lib/PDF/Font.pm' , version => '1.43' }, }, resources => { repository => { type => 'git', url => 'http://github.com/manwar/pdf-create.git', web => 'http://github.com/manwar/pdf-create', } } }, ); package MY; use File::ShareDir::Install 'postamble'; PDF-Create-1.43/README0000644000175000017500000000575712700523573013511 0ustar manwarmanwarNAME PDF::Create - create PDF files DESCRIPTION PDF::Create allows you to create PDF documents using a large number of primitives and emit the result as a PDF file/stream.PDF stands for Portable Document Format. Documents can have several pages, a table of content, an information section and many other PDF elements. More functionnalities will be added as needs arise. Documents are constructed on the fly so the memory footprint is not tied to the size of the pages but only to their number. It's main advantage over the other PDF modules is that it doesn't depend on other modules and is perl only (no compiler needed). If you want a quick and dirty way of creating pdf's, PDF::Create is for you. If you need a complete Framework to create complex PDF stuff, you better dive into the PDF::API2 based modules. More information about this module is included in this package. SYNOPSIS use strict; use warnings; use PDF::Create; my $pdf = PDF::Create->new( 'filename' => 'sample.pdf', 'Author' => 'John Doe', 'Title' => 'Sample PDF', 'CreationDate' => [ localtime ] ); # add a A4 sized page my $a4 = $pdf->new_page('MediaBox' => $pdf->get_page_size('A4')); # Add a page which inherits its attributes from $a4 my $page = $a4->new_page; # Prepare a font my $f1 = $pdf->font('BaseFont' => 'Helvetica'); # Prepare a Table of Content my $toc = $pdf->new_outline('Title' => 'Title Page', 'Destination' => $page); # Write some text $page->stringc($f1, 40, 306, 426, "PDF::Create"); $page->stringc($f1, 20, 306, 396, "version $PDF::Create::VERSION"); $page->stringc($f1, 20, 306, 300, 'by John Doe '); # Add another page my $page2 = $a4->new_page; # Draw some lines $page2->line(0, 0, 612, 792); $page2->line(0, 792, 612, 0); $toc->new_outline('Title' => 'Second Page', 'Destination' => $page2); # Close the file and write the PDF $pdf->close; INSTALLATION Quick answer: perl -MCPAN -e 'install PDF::Create' Long answer: To install manually, cd to the directory containing the unpacked distribution and do one of the following: a) Create a makefile by running Makefile.PL using the perl program into whose library you want to install and then run make three times: perl Makefile.PL make make test make install b) To install into a private library, for example your home directory: perl Makefile.PL INSTALLSITELIB=$HOME/lib INSTALLMAN3DIR=$HOME/man make make test make pure_install AUTHORS - Fabien Tassin Original Author of PDF::Create - Markus Baertschi, markus@markus.org I have taken over maintenence of PDF::Create as Fabien has disappeared and did no longer maintain it in the last years. The last version of PDF::Create from Fabien is 0.06. All newer versions have been modified by me. I maintain the PDF::Create in git. You can access the repository directly at http://github.com/markusb/pdf-create. PDF-Create-1.43/META.json0000664000175000017500000000415213161531451014234 0ustar manwarmanwar{ "abstract" : "Create PDF files.", "author" : [ "unknown" ], "dynamic_config" : 1, "generated_by" : "ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter version 2.150005", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "PDF-Create", "no_index" : { "directory" : [ "t", "inc" ] }, "prereqs" : { "build" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0", "File::ShareDir::Install" : "0" } }, "runtime" : { "requires" : { "Carp" : "0", "Data::Dumper" : "0", "File::Share" : "0.25", "FileHandle" : "0", "JSON" : "0", "Scalar::Util" : "0", "perl" : "5.006" } }, "test" : { "requires" : { "File::Temp" : "0", "Test::LeakTrace" : "0.14", "Test::More" : "1.00" } } }, "provides" : { "PDF::Create" : { "file" : "lib/PDF/Create.pm", "version" : "1.43" }, "PDF::Create::Outline" : { "file" : "lib/PDF/Create/Outline.pm", "version" : "1.43" }, "PDF::Create::Page" : { "file" : "lib/PDF/Create/Page.pm", "version" : "1.43" }, "PDF::Font" : { "file" : "lib/PDF/Font.pm", "version" : "1.43" }, "PDF::Image::GIF" : { "file" : "lib/PDF/Image/GIF.pm", "version" : "1.43" }, "PDF::Image::JPEG" : { "file" : "lib/PDF/Image/JPEG.pm", "version" : "1.43" } }, "release_status" : "stable", "resources" : { "repository" : { "type" : "git", "url" : "http://github.com/manwar/pdf-create.git", "web" : "http://github.com/manwar/pdf-create" } }, "version" : "1.43", "x_serialization_backend" : "JSON::PP version 2.27400" } PDF-Create-1.43/pdf-logo.svg0000644000175000017500000001220312700523573015041 0ustar manwarmanwar image/svg+xml PDF PDF-Create-1.43/LICENSE0000644000175000017500000004431112710676465013635 0ustar manwarmanwarThis software is Copyright 1999-2001 Fabien Tassin; Copyright 2007 Markus Baertschi; Copyright 2010 Gary Lieberman. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Terms of the Perl programming language system itself a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" --- The GNU General Public License, Version 1, February 1989 --- This software is Copyright 1999-2001 Fabien Tassin; Copyright 2007 Markus Baertschi; Copyright 2010 Gary Lieberman. This is free software, licensed under: The GNU General Public License, Version 1, February 1989 GNU GENERAL PUBLIC LICENSE Version 1, February 1989 Copyright (C) 1989 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The license agreements of most software companies try to keep users at the mercy of those companies. By contrast, our General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. The General Public License applies to the Free Software Foundation's software and to any other program whose authors commit to using it. You can use it for your programs, too. When we speak of free software, we are referring to freedom, not price. Specifically, the General Public License is designed to make sure that you have the freedom to give away or sell copies of free software, that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of a such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any work containing the Program or a portion of it, either verbatim or with modifications. Each licensee is addressed as "you". 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this General Public License and to the absence of any warranty; and give any other recipients of the Program a copy of this General Public License along with the Program. You may charge a fee for the physical act of transferring a copy. 2. You may modify your copy or copies of the Program or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above, provided that you also do the following: a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and b) cause the whole of any work that you distribute or publish, that in whole or in part contains the Program or any part thereof, either with or without modifications, to be licensed at no charge to all third parties under the terms of this General Public License (except that you may choose to grant warranty protection to some or all third parties, at your option). c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the simplest and most usual way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this General Public License. d) You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. Mere aggregation of another independent work with the Program (or its derivative) on a volume of a storage or distribution medium does not bring the other work under the scope of these terms. 3. You may copy and distribute the Program (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: a) accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, b) accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal charge for the cost of distribution) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or, c) accompany it with the information you received as to where the corresponding source code may be obtained. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.) Source code for a work means the preferred form of the work for making modifications to it. For an executable file, complete source code means all the source code for all modules it contains; but, as a special exception, it need not include source code for modules which are standard libraries that accompany the operating system on which the executable file runs, or for standard header files or definitions files that accompany that operating system. 4. You may not copy, modify, sublicense, distribute or transfer the Program except as expressly provided under this General Public License. Any attempt otherwise to copy, modify, sublicense, distribute or transfer the Program is void, and will automatically terminate your rights to use the Program under this License. However, parties who have received copies, or rights to use copies, from you under this General Public License will not have their licenses terminated so long as such parties remain in full compliance. 5. By copying, distributing or modifying the Program (or any work based on the Program) you indicate your acceptance of this license to do so, and all its terms and conditions. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. 7. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of the license which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the license, you may choose any version ever published by the Free Software Foundation. 8. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to humanity, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19xx name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (a program to direct compilers to make passes at assemblers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice That's all there is to it! --- The Artistic License 1.0 --- This software is Copyright 1999-2001 Fabien Tassin; Copyright 2007 Markus Baertschi; Copyright 2010 Gary Lieberman. This is free software, licensed under: The Artistic License 1.0 The Artistic License Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: - "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. - "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder. - "Copyright Holder" is whoever is named in the copyright or copyrights for the package. - "You" is you, if you're thinking about copying or distributing this Package. - "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) - "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as ftp.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) accompany any non-standard executables with their corresponding Standard Version executables, giving the non-standard executables non-standard names, and clearly documenting the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this Package. 7. C or perl subroutines supplied by you and linked into this Package shall not be considered part of this Package. 8. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. The EndPDF-Create-1.43/MANIFEST0000664000175000017500000000214113161531451013740 0ustar manwarmanwarLICENSE Changes share/courier-bold.json share/courier-boldoblique.json share/courier-oblique.json share/courier.json share/helvetica-bold.json share/helvetica-boldoblique.json share/helvetica-oblique.json share/helvetica.json share/times-bold.json share/times-bolditalic.json share/times-italic.json share/times-roman.json share/symbol.json eg/sample-cgi.pl eg/sample.pl eg/verify-char-width eg/pdf-logo.gif eg/pdf-logo.jpg lib/PDF/Create.pm lib/PDF/Create/Outline.pm lib/PDF/Create/Page.pm lib/PDF/Image/GIF.pm lib/PDF/Image/JPEG.pm lib/PDF/Font.pm Makefile.PL MANIFEST MANIFEST.SKIP pdf-logo.svg README t/00-load.t t/01-basic.t t/02-string.t t/03-image.t t/04-drawing.t t/05-outline.t t/06-annotation.t t/07-fonts.t t/09-cgi-script.pl t/09-cgi.t t/10-generic.t t/11-encode.t t/12-version.t t/13-close.t t/50-versioning.t t/51-memory-leak.t t/99-wifi-parabola.t t/pdf-logo.gif t/pdf-logo.jpg t/pod.t t/manifest.t t/changes.t t/meta-json.t t/meta-yml.t META.yml Module YAML meta-data (added by MakeMaker) META.json Module JSON meta-data (added by MakeMaker) PDF-Create-1.43/META.yml0000664000175000017500000000226713161531451014071 0ustar manwarmanwar--- abstract: 'Create PDF files.' author: - unknown build_requires: ExtUtils::MakeMaker: '0' File::Temp: '0' Test::LeakTrace: '0.14' Test::More: '1.00' configure_requires: ExtUtils::MakeMaker: '0' File::ShareDir::Install: '0' dynamic_config: 1 generated_by: 'ExtUtils::MakeMaker version 7.24, CPAN::Meta::Converter version 2.150005' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: PDF-Create no_index: directory: - t - inc provides: PDF::Create: file: lib/PDF/Create.pm version: '1.43' PDF::Create::Outline: file: lib/PDF/Create/Outline.pm version: '1.43' PDF::Create::Page: file: lib/PDF/Create/Page.pm version: '1.43' PDF::Font: file: lib/PDF/Font.pm version: '1.43' PDF::Image::GIF: file: lib/PDF/Image/GIF.pm version: '1.43' PDF::Image::JPEG: file: lib/PDF/Image/JPEG.pm version: '1.43' requires: Carp: '0' Data::Dumper: '0' File::Share: '0.25' FileHandle: '0' JSON: '0' Scalar::Util: '0' perl: '5.006' resources: repository: http://github.com/manwar/pdf-create.git version: '1.43' x_serialization_backend: 'CPAN::Meta::YAML version 0.018' PDF-Create-1.43/MANIFEST.SKIP0000644000175000017500000000021512700523573014507 0ustar manwarmanwar^Makefile(\.old)?$ ^MANIFEST\.bak$ ^Maintenance-.* .*~$ (^|/)TAGS$ .*\.tar\.gz$ blib/ pm_to_blib \.pdf$ \.tmp$ ^devel/ .git/ ^\..* ^MYMETA.* PDF-Create-1.43/Changes0000644000175000017500000001454713161531401014110 0ustar manwarmanwarRevision history for PDF::Create 1.43 2017-09-23 20:20:00 MANWAR - Proposed fix for issues RT #123075 and #123076 with regard to setting encoding to file handle. 1.42 2017-04-11 12:15:00 MANWAR - Assigned filehandle encoding to 'utf8' explicitly. - Assigned default font width. 1.41 2016-12-29 15:10:00 MANWAR - Proposed fix for RT #119292 and rollbacked patch for RT #118764. Document how close() deals when or is involved. i.e. When is provided then don't try to close the file handle at the end. Leave that for the end user to deal with it outside. Added new method flush() that does exactly this. 1.40 2016-12-20 12:00:00 MANWAR - Proposed fix for RT #118945. 1.39 2016-11-19 07:50:00 MANWAR - Proposed fix for RT #118778 (thanks Andrew Beverley). 1.38 2016-11-17 10:25:00 MANWAR - Proposed fix for RT #118777 (thanks Andrew Beverley). 1.37 2016-11-16 06:25:00 MANWAR - Proposed fix for RT #118776 (thanks Andrew Beverley). 1.36 2016-11-15 09:50:00 MANWAR - Proposed fix for RT #118764 (thanks Andrew Beverley). 1.35 2016-09-09 10:20:00 MANWAR - Merge pull request #10 from zhouzhen1/typo 1.34 2016-08-26 08:40:00 MANWAR - Corrected HelveticaBold font width. 1.33 2016-07-22 12:00:00 MANWAR - Updated pod for package PDF::Font describing constructor. 1.32 2016-06-03 12:00:00 MANWAR - Corrected Helvetica font width. 1.31 2016-05-02 02:45:00 MANWAR - Updated method PDF::Font::_generate_char_width() to load data in sorted order. - Added script "verify-char-width" to test char width in different fonts. - Added section "SYNOPSIS" to the package PDF::Font. 1.30 2016-04-30 08:00:00 MANWAR - Refactored character width handling for supported fonts. - Fixed method block_text() w.r.t line spacing. 1.29 2016-02-12 11:15:00 MANWAR - Updated method block_text() to parameterize paragraph spacing on email request of Joel Goode. - Added example code to the pod for the method block_text(). 1.28 2016-02-01 16:10:00 MANWAR - Removed +x attribute from some of the test scripts. - Added test scripts t/meta-json.t and t/meta-yml.t. 1.27 2016-01-14 10:50:00 MANWAR - Added LICENSE file. 1.26 2016-01-03 00:45:00 MANWAR - Merged GitHub Pull Request #9 from ESERTE. 1.25 2016-01-02 01:05:00 MANWAR - Merged GitHub Pull Request #8 from TAISNIF. 1.24 2015-12-14 11:35:00 MANWAR - Documented method version(). - Added check for version number. - Added unit test for method version(). 1.23 2015-12-05 12:40:00 MANWAR - Added parameter validation check for method new_outline(). 1.22 2015-11-25 10:35:00 MANWAR - Fixed the debug level handling. - Updated pod document about the same. 1.21 2015-11-24 14:00:00 MANWAR - Fixed issue RT# 109562. 1.20 2015-11-24 MANWAR - Updated method PDF::Create::Page::string() to handle character/word spacing. (Thanks David Kitcher-Jones). - Updated method PDF::Create::Page::text() to handle font correctly. (Thanks David Kitcher-Jones). - Added new method PDF::Create::Page::block_text() to manage block of text. (Thanks David Kitcher-Jones). - Updated method PDF::Create::Page::block_text() to handle multiple paragraphs. (MANWAR) - Documented method text() and block_text(). (MANWAR) 1.19 2015-10-28 MANWAR - Added key 'provides' to the Makefile.PL script. - Added standard unit test script (t/00-load.t). 1.18 2015-10-26 MANWAR - Added MIN_PERL_VERSION to the Makefile.PL script. - Tidied up and documented package PDF::Create. - Tidied up and documented package PDF::Create::Page. - Tidied up README file. 1.17 2015-10-25 MANWAR - Renamed file CHANGES to Changes. - Tidied up Changes file. - Added standard unit test for Changes file (t/changes.t). 1.16 2015-10-24 MANWAR - Fixed the warning thrown by method PDF::Image::GIF::UnLZW(). - Tidied up example scripts (eg/sample.pl and eg/sample-cgi.pl). - Added sample images used by example scripts. - Added standard unit test for MANIFEST file. 1.15 2015-10-24 MANWAR - Added key 'CreationDate' to the list of valid keys to constructor. - Tidied up pod document of PDF::Create. - Tidied up Makefile.PL script. - Removed MANIFEST from .gitignore file. 1.14 2015-10-23 MANWAR - Added section REPOSITORY, LICENSE to the pod document. - Added standard pod syntax testing script t/pod.t - Added MANIFEST file. 1.13 2015-10-22 MANWAR - Fixed the distribution as earlier v1.12 didn't have any code (MANWAR). 1.12 2015-10-22 MANWAR - Updated repository link in the Makefile.PL script (MANWAR). 1.11 2015-10-02 MANWAR Test cleanups. (Mohammad S Anwar) Input validation. (Mohammad S Anwar) 1.10 2014-08-22 - Fix test that used to use CGI.pm 1.09 2014-08-21 - Eliminate the need for CGI.pm in the test RT #98222 - Some POD updates. - Eliminate memory leak RT #93412 thanks to Chris Jack. 1.08 2013-12-11 - Eliminate pipe from CGI test script t/09 - Filehandle => FileHandle typo fixed #91312 1.07 2013-12-10 - New maintainer SZABGAB - Tried to reconstruct entries in the CHANGES file - Some more test case - Code clean-up (remove indirect calls) - Remove Build.PL - use warnings; - Officially require perl 5.006. - Move example file to the eg/ directory 1.06 2010-07-06 1.05 2010.02.26 1.04 2009-07-13 1.03 2009-03-24 1.02 2008-07-10 1.01 2008-06-03 1.00 2008-05-31 0.10 2008-05-31 0.09 2007-09-30 - Markus Baertschi, markus@markus.org - Added stringml for multi-line strings - Changed get_page_size to case-independent 0.08 2007-09-03 - Markus Baertschi, markus@markus.org - Get back in sync with CPAN/PAUSE - Fixed check for open file in Create.pm - Touched up the README 0.07 0000-00-00 - Markus Baertschi, markus@markus.org - Added image samples to sample.pl - Touched up the README - Added check for open file in JPEG/GIFImages 0.06 0000-00-00 - Fabien Tassin - Added support for JPEG and GIF images - Markus Baertschi, markus@markus.org - Packaged for release on CPAN 0.01 1999-11-05 - Fabien Tassin - Original ReleasePDF-Create-1.43/share/0000755000175000017500000000000013161531451013711 5ustar manwarmanwarPDF-Create-1.43/share/courier.json0000644000175000017500000003362512710765550016275 0ustar manwarmanwar[ { "width" : 599, "codepoint" : 0 }, { "width" : 599, "codepoint" : 1 }, { "width" : 599, "codepoint" : 2 }, { "width" : 599, "codepoint" : 3 }, { "width" : 599, "codepoint" : 4 }, { "width" : 599, "codepoint" : 5 }, { "width" : 599, "codepoint" : 6 }, { "width" : 599, "codepoint" : 7 }, { "width" : 599, "codepoint" : 8 }, { "width" : 599, "codepoint" : 9 }, { "width" : 599, "codepoint" : 10 }, { "width" : 599, "codepoint" : 11 }, { "width" : 599, "codepoint" : 12 }, { "width" : 599, "codepoint" : 13 }, { "width" : 599, "codepoint" : 14 }, { "width" : 599, "codepoint" : 15 }, { "width" : 599, "codepoint" : 16 }, { "width" : 599, "codepoint" : 17 }, { "width" : 599, "codepoint" : 18 }, { "width" : 599, "codepoint" : 19 }, { "width" : 599, "codepoint" : 20 }, { "width" : 599, "codepoint" : 21 }, { "width" : 599, "codepoint" : 22 }, { "width" : 599, "codepoint" : 23 }, { "width" : 599, "codepoint" : 24 }, { "width" : 599, "codepoint" : 25 }, { "width" : 599, "codepoint" : 26 }, { "width" : 599, "codepoint" : 27 }, { "width" : 599, "codepoint" : 28 }, { "width" : 599, "codepoint" : 29 }, { "width" : 599, "codepoint" : 30 }, { "width" : 599, "codepoint" : 31 }, { "width" : 599, "codepoint" : 32 }, { "width" : 599, "codepoint" : 33 }, { "width" : 599, "codepoint" : 34 }, { "width" : 599, "codepoint" : 35 }, { "width" : 599, "codepoint" : 36 }, { "width" : 599, "codepoint" : 37 }, { "width" : 599, "codepoint" : 38 }, { "width" : 599, "codepoint" : 39 }, { "width" : 599, "codepoint" : 40 }, { "width" : 599, "codepoint" : 41 }, { "width" : 599, "codepoint" : 42 }, { "width" : 599, "codepoint" : 43 }, { "width" : 599, "codepoint" : 44 }, { "width" : 599, "codepoint" : 45 }, { "width" : 599, "codepoint" : 46 }, { "width" : 599, "codepoint" : 47 }, { "width" : 599, "codepoint" : 48 }, { "width" : 599, "codepoint" : 49 }, { "width" : 599, "codepoint" : 50 }, { "width" : 599, "codepoint" : 51 }, { "width" : 599, "codepoint" : 52 }, { "width" : 599, "codepoint" : 53 }, { "width" : 599, "codepoint" : 54 }, { "width" : 599, "codepoint" : 55 }, { "width" : 599, "codepoint" : 56 }, { "width" : 599, "codepoint" : 57 }, { "width" : 599, "codepoint" : 58 }, { "width" : 599, "codepoint" : 59 }, { "width" : 599, "codepoint" : 60 }, { "width" : 599, "codepoint" : 61 }, { "width" : 599, "codepoint" : 62 }, { "width" : 599, "codepoint" : 63 }, { "width" : 599, "codepoint" : 64 }, { "width" : 599, "codepoint" : 65 }, { "width" : 599, "codepoint" : 66 }, { "width" : 599, "codepoint" : 67 }, { "width" : 599, "codepoint" : 68 }, { "width" : 599, "codepoint" : 69 }, { "width" : 599, "codepoint" : 70 }, { "width" : 599, "codepoint" : 71 }, { "width" : 599, "codepoint" : 72 }, { "width" : 599, "codepoint" : 73 }, { "width" : 599, "codepoint" : 74 }, { "width" : 599, "codepoint" : 75 }, { "width" : 599, "codepoint" : 76 }, { "width" : 599, "codepoint" : 77 }, { "width" : 599, "codepoint" : 78 }, { "width" : 599, "codepoint" : 79 }, { "width" : 599, "codepoint" : 80 }, { "width" : 599, "codepoint" : 81 }, { "width" : 599, "codepoint" : 82 }, { "width" : 599, "codepoint" : 83 }, { "width" : 599, "codepoint" : 84 }, { "width" : 599, "codepoint" : 85 }, { "width" : 599, "codepoint" : 86 }, { "width" : 599, "codepoint" : 87 }, { "width" : 599, "codepoint" : 88 }, { "width" : 599, "codepoint" : 89 }, { "width" : 599, "codepoint" : 90 }, { "width" : 599, "codepoint" : 91 }, { "width" : 599, "codepoint" : 92 }, { "width" : 599, "codepoint" : 93 }, { "width" : 599, "codepoint" : 94 }, { "width" : 599, "codepoint" : 95 }, { "width" : 599, "codepoint" : 96 }, { "width" : 599, "codepoint" : 97 }, { "width" : 599, "codepoint" : 98 }, { "width" : 599, "codepoint" : 99 }, { "width" : 599, "codepoint" : 100 }, { "width" : 599, "codepoint" : 101 }, { "width" : 599, "codepoint" : 102 }, { "width" : 599, "codepoint" : 103 }, { "width" : 599, "codepoint" : 104 }, { "width" : 599, "codepoint" : 105 }, { "width" : 599, "codepoint" : 106 }, { "width" : 599, "codepoint" : 107 }, { "width" : 599, "codepoint" : 108 }, { "width" : 599, "codepoint" : 109 }, { "width" : 599, "codepoint" : 110 }, { "width" : 599, "codepoint" : 111 }, { "width" : 599, "codepoint" : 112 }, { "width" : 599, "codepoint" : 113 }, { "width" : 599, "codepoint" : 114 }, { "width" : 599, "codepoint" : 115 }, { "width" : 599, "codepoint" : 116 }, { "width" : 599, "codepoint" : 117 }, { "width" : 599, "codepoint" : 118 }, { "width" : 599, "codepoint" : 119 }, { "width" : 599, "codepoint" : 120 }, { "width" : 599, "codepoint" : 121 }, { "width" : 599, "codepoint" : 122 }, { "width" : 599, "codepoint" : 123 }, { "width" : 599, "codepoint" : 124 }, { "width" : 599, "codepoint" : 125 }, { "width" : 599, "codepoint" : 126 }, { "width" : 599, "codepoint" : 127 }, { "width" : 599, "codepoint" : 128 }, { "width" : 599, "codepoint" : 129 }, { "width" : 599, "codepoint" : 130 }, { "width" : 599, "codepoint" : 131 }, { "width" : 599, "codepoint" : 132 }, { "width" : 599, "codepoint" : 133 }, { "width" : 599, "codepoint" : 134 }, { "width" : 599, "codepoint" : 135 }, { "width" : 599, "codepoint" : 136 }, { "width" : 599, "codepoint" : 137 }, { "width" : 599, "codepoint" : 138 }, { "width" : 599, "codepoint" : 139 }, { "width" : 599, "codepoint" : 140 }, { "width" : 599, "codepoint" : 141 }, { "width" : 599, "codepoint" : 142 }, { "width" : 599, "codepoint" : 143 }, { "width" : 599, "codepoint" : 144 }, { "width" : 599, "codepoint" : 145 }, { "width" : 599, "codepoint" : 146 }, { "width" : 599, "codepoint" : 147 }, { "width" : 599, "codepoint" : 148 }, { "width" : 599, "codepoint" : 149 }, { "width" : 599, "codepoint" : 150 }, { "width" : 599, "codepoint" : 151 }, { "width" : 599, "codepoint" : 152 }, { "width" : 599, "codepoint" : 153 }, { "width" : 599, "codepoint" : 154 }, { "width" : 599, "codepoint" : 155 }, { "width" : 599, "codepoint" : 156 }, { "width" : 599, "codepoint" : 157 }, { "width" : 599, "codepoint" : 158 }, { "width" : 599, "codepoint" : 159 }, { "width" : 599, "codepoint" : 160 }, { "width" : 599, "codepoint" : 161 }, { "width" : 599, "codepoint" : 162 }, { "width" : 599, "codepoint" : 163 }, { "width" : 599, "codepoint" : 164 }, { "width" : 599, "codepoint" : 165 }, { "width" : 599, "codepoint" : 166 }, { "width" : 599, "codepoint" : 167 }, { "width" : 599, "codepoint" : 168 }, { "width" : 599, "codepoint" : 169 }, { "width" : 599, "codepoint" : 170 }, { "width" : 599, "codepoint" : 171 }, { "width" : 599, "codepoint" : 172 }, { "width" : 599, "codepoint" : 173 }, { "width" : 599, "codepoint" : 174 }, { "width" : 599, "codepoint" : 175 }, { "width" : 599, "codepoint" : 176 }, { "width" : 599, "codepoint" : 177 }, { "width" : 599, "codepoint" : 178 }, { "width" : 599, "codepoint" : 179 }, { "width" : 599, "codepoint" : 180 }, { "width" : 599, "codepoint" : 181 }, { "width" : 599, "codepoint" : 182 }, { "width" : 599, "codepoint" : 183 }, { "width" : 599, "codepoint" : 184 }, { "width" : 599, "codepoint" : 185 }, { "width" : 599, "codepoint" : 186 }, { "width" : 599, "codepoint" : 187 }, { "width" : 599, "codepoint" : 188 }, { "width" : 599, "codepoint" : 189 }, { "width" : 599, "codepoint" : 190 }, { "width" : 599, "codepoint" : 191 }, { "width" : 599, "codepoint" : 192 }, { "width" : 599, "codepoint" : 193 }, { "width" : 599, "codepoint" : 194 }, { "width" : 599, "codepoint" : 195 }, { "width" : 599, "codepoint" : 196 }, { "width" : 599, "codepoint" : 197 }, { "width" : 599, "codepoint" : 198 }, { "width" : 599, "codepoint" : 199 }, { "width" : 599, "codepoint" : 200 }, { "width" : 599, "codepoint" : 201 }, { "width" : 599, "codepoint" : 202 }, { "width" : 599, "codepoint" : 203 }, { "width" : 599, "codepoint" : 204 }, { "width" : 599, "codepoint" : 205 }, { "width" : 599, "codepoint" : 206 }, { "width" : 599, "codepoint" : 207 }, { "width" : 599, "codepoint" : 208 }, { "width" : 599, "codepoint" : 209 }, { "width" : 599, "codepoint" : 210 }, { "width" : 599, "codepoint" : 211 }, { "width" : 599, "codepoint" : 212 }, { "width" : 599, "codepoint" : 213 }, { "width" : 599, "codepoint" : 214 }, { "width" : 599, "codepoint" : 215 }, { "width" : 599, "codepoint" : 216 }, { "width" : 599, "codepoint" : 217 }, { "width" : 599, "codepoint" : 218 }, { "width" : 599, "codepoint" : 219 }, { "width" : 599, "codepoint" : 220 }, { "width" : 599, "codepoint" : 221 }, { "width" : 599, "codepoint" : 222 }, { "width" : 599, "codepoint" : 223 }, { "width" : 599, "codepoint" : 224 }, { "width" : 599, "codepoint" : 225 }, { "width" : 599, "codepoint" : 226 }, { "width" : 599, "codepoint" : 227 }, { "width" : 599, "codepoint" : 228 }, { "width" : 599, "codepoint" : 229 }, { "width" : 599, "codepoint" : 230 }, { "width" : 599, "codepoint" : 231 }, { "width" : 599, "codepoint" : 232 }, { "width" : 599, "codepoint" : 233 }, { "width" : 599, "codepoint" : 234 }, { "width" : 599, "codepoint" : 235 }, { "width" : 599, "codepoint" : 236 }, { "width" : 599, "codepoint" : 237 }, { "width" : 599, "codepoint" : 238 }, { "width" : 599, "codepoint" : 239 }, { "width" : 599, "codepoint" : 240 }, { "width" : 599, "codepoint" : 241 }, { "width" : 599, "codepoint" : 242 }, { "width" : 599, "codepoint" : 243 }, { "width" : 599, "codepoint" : 244 }, { "width" : 599, "codepoint" : 245 }, { "width" : 599, "codepoint" : 246 }, { "width" : 599, "codepoint" : 247 }, { "width" : 599, "codepoint" : 248 }, { "width" : 599, "codepoint" : 249 }, { "width" : 599, "codepoint" : 250 }, { "width" : 599, "codepoint" : 251 }, { "width" : 599, "codepoint" : 252 }, { "width" : 599, "codepoint" : 253 }, { "width" : 599, "codepoint" : 254 }, { "width" : 599, "codepoint" : 255 } ] PDF-Create-1.43/share/times-italic.json0000644000175000017500000003362512710765550017211 0ustar manwarmanwar[ { "width" : 249, "codepoint" : 0 }, { "width" : 249, "codepoint" : 1 }, { "width" : 249, "codepoint" : 2 }, { "width" : 249, "codepoint" : 3 }, { "width" : 249, "codepoint" : 4 }, { "width" : 249, "codepoint" : 5 }, { "width" : 249, "codepoint" : 6 }, { "width" : 249, "codepoint" : 7 }, { "width" : 249, "codepoint" : 8 }, { "width" : 249, "codepoint" : 9 }, { "width" : 249, "codepoint" : 10 }, { "width" : 249, "codepoint" : 11 }, { "width" : 249, "codepoint" : 12 }, { "width" : 249, "codepoint" : 13 }, { "width" : 249, "codepoint" : 14 }, { "width" : 249, "codepoint" : 15 }, { "width" : 249, "codepoint" : 16 }, { "width" : 249, "codepoint" : 17 }, { "width" : 249, "codepoint" : 18 }, { "width" : 249, "codepoint" : 19 }, { "width" : 249, "codepoint" : 20 }, { "width" : 249, "codepoint" : 21 }, { "width" : 249, "codepoint" : 22 }, { "width" : 249, "codepoint" : 23 }, { "width" : 249, "codepoint" : 24 }, { "width" : 249, "codepoint" : 25 }, { "width" : 249, "codepoint" : 26 }, { "width" : 249, "codepoint" : 27 }, { "width" : 249, "codepoint" : 28 }, { "width" : 249, "codepoint" : 29 }, { "width" : 249, "codepoint" : 30 }, { "width" : 249, "codepoint" : 31 }, { "width" : 249, "codepoint" : 32 }, { "width" : 332, "codepoint" : 33 }, { "width" : 419, "codepoint" : 34 }, { "width" : 499, "codepoint" : 35 }, { "width" : 499, "codepoint" : 36 }, { "width" : 832, "codepoint" : 37 }, { "width" : 777, "codepoint" : 38 }, { "width" : 332, "codepoint" : 39 }, { "width" : 332, "codepoint" : 40 }, { "width" : 332, "codepoint" : 41 }, { "width" : 499, "codepoint" : 42 }, { "width" : 674, "codepoint" : 43 }, { "width" : 249, "codepoint" : 44 }, { "width" : 332, "codepoint" : 45 }, { "width" : 249, "codepoint" : 46 }, { "width" : 277, "codepoint" : 47 }, { "width" : 499, "codepoint" : 48 }, { "width" : 499, "codepoint" : 49 }, { "width" : 499, "codepoint" : 50 }, { "width" : 499, "codepoint" : 51 }, { "width" : 499, "codepoint" : 52 }, { "width" : 499, "codepoint" : 53 }, { "width" : 499, "codepoint" : 54 }, { "width" : 499, "codepoint" : 55 }, { "width" : 499, "codepoint" : 56 }, { "width" : 499, "codepoint" : 57 }, { "width" : 332, "codepoint" : 58 }, { "width" : 332, "codepoint" : 59 }, { "width" : 674, "codepoint" : 60 }, { "width" : 674, "codepoint" : 61 }, { "width" : 674, "codepoint" : 62 }, { "width" : 499, "codepoint" : 63 }, { "width" : 919, "codepoint" : 64 }, { "width" : 610, "codepoint" : 65 }, { "width" : 610, "codepoint" : 66 }, { "width" : 666, "codepoint" : 67 }, { "width" : 721, "codepoint" : 68 }, { "width" : 610, "codepoint" : 69 }, { "width" : 610, "codepoint" : 70 }, { "width" : 721, "codepoint" : 71 }, { "width" : 721, "codepoint" : 72 }, { "width" : 332, "codepoint" : 73 }, { "width" : 443, "codepoint" : 74 }, { "width" : 666, "codepoint" : 75 }, { "width" : 555, "codepoint" : 76 }, { "width" : 832, "codepoint" : 77 }, { "width" : 666, "codepoint" : 78 }, { "width" : 721, "codepoint" : 79 }, { "width" : 610, "codepoint" : 80 }, { "width" : 721, "codepoint" : 81 }, { "width" : 610, "codepoint" : 82 }, { "width" : 499, "codepoint" : 83 }, { "width" : 555, "codepoint" : 84 }, { "width" : 721, "codepoint" : 85 }, { "width" : 610, "codepoint" : 86 }, { "width" : 832, "codepoint" : 87 }, { "width" : 610, "codepoint" : 88 }, { "width" : 555, "codepoint" : 89 }, { "width" : 555, "codepoint" : 90 }, { "width" : 388, "codepoint" : 91 }, { "width" : 277, "codepoint" : 92 }, { "width" : 388, "codepoint" : 93 }, { "width" : 421, "codepoint" : 94 }, { "width" : 499, "codepoint" : 95 }, { "width" : 332, "codepoint" : 96 }, { "width" : 499, "codepoint" : 97 }, { "width" : 499, "codepoint" : 98 }, { "width" : 443, "codepoint" : 99 }, { "width" : 499, "codepoint" : 100 }, { "width" : 443, "codepoint" : 101 }, { "width" : 277, "codepoint" : 102 }, { "width" : 499, "codepoint" : 103 }, { "width" : 499, "codepoint" : 104 }, { "width" : 277, "codepoint" : 105 }, { "width" : 277, "codepoint" : 106 }, { "width" : 443, "codepoint" : 107 }, { "width" : 277, "codepoint" : 108 }, { "width" : 721, "codepoint" : 109 }, { "width" : 499, "codepoint" : 110 }, { "width" : 499, "codepoint" : 111 }, { "width" : 499, "codepoint" : 112 }, { "width" : 499, "codepoint" : 113 }, { "width" : 388, "codepoint" : 114 }, { "width" : 388, "codepoint" : 115 }, { "width" : 277, "codepoint" : 116 }, { "width" : 499, "codepoint" : 117 }, { "width" : 443, "codepoint" : 118 }, { "width" : 666, "codepoint" : 119 }, { "width" : 443, "codepoint" : 120 }, { "width" : 443, "codepoint" : 121 }, { "width" : 388, "codepoint" : 122 }, { "width" : 399, "codepoint" : 123 }, { "width" : 274, "codepoint" : 124 }, { "width" : 399, "codepoint" : 125 }, { "width" : 540, "codepoint" : 126 }, { "width" : 249, "codepoint" : 127 }, { "width" : 249, "codepoint" : 128 }, { "width" : 249, "codepoint" : 129 }, { "width" : 249, "codepoint" : 130 }, { "width" : 249, "codepoint" : 131 }, { "width" : 249, "codepoint" : 132 }, { "width" : 249, "codepoint" : 133 }, { "width" : 249, "codepoint" : 134 }, { "width" : 249, "codepoint" : 135 }, { "width" : 249, "codepoint" : 136 }, { "width" : 249, "codepoint" : 137 }, { "width" : 249, "codepoint" : 138 }, { "width" : 249, "codepoint" : 139 }, { "width" : 249, "codepoint" : 140 }, { "width" : 249, "codepoint" : 141 }, { "width" : 249, "codepoint" : 142 }, { "width" : 249, "codepoint" : 143 }, { "width" : 249, "codepoint" : 144 }, { "width" : 249, "codepoint" : 145 }, { "width" : 249, "codepoint" : 146 }, { "width" : 249, "codepoint" : 147 }, { "width" : 249, "codepoint" : 148 }, { "width" : 249, "codepoint" : 149 }, { "width" : 249, "codepoint" : 150 }, { "width" : 249, "codepoint" : 151 }, { "width" : 249, "codepoint" : 152 }, { "width" : 249, "codepoint" : 153 }, { "width" : 249, "codepoint" : 154 }, { "width" : 249, "codepoint" : 155 }, { "width" : 249, "codepoint" : 156 }, { "width" : 249, "codepoint" : 157 }, { "width" : 249, "codepoint" : 158 }, { "width" : 249, "codepoint" : 159 }, { "width" : 249, "codepoint" : 160 }, { "width" : 388, "codepoint" : 161 }, { "width" : 499, "codepoint" : 162 }, { "width" : 499, "codepoint" : 163 }, { "width" : 166, "codepoint" : 164 }, { "width" : 499, "codepoint" : 165 }, { "width" : 499, "codepoint" : 166 }, { "width" : 499, "codepoint" : 167 }, { "width" : 499, "codepoint" : 168 }, { "width" : 213, "codepoint" : 169 }, { "width" : 555, "codepoint" : 170 }, { "width" : 499, "codepoint" : 171 }, { "width" : 332, "codepoint" : 172 }, { "width" : 332, "codepoint" : 173 }, { "width" : 499, "codepoint" : 174 }, { "width" : 499, "codepoint" : 175 }, { "width" : 249, "codepoint" : 176 }, { "width" : 499, "codepoint" : 177 }, { "width" : 499, "codepoint" : 178 }, { "width" : 499, "codepoint" : 179 }, { "width" : 249, "codepoint" : 180 }, { "width" : 249, "codepoint" : 181 }, { "width" : 522, "codepoint" : 182 }, { "width" : 349, "codepoint" : 183 }, { "width" : 332, "codepoint" : 184 }, { "width" : 555, "codepoint" : 185 }, { "width" : 555, "codepoint" : 186 }, { "width" : 499, "codepoint" : 187 }, { "width" : 888, "codepoint" : 188 }, { "width" : 999, "codepoint" : 189 }, { "width" : 249, "codepoint" : 190 }, { "width" : 499, "codepoint" : 191 }, { "width" : 249, "codepoint" : 192 }, { "width" : 332, "codepoint" : 193 }, { "width" : 332, "codepoint" : 194 }, { "width" : 332, "codepoint" : 195 }, { "width" : 610, "codepoint" : 196 }, { "width" : 332, "codepoint" : 197 }, { "width" : 332, "codepoint" : 198 }, { "width" : 332, "codepoint" : 199 }, { "width" : 332, "codepoint" : 200 }, { "width" : 249, "codepoint" : 201 }, { "width" : 332, "codepoint" : 202 }, { "width" : 332, "codepoint" : 203 }, { "width" : 249, "codepoint" : 204 }, { "width" : 332, "codepoint" : 205 }, { "width" : 332, "codepoint" : 206 }, { "width" : 332, "codepoint" : 207 }, { "width" : 888, "codepoint" : 208 }, { "width" : 249, "codepoint" : 209 }, { "width" : 249, "codepoint" : 210 }, { "width" : 249, "codepoint" : 211 }, { "width" : 249, "codepoint" : 212 }, { "width" : 249, "codepoint" : 213 }, { "width" : 721, "codepoint" : 214 }, { "width" : 249, "codepoint" : 215 }, { "width" : 249, "codepoint" : 216 }, { "width" : 249, "codepoint" : 217 }, { "width" : 249, "codepoint" : 218 }, { "width" : 249, "codepoint" : 219 }, { "width" : 721, "codepoint" : 220 }, { "width" : 249, "codepoint" : 221 }, { "width" : 249, "codepoint" : 222 }, { "width" : 499, "codepoint" : 223 }, { "width" : 249, "codepoint" : 224 }, { "width" : 888, "codepoint" : 225 }, { "width" : 249, "codepoint" : 226 }, { "width" : 275, "codepoint" : 227 }, { "width" : 499, "codepoint" : 228 }, { "width" : 249, "codepoint" : 229 }, { "width" : 249, "codepoint" : 230 }, { "width" : 249, "codepoint" : 231 }, { "width" : 555, "codepoint" : 232 }, { "width" : 721, "codepoint" : 233 }, { "width" : 943, "codepoint" : 234 }, { "width" : 309, "codepoint" : 235 }, { "width" : 249, "codepoint" : 236 }, { "width" : 249, "codepoint" : 237 }, { "width" : 249, "codepoint" : 238 }, { "width" : 249, "codepoint" : 239 }, { "width" : 249, "codepoint" : 240 }, { "width" : 666, "codepoint" : 241 }, { "width" : 249, "codepoint" : 242 }, { "width" : 249, "codepoint" : 243 }, { "width" : 249, "codepoint" : 244 }, { "width" : 277, "codepoint" : 245 }, { "width" : 499, "codepoint" : 246 }, { "width" : 249, "codepoint" : 247 }, { "width" : 277, "codepoint" : 248 }, { "width" : 499, "codepoint" : 249 }, { "width" : 666, "codepoint" : 250 }, { "width" : 499, "codepoint" : 251 }, { "width" : 499, "codepoint" : 252 }, { "width" : 249, "codepoint" : 253 }, { "width" : 249, "codepoint" : 254 }, { "width" : 249, "codepoint" : 255 } ] PDF-Create-1.43/share/helvetica-oblique.json0000644000175000017500000003362612710765550020230 0ustar manwarmanwar[ { "width" : 277, "codepoint" : 0 }, { "width" : 277, "codepoint" : 1 }, { "width" : 277, "codepoint" : 2 }, { "width" : 277, "codepoint" : 3 }, { "width" : 277, "codepoint" : 4 }, { "width" : 277, "codepoint" : 5 }, { "width" : 277, "codepoint" : 6 }, { "width" : 277, "codepoint" : 7 }, { "width" : 277, "codepoint" : 8 }, { "width" : 277, "codepoint" : 9 }, { "width" : 277, "codepoint" : 10 }, { "width" : 277, "codepoint" : 11 }, { "width" : 277, "codepoint" : 12 }, { "width" : 277, "codepoint" : 13 }, { "width" : 277, "codepoint" : 14 }, { "width" : 277, "codepoint" : 15 }, { "width" : 277, "codepoint" : 16 }, { "width" : 277, "codepoint" : 17 }, { "width" : 277, "codepoint" : 18 }, { "width" : 277, "codepoint" : 19 }, { "width" : 277, "codepoint" : 20 }, { "width" : 277, "codepoint" : 21 }, { "width" : 277, "codepoint" : 22 }, { "width" : 277, "codepoint" : 23 }, { "width" : 277, "codepoint" : 24 }, { "width" : 277, "codepoint" : 25 }, { "width" : 277, "codepoint" : 26 }, { "width" : 277, "codepoint" : 27 }, { "width" : 277, "codepoint" : 28 }, { "width" : 277, "codepoint" : 29 }, { "width" : 277, "codepoint" : 30 }, { "width" : 277, "codepoint" : 31 }, { "width" : 277, "codepoint" : 32 }, { "width" : 277, "codepoint" : 33 }, { "width" : 354, "codepoint" : 34 }, { "width" : 555, "codepoint" : 35 }, { "width" : 555, "codepoint" : 36 }, { "width" : 888, "codepoint" : 37 }, { "width" : 666, "codepoint" : 38 }, { "width" : 221, "codepoint" : 39 }, { "width" : 332, "codepoint" : 40 }, { "width" : 332, "codepoint" : 41 }, { "width" : 388, "codepoint" : 42 }, { "width" : 583, "codepoint" : 43 }, { "width" : 277, "codepoint" : 44 }, { "width" : 332, "codepoint" : 45 }, { "width" : 277, "codepoint" : 46 }, { "width" : 277, "codepoint" : 47 }, { "width" : 555, "codepoint" : 48 }, { "width" : 555, "codepoint" : 49 }, { "width" : 555, "codepoint" : 50 }, { "width" : 555, "codepoint" : 51 }, { "width" : 555, "codepoint" : 52 }, { "width" : 555, "codepoint" : 53 }, { "width" : 555, "codepoint" : 54 }, { "width" : 555, "codepoint" : 55 }, { "width" : 555, "codepoint" : 56 }, { "width" : 555, "codepoint" : 57 }, { "width" : 277, "codepoint" : 58 }, { "width" : 277, "codepoint" : 59 }, { "width" : 583, "codepoint" : 60 }, { "width" : 583, "codepoint" : 61 }, { "width" : 583, "codepoint" : 62 }, { "width" : 555, "codepoint" : 63 }, { "width" : 1014, "codepoint" : 64 }, { "width" : 666, "codepoint" : 65 }, { "width" : 666, "codepoint" : 66 }, { "width" : 721, "codepoint" : 67 }, { "width" : 721, "codepoint" : 68 }, { "width" : 666, "codepoint" : 69 }, { "width" : 610, "codepoint" : 70 }, { "width" : 777, "codepoint" : 71 }, { "width" : 721, "codepoint" : 72 }, { "width" : 277, "codepoint" : 73 }, { "width" : 499, "codepoint" : 74 }, { "width" : 666, "codepoint" : 75 }, { "width" : 555, "codepoint" : 76 }, { "width" : 832, "codepoint" : 77 }, { "width" : 721, "codepoint" : 78 }, { "width" : 777, "codepoint" : 79 }, { "width" : 666, "codepoint" : 80 }, { "width" : 777, "codepoint" : 81 }, { "width" : 721, "codepoint" : 82 }, { "width" : 666, "codepoint" : 83 }, { "width" : 610, "codepoint" : 84 }, { "width" : 721, "codepoint" : 85 }, { "width" : 666, "codepoint" : 86 }, { "width" : 943, "codepoint" : 87 }, { "width" : 666, "codepoint" : 88 }, { "width" : 666, "codepoint" : 89 }, { "width" : 610, "codepoint" : 90 }, { "width" : 277, "codepoint" : 91 }, { "width" : 277, "codepoint" : 92 }, { "width" : 277, "codepoint" : 93 }, { "width" : 468, "codepoint" : 94 }, { "width" : 555, "codepoint" : 95 }, { "width" : 221, "codepoint" : 96 }, { "width" : 555, "codepoint" : 97 }, { "width" : 555, "codepoint" : 98 }, { "width" : 499, "codepoint" : 99 }, { "width" : 555, "codepoint" : 100 }, { "width" : 555, "codepoint" : 101 }, { "width" : 277, "codepoint" : 102 }, { "width" : 555, "codepoint" : 103 }, { "width" : 555, "codepoint" : 104 }, { "width" : 221, "codepoint" : 105 }, { "width" : 221, "codepoint" : 106 }, { "width" : 499, "codepoint" : 107 }, { "width" : 221, "codepoint" : 108 }, { "width" : 832, "codepoint" : 109 }, { "width" : 555, "codepoint" : 110 }, { "width" : 555, "codepoint" : 111 }, { "width" : 555, "codepoint" : 112 }, { "width" : 555, "codepoint" : 113 }, { "width" : 332, "codepoint" : 114 }, { "width" : 499, "codepoint" : 115 }, { "width" : 277, "codepoint" : 116 }, { "width" : 555, "codepoint" : 117 }, { "width" : 499, "codepoint" : 118 }, { "width" : 721, "codepoint" : 119 }, { "width" : 499, "codepoint" : 120 }, { "width" : 499, "codepoint" : 121 }, { "width" : 499, "codepoint" : 122 }, { "width" : 333, "codepoint" : 123 }, { "width" : 259, "codepoint" : 124 }, { "width" : 333, "codepoint" : 125 }, { "width" : 583, "codepoint" : 126 }, { "width" : 277, "codepoint" : 127 }, { "width" : 277, "codepoint" : 128 }, { "width" : 277, "codepoint" : 129 }, { "width" : 277, "codepoint" : 130 }, { "width" : 277, "codepoint" : 131 }, { "width" : 277, "codepoint" : 132 }, { "width" : 277, "codepoint" : 133 }, { "width" : 277, "codepoint" : 134 }, { "width" : 277, "codepoint" : 135 }, { "width" : 277, "codepoint" : 136 }, { "width" : 277, "codepoint" : 137 }, { "width" : 277, "codepoint" : 138 }, { "width" : 277, "codepoint" : 139 }, { "width" : 277, "codepoint" : 140 }, { "width" : 277, "codepoint" : 141 }, { "width" : 277, "codepoint" : 142 }, { "width" : 277, "codepoint" : 143 }, { "width" : 277, "codepoint" : 144 }, { "width" : 277, "codepoint" : 145 }, { "width" : 277, "codepoint" : 146 }, { "width" : 277, "codepoint" : 147 }, { "width" : 277, "codepoint" : 148 }, { "width" : 277, "codepoint" : 149 }, { "width" : 277, "codepoint" : 150 }, { "width" : 277, "codepoint" : 151 }, { "width" : 277, "codepoint" : 152 }, { "width" : 277, "codepoint" : 153 }, { "width" : 277, "codepoint" : 154 }, { "width" : 277, "codepoint" : 155 }, { "width" : 277, "codepoint" : 156 }, { "width" : 277, "codepoint" : 157 }, { "width" : 277, "codepoint" : 158 }, { "width" : 277, "codepoint" : 159 }, { "width" : 277, "codepoint" : 160 }, { "width" : 332, "codepoint" : 161 }, { "width" : 555, "codepoint" : 162 }, { "width" : 555, "codepoint" : 163 }, { "width" : 166, "codepoint" : 164 }, { "width" : 555, "codepoint" : 165 }, { "width" : 555, "codepoint" : 166 }, { "width" : 555, "codepoint" : 167 }, { "width" : 555, "codepoint" : 168 }, { "width" : 190, "codepoint" : 169 }, { "width" : 332, "codepoint" : 170 }, { "width" : 555, "codepoint" : 171 }, { "width" : 332, "codepoint" : 172 }, { "width" : 332, "codepoint" : 173 }, { "width" : 499, "codepoint" : 174 }, { "width" : 499, "codepoint" : 175 }, { "width" : 277, "codepoint" : 176 }, { "width" : 555, "codepoint" : 177 }, { "width" : 555, "codepoint" : 178 }, { "width" : 555, "codepoint" : 179 }, { "width" : 277, "codepoint" : 180 }, { "width" : 277, "codepoint" : 181 }, { "width" : 536, "codepoint" : 182 }, { "width" : 349, "codepoint" : 183 }, { "width" : 221, "codepoint" : 184 }, { "width" : 332, "codepoint" : 185 }, { "width" : 332, "codepoint" : 186 }, { "width" : 555, "codepoint" : 187 }, { "width" : 999, "codepoint" : 188 }, { "width" : 999, "codepoint" : 189 }, { "width" : 277, "codepoint" : 190 }, { "width" : 610, "codepoint" : 191 }, { "width" : 277, "codepoint" : 192 }, { "width" : 332, "codepoint" : 193 }, { "width" : 332, "codepoint" : 194 }, { "width" : 332, "codepoint" : 195 }, { "width" : 666, "codepoint" : 196 }, { "width" : 332, "codepoint" : 197 }, { "width" : 332, "codepoint" : 198 }, { "width" : 332, "codepoint" : 199 }, { "width" : 332, "codepoint" : 200 }, { "width" : 277, "codepoint" : 201 }, { "width" : 332, "codepoint" : 202 }, { "width" : 332, "codepoint" : 203 }, { "width" : 277, "codepoint" : 204 }, { "width" : 332, "codepoint" : 205 }, { "width" : 332, "codepoint" : 206 }, { "width" : 332, "codepoint" : 207 }, { "width" : 999, "codepoint" : 208 }, { "width" : 277, "codepoint" : 209 }, { "width" : 277, "codepoint" : 210 }, { "width" : 277, "codepoint" : 211 }, { "width" : 277, "codepoint" : 212 }, { "width" : 277, "codepoint" : 213 }, { "width" : 777, "codepoint" : 214 }, { "width" : 277, "codepoint" : 215 }, { "width" : 277, "codepoint" : 216 }, { "width" : 277, "codepoint" : 217 }, { "width" : 277, "codepoint" : 218 }, { "width" : 277, "codepoint" : 219 }, { "width" : 721, "codepoint" : 220 }, { "width" : 277, "codepoint" : 221 }, { "width" : 277, "codepoint" : 222 }, { "width" : 610, "codepoint" : 223 }, { "width" : 277, "codepoint" : 224 }, { "width" : 999, "codepoint" : 225 }, { "width" : 277, "codepoint" : 226 }, { "width" : 369, "codepoint" : 227 }, { "width" : 555, "codepoint" : 228 }, { "width" : 277, "codepoint" : 229 }, { "width" : 277, "codepoint" : 230 }, { "width" : 277, "codepoint" : 231 }, { "width" : 555, "codepoint" : 232 }, { "width" : 777, "codepoint" : 233 }, { "width" : 999, "codepoint" : 234 }, { "width" : 364, "codepoint" : 235 }, { "width" : 277, "codepoint" : 236 }, { "width" : 277, "codepoint" : 237 }, { "width" : 277, "codepoint" : 238 }, { "width" : 277, "codepoint" : 239 }, { "width" : 277, "codepoint" : 240 }, { "width" : 888, "codepoint" : 241 }, { "width" : 277, "codepoint" : 242 }, { "width" : 277, "codepoint" : 243 }, { "width" : 277, "codepoint" : 244 }, { "width" : 277, "codepoint" : 245 }, { "width" : 555, "codepoint" : 246 }, { "width" : 277, "codepoint" : 247 }, { "width" : 221, "codepoint" : 248 }, { "width" : 610, "codepoint" : 249 }, { "width" : 943, "codepoint" : 250 }, { "width" : 610, "codepoint" : 251 }, { "width" : 555, "codepoint" : 252 }, { "width" : 277, "codepoint" : 253 }, { "width" : 277, "codepoint" : 254 }, { "width" : 277, "codepoint" : 255 } ] PDF-Create-1.43/share/times-bolditalic.json0000644000175000017500000003362512710765550020052 0ustar manwarmanwar[ { "width" : 249, "codepoint" : 0 }, { "width" : 249, "codepoint" : 1 }, { "width" : 249, "codepoint" : 2 }, { "width" : 249, "codepoint" : 3 }, { "width" : 249, "codepoint" : 4 }, { "width" : 249, "codepoint" : 5 }, { "width" : 249, "codepoint" : 6 }, { "width" : 249, "codepoint" : 7 }, { "width" : 249, "codepoint" : 8 }, { "width" : 249, "codepoint" : 9 }, { "width" : 249, "codepoint" : 10 }, { "width" : 249, "codepoint" : 11 }, { "width" : 249, "codepoint" : 12 }, { "width" : 249, "codepoint" : 13 }, { "width" : 249, "codepoint" : 14 }, { "width" : 249, "codepoint" : 15 }, { "width" : 249, "codepoint" : 16 }, { "width" : 249, "codepoint" : 17 }, { "width" : 249, "codepoint" : 18 }, { "width" : 249, "codepoint" : 19 }, { "width" : 249, "codepoint" : 20 }, { "width" : 249, "codepoint" : 21 }, { "width" : 249, "codepoint" : 22 }, { "width" : 249, "codepoint" : 23 }, { "width" : 249, "codepoint" : 24 }, { "width" : 249, "codepoint" : 25 }, { "width" : 249, "codepoint" : 26 }, { "width" : 249, "codepoint" : 27 }, { "width" : 249, "codepoint" : 28 }, { "width" : 249, "codepoint" : 29 }, { "width" : 249, "codepoint" : 30 }, { "width" : 249, "codepoint" : 31 }, { "width" : 249, "codepoint" : 32 }, { "width" : 388, "codepoint" : 33 }, { "width" : 554, "codepoint" : 34 }, { "width" : 499, "codepoint" : 35 }, { "width" : 499, "codepoint" : 36 }, { "width" : 832, "codepoint" : 37 }, { "width" : 777, "codepoint" : 38 }, { "width" : 332, "codepoint" : 39 }, { "width" : 332, "codepoint" : 40 }, { "width" : 332, "codepoint" : 41 }, { "width" : 499, "codepoint" : 42 }, { "width" : 569, "codepoint" : 43 }, { "width" : 249, "codepoint" : 44 }, { "width" : 332, "codepoint" : 45 }, { "width" : 249, "codepoint" : 46 }, { "width" : 277, "codepoint" : 47 }, { "width" : 499, "codepoint" : 48 }, { "width" : 499, "codepoint" : 49 }, { "width" : 499, "codepoint" : 50 }, { "width" : 499, "codepoint" : 51 }, { "width" : 499, "codepoint" : 52 }, { "width" : 499, "codepoint" : 53 }, { "width" : 499, "codepoint" : 54 }, { "width" : 499, "codepoint" : 55 }, { "width" : 499, "codepoint" : 56 }, { "width" : 499, "codepoint" : 57 }, { "width" : 332, "codepoint" : 58 }, { "width" : 332, "codepoint" : 59 }, { "width" : 569, "codepoint" : 60 }, { "width" : 569, "codepoint" : 61 }, { "width" : 569, "codepoint" : 62 }, { "width" : 499, "codepoint" : 63 }, { "width" : 831, "codepoint" : 64 }, { "width" : 666, "codepoint" : 65 }, { "width" : 666, "codepoint" : 66 }, { "width" : 666, "codepoint" : 67 }, { "width" : 721, "codepoint" : 68 }, { "width" : 666, "codepoint" : 69 }, { "width" : 666, "codepoint" : 70 }, { "width" : 721, "codepoint" : 71 }, { "width" : 777, "codepoint" : 72 }, { "width" : 388, "codepoint" : 73 }, { "width" : 499, "codepoint" : 74 }, { "width" : 666, "codepoint" : 75 }, { "width" : 610, "codepoint" : 76 }, { "width" : 888, "codepoint" : 77 }, { "width" : 721, "codepoint" : 78 }, { "width" : 721, "codepoint" : 79 }, { "width" : 610, "codepoint" : 80 }, { "width" : 721, "codepoint" : 81 }, { "width" : 666, "codepoint" : 82 }, { "width" : 555, "codepoint" : 83 }, { "width" : 610, "codepoint" : 84 }, { "width" : 721, "codepoint" : 85 }, { "width" : 666, "codepoint" : 86 }, { "width" : 888, "codepoint" : 87 }, { "width" : 666, "codepoint" : 88 }, { "width" : 610, "codepoint" : 89 }, { "width" : 610, "codepoint" : 90 }, { "width" : 332, "codepoint" : 91 }, { "width" : 277, "codepoint" : 92 }, { "width" : 332, "codepoint" : 93 }, { "width" : 569, "codepoint" : 94 }, { "width" : 499, "codepoint" : 95 }, { "width" : 332, "codepoint" : 96 }, { "width" : 499, "codepoint" : 97 }, { "width" : 499, "codepoint" : 98 }, { "width" : 443, "codepoint" : 99 }, { "width" : 499, "codepoint" : 100 }, { "width" : 443, "codepoint" : 101 }, { "width" : 332, "codepoint" : 102 }, { "width" : 499, "codepoint" : 103 }, { "width" : 555, "codepoint" : 104 }, { "width" : 277, "codepoint" : 105 }, { "width" : 277, "codepoint" : 106 }, { "width" : 499, "codepoint" : 107 }, { "width" : 277, "codepoint" : 108 }, { "width" : 777, "codepoint" : 109 }, { "width" : 555, "codepoint" : 110 }, { "width" : 499, "codepoint" : 111 }, { "width" : 499, "codepoint" : 112 }, { "width" : 499, "codepoint" : 113 }, { "width" : 388, "codepoint" : 114 }, { "width" : 388, "codepoint" : 115 }, { "width" : 277, "codepoint" : 116 }, { "width" : 555, "codepoint" : 117 }, { "width" : 443, "codepoint" : 118 }, { "width" : 666, "codepoint" : 119 }, { "width" : 499, "codepoint" : 120 }, { "width" : 443, "codepoint" : 121 }, { "width" : 388, "codepoint" : 122 }, { "width" : 347, "codepoint" : 123 }, { "width" : 219, "codepoint" : 124 }, { "width" : 347, "codepoint" : 125 }, { "width" : 569, "codepoint" : 126 }, { "width" : 249, "codepoint" : 127 }, { "width" : 249, "codepoint" : 128 }, { "width" : 249, "codepoint" : 129 }, { "width" : 249, "codepoint" : 130 }, { "width" : 249, "codepoint" : 131 }, { "width" : 249, "codepoint" : 132 }, { "width" : 249, "codepoint" : 133 }, { "width" : 249, "codepoint" : 134 }, { "width" : 249, "codepoint" : 135 }, { "width" : 249, "codepoint" : 136 }, { "width" : 249, "codepoint" : 137 }, { "width" : 249, "codepoint" : 138 }, { "width" : 249, "codepoint" : 139 }, { "width" : 249, "codepoint" : 140 }, { "width" : 249, "codepoint" : 141 }, { "width" : 249, "codepoint" : 142 }, { "width" : 249, "codepoint" : 143 }, { "width" : 249, "codepoint" : 144 }, { "width" : 249, "codepoint" : 145 }, { "width" : 249, "codepoint" : 146 }, { "width" : 249, "codepoint" : 147 }, { "width" : 249, "codepoint" : 148 }, { "width" : 249, "codepoint" : 149 }, { "width" : 249, "codepoint" : 150 }, { "width" : 249, "codepoint" : 151 }, { "width" : 249, "codepoint" : 152 }, { "width" : 249, "codepoint" : 153 }, { "width" : 249, "codepoint" : 154 }, { "width" : 249, "codepoint" : 155 }, { "width" : 249, "codepoint" : 156 }, { "width" : 249, "codepoint" : 157 }, { "width" : 249, "codepoint" : 158 }, { "width" : 249, "codepoint" : 159 }, { "width" : 249, "codepoint" : 160 }, { "width" : 388, "codepoint" : 161 }, { "width" : 499, "codepoint" : 162 }, { "width" : 499, "codepoint" : 163 }, { "width" : 166, "codepoint" : 164 }, { "width" : 499, "codepoint" : 165 }, { "width" : 499, "codepoint" : 166 }, { "width" : 499, "codepoint" : 167 }, { "width" : 499, "codepoint" : 168 }, { "width" : 277, "codepoint" : 169 }, { "width" : 499, "codepoint" : 170 }, { "width" : 499, "codepoint" : 171 }, { "width" : 332, "codepoint" : 172 }, { "width" : 332, "codepoint" : 173 }, { "width" : 555, "codepoint" : 174 }, { "width" : 555, "codepoint" : 175 }, { "width" : 249, "codepoint" : 176 }, { "width" : 499, "codepoint" : 177 }, { "width" : 499, "codepoint" : 178 }, { "width" : 499, "codepoint" : 179 }, { "width" : 249, "codepoint" : 180 }, { "width" : 249, "codepoint" : 181 }, { "width" : 499, "codepoint" : 182 }, { "width" : 349, "codepoint" : 183 }, { "width" : 332, "codepoint" : 184 }, { "width" : 499, "codepoint" : 185 }, { "width" : 499, "codepoint" : 186 }, { "width" : 499, "codepoint" : 187 }, { "width" : 999, "codepoint" : 188 }, { "width" : 999, "codepoint" : 189 }, { "width" : 249, "codepoint" : 190 }, { "width" : 499, "codepoint" : 191 }, { "width" : 249, "codepoint" : 192 }, { "width" : 332, "codepoint" : 193 }, { "width" : 332, "codepoint" : 194 }, { "width" : 332, "codepoint" : 195 }, { "width" : 666, "codepoint" : 196 }, { "width" : 332, "codepoint" : 197 }, { "width" : 332, "codepoint" : 198 }, { "width" : 332, "codepoint" : 199 }, { "width" : 332, "codepoint" : 200 }, { "width" : 249, "codepoint" : 201 }, { "width" : 332, "codepoint" : 202 }, { "width" : 332, "codepoint" : 203 }, { "width" : 249, "codepoint" : 204 }, { "width" : 332, "codepoint" : 205 }, { "width" : 332, "codepoint" : 206 }, { "width" : 332, "codepoint" : 207 }, { "width" : 999, "codepoint" : 208 }, { "width" : 249, "codepoint" : 209 }, { "width" : 249, "codepoint" : 210 }, { "width" : 249, "codepoint" : 211 }, { "width" : 249, "codepoint" : 212 }, { "width" : 249, "codepoint" : 213 }, { "width" : 721, "codepoint" : 214 }, { "width" : 249, "codepoint" : 215 }, { "width" : 249, "codepoint" : 216 }, { "width" : 249, "codepoint" : 217 }, { "width" : 249, "codepoint" : 218 }, { "width" : 249, "codepoint" : 219 }, { "width" : 721, "codepoint" : 220 }, { "width" : 249, "codepoint" : 221 }, { "width" : 249, "codepoint" : 222 }, { "width" : 499, "codepoint" : 223 }, { "width" : 249, "codepoint" : 224 }, { "width" : 943, "codepoint" : 225 }, { "width" : 249, "codepoint" : 226 }, { "width" : 265, "codepoint" : 227 }, { "width" : 499, "codepoint" : 228 }, { "width" : 249, "codepoint" : 229 }, { "width" : 249, "codepoint" : 230 }, { "width" : 249, "codepoint" : 231 }, { "width" : 610, "codepoint" : 232 }, { "width" : 721, "codepoint" : 233 }, { "width" : 943, "codepoint" : 234 }, { "width" : 299, "codepoint" : 235 }, { "width" : 249, "codepoint" : 236 }, { "width" : 249, "codepoint" : 237 }, { "width" : 249, "codepoint" : 238 }, { "width" : 249, "codepoint" : 239 }, { "width" : 249, "codepoint" : 240 }, { "width" : 721, "codepoint" : 241 }, { "width" : 249, "codepoint" : 242 }, { "width" : 249, "codepoint" : 243 }, { "width" : 249, "codepoint" : 244 }, { "width" : 277, "codepoint" : 245 }, { "width" : 499, "codepoint" : 246 }, { "width" : 249, "codepoint" : 247 }, { "width" : 277, "codepoint" : 248 }, { "width" : 499, "codepoint" : 249 }, { "width" : 721, "codepoint" : 250 }, { "width" : 499, "codepoint" : 251 }, { "width" : 555, "codepoint" : 252 }, { "width" : 249, "codepoint" : 253 }, { "width" : 249, "codepoint" : 254 }, { "width" : 249, "codepoint" : 255 } ] PDF-Create-1.43/share/courier-boldoblique.json0000644000175000017500000003362512710765550020574 0ustar manwarmanwar[ { "width" : 599, "codepoint" : 0 }, { "width" : 599, "codepoint" : 1 }, { "width" : 599, "codepoint" : 2 }, { "width" : 599, "codepoint" : 3 }, { "width" : 599, "codepoint" : 4 }, { "width" : 599, "codepoint" : 5 }, { "width" : 599, "codepoint" : 6 }, { "width" : 599, "codepoint" : 7 }, { "width" : 599, "codepoint" : 8 }, { "width" : 599, "codepoint" : 9 }, { "width" : 599, "codepoint" : 10 }, { "width" : 599, "codepoint" : 11 }, { "width" : 599, "codepoint" : 12 }, { "width" : 599, "codepoint" : 13 }, { "width" : 599, "codepoint" : 14 }, { "width" : 599, "codepoint" : 15 }, { "width" : 599, "codepoint" : 16 }, { "width" : 599, "codepoint" : 17 }, { "width" : 599, "codepoint" : 18 }, { "width" : 599, "codepoint" : 19 }, { "width" : 599, "codepoint" : 20 }, { "width" : 599, "codepoint" : 21 }, { "width" : 599, "codepoint" : 22 }, { "width" : 599, "codepoint" : 23 }, { "width" : 599, "codepoint" : 24 }, { "width" : 599, "codepoint" : 25 }, { "width" : 599, "codepoint" : 26 }, { "width" : 599, "codepoint" : 27 }, { "width" : 599, "codepoint" : 28 }, { "width" : 599, "codepoint" : 29 }, { "width" : 599, "codepoint" : 30 }, { "width" : 599, "codepoint" : 31 }, { "width" : 599, "codepoint" : 32 }, { "width" : 599, "codepoint" : 33 }, { "width" : 599, "codepoint" : 34 }, { "width" : 599, "codepoint" : 35 }, { "width" : 599, "codepoint" : 36 }, { "width" : 599, "codepoint" : 37 }, { "width" : 599, "codepoint" : 38 }, { "width" : 599, "codepoint" : 39 }, { "width" : 599, "codepoint" : 40 }, { "width" : 599, "codepoint" : 41 }, { "width" : 599, "codepoint" : 42 }, { "width" : 599, "codepoint" : 43 }, { "width" : 599, "codepoint" : 44 }, { "width" : 599, "codepoint" : 45 }, { "width" : 599, "codepoint" : 46 }, { "width" : 599, "codepoint" : 47 }, { "width" : 599, "codepoint" : 48 }, { "width" : 599, "codepoint" : 49 }, { "width" : 599, "codepoint" : 50 }, { "width" : 599, "codepoint" : 51 }, { "width" : 599, "codepoint" : 52 }, { "width" : 599, "codepoint" : 53 }, { "width" : 599, "codepoint" : 54 }, { "width" : 599, "codepoint" : 55 }, { "width" : 599, "codepoint" : 56 }, { "width" : 599, "codepoint" : 57 }, { "width" : 599, "codepoint" : 58 }, { "width" : 599, "codepoint" : 59 }, { "width" : 599, "codepoint" : 60 }, { "width" : 599, "codepoint" : 61 }, { "width" : 599, "codepoint" : 62 }, { "width" : 599, "codepoint" : 63 }, { "width" : 599, "codepoint" : 64 }, { "width" : 599, "codepoint" : 65 }, { "width" : 599, "codepoint" : 66 }, { "width" : 599, "codepoint" : 67 }, { "width" : 599, "codepoint" : 68 }, { "width" : 599, "codepoint" : 69 }, { "width" : 599, "codepoint" : 70 }, { "width" : 599, "codepoint" : 71 }, { "width" : 599, "codepoint" : 72 }, { "width" : 599, "codepoint" : 73 }, { "width" : 599, "codepoint" : 74 }, { "width" : 599, "codepoint" : 75 }, { "width" : 599, "codepoint" : 76 }, { "width" : 599, "codepoint" : 77 }, { "width" : 599, "codepoint" : 78 }, { "width" : 599, "codepoint" : 79 }, { "width" : 599, "codepoint" : 80 }, { "width" : 599, "codepoint" : 81 }, { "width" : 599, "codepoint" : 82 }, { "width" : 599, "codepoint" : 83 }, { "width" : 599, "codepoint" : 84 }, { "width" : 599, "codepoint" : 85 }, { "width" : 599, "codepoint" : 86 }, { "width" : 599, "codepoint" : 87 }, { "width" : 599, "codepoint" : 88 }, { "width" : 599, "codepoint" : 89 }, { "width" : 599, "codepoint" : 90 }, { "width" : 599, "codepoint" : 91 }, { "width" : 599, "codepoint" : 92 }, { "width" : 599, "codepoint" : 93 }, { "width" : 599, "codepoint" : 94 }, { "width" : 599, "codepoint" : 95 }, { "width" : 599, "codepoint" : 96 }, { "width" : 599, "codepoint" : 97 }, { "width" : 599, "codepoint" : 98 }, { "width" : 599, "codepoint" : 99 }, { "width" : 599, "codepoint" : 100 }, { "width" : 599, "codepoint" : 101 }, { "width" : 599, "codepoint" : 102 }, { "width" : 599, "codepoint" : 103 }, { "width" : 599, "codepoint" : 104 }, { "width" : 599, "codepoint" : 105 }, { "width" : 599, "codepoint" : 106 }, { "width" : 599, "codepoint" : 107 }, { "width" : 599, "codepoint" : 108 }, { "width" : 599, "codepoint" : 109 }, { "width" : 599, "codepoint" : 110 }, { "width" : 599, "codepoint" : 111 }, { "width" : 599, "codepoint" : 112 }, { "width" : 599, "codepoint" : 113 }, { "width" : 599, "codepoint" : 114 }, { "width" : 599, "codepoint" : 115 }, { "width" : 599, "codepoint" : 116 }, { "width" : 599, "codepoint" : 117 }, { "width" : 599, "codepoint" : 118 }, { "width" : 599, "codepoint" : 119 }, { "width" : 599, "codepoint" : 120 }, { "width" : 599, "codepoint" : 121 }, { "width" : 599, "codepoint" : 122 }, { "width" : 599, "codepoint" : 123 }, { "width" : 599, "codepoint" : 124 }, { "width" : 599, "codepoint" : 125 }, { "width" : 599, "codepoint" : 126 }, { "width" : 599, "codepoint" : 127 }, { "width" : 599, "codepoint" : 128 }, { "width" : 599, "codepoint" : 129 }, { "width" : 599, "codepoint" : 130 }, { "width" : 599, "codepoint" : 131 }, { "width" : 599, "codepoint" : 132 }, { "width" : 599, "codepoint" : 133 }, { "width" : 599, "codepoint" : 134 }, { "width" : 599, "codepoint" : 135 }, { "width" : 599, "codepoint" : 136 }, { "width" : 599, "codepoint" : 137 }, { "width" : 599, "codepoint" : 138 }, { "width" : 599, "codepoint" : 139 }, { "width" : 599, "codepoint" : 140 }, { "width" : 599, "codepoint" : 141 }, { "width" : 599, "codepoint" : 142 }, { "width" : 599, "codepoint" : 143 }, { "width" : 599, "codepoint" : 144 }, { "width" : 599, "codepoint" : 145 }, { "width" : 599, "codepoint" : 146 }, { "width" : 599, "codepoint" : 147 }, { "width" : 599, "codepoint" : 148 }, { "width" : 599, "codepoint" : 149 }, { "width" : 599, "codepoint" : 150 }, { "width" : 599, "codepoint" : 151 }, { "width" : 599, "codepoint" : 152 }, { "width" : 599, "codepoint" : 153 }, { "width" : 599, "codepoint" : 154 }, { "width" : 599, "codepoint" : 155 }, { "width" : 599, "codepoint" : 156 }, { "width" : 599, "codepoint" : 157 }, { "width" : 599, "codepoint" : 158 }, { "width" : 599, "codepoint" : 159 }, { "width" : 599, "codepoint" : 160 }, { "width" : 599, "codepoint" : 161 }, { "width" : 599, "codepoint" : 162 }, { "width" : 599, "codepoint" : 163 }, { "width" : 599, "codepoint" : 164 }, { "width" : 599, "codepoint" : 165 }, { "width" : 599, "codepoint" : 166 }, { "width" : 599, "codepoint" : 167 }, { "width" : 599, "codepoint" : 168 }, { "width" : 599, "codepoint" : 169 }, { "width" : 599, "codepoint" : 170 }, { "width" : 599, "codepoint" : 171 }, { "width" : 599, "codepoint" : 172 }, { "width" : 599, "codepoint" : 173 }, { "width" : 599, "codepoint" : 174 }, { "width" : 599, "codepoint" : 175 }, { "width" : 599, "codepoint" : 176 }, { "width" : 599, "codepoint" : 177 }, { "width" : 599, "codepoint" : 178 }, { "width" : 599, "codepoint" : 179 }, { "width" : 599, "codepoint" : 180 }, { "width" : 599, "codepoint" : 181 }, { "width" : 599, "codepoint" : 182 }, { "width" : 599, "codepoint" : 183 }, { "width" : 599, "codepoint" : 184 }, { "width" : 599, "codepoint" : 185 }, { "width" : 599, "codepoint" : 186 }, { "width" : 599, "codepoint" : 187 }, { "width" : 599, "codepoint" : 188 }, { "width" : 599, "codepoint" : 189 }, { "width" : 599, "codepoint" : 190 }, { "width" : 599, "codepoint" : 191 }, { "width" : 599, "codepoint" : 192 }, { "width" : 599, "codepoint" : 193 }, { "width" : 599, "codepoint" : 194 }, { "width" : 599, "codepoint" : 195 }, { "width" : 599, "codepoint" : 196 }, { "width" : 599, "codepoint" : 197 }, { "width" : 599, "codepoint" : 198 }, { "width" : 599, "codepoint" : 199 }, { "width" : 599, "codepoint" : 200 }, { "width" : 599, "codepoint" : 201 }, { "width" : 599, "codepoint" : 202 }, { "width" : 599, "codepoint" : 203 }, { "width" : 599, "codepoint" : 204 }, { "width" : 599, "codepoint" : 205 }, { "width" : 599, "codepoint" : 206 }, { "width" : 599, "codepoint" : 207 }, { "width" : 599, "codepoint" : 208 }, { "width" : 599, "codepoint" : 209 }, { "width" : 599, "codepoint" : 210 }, { "width" : 599, "codepoint" : 211 }, { "width" : 599, "codepoint" : 212 }, { "width" : 599, "codepoint" : 213 }, { "width" : 599, "codepoint" : 214 }, { "width" : 599, "codepoint" : 215 }, { "width" : 599, "codepoint" : 216 }, { "width" : 599, "codepoint" : 217 }, { "width" : 599, "codepoint" : 218 }, { "width" : 599, "codepoint" : 219 }, { "width" : 599, "codepoint" : 220 }, { "width" : 599, "codepoint" : 221 }, { "width" : 599, "codepoint" : 222 }, { "width" : 599, "codepoint" : 223 }, { "width" : 599, "codepoint" : 224 }, { "width" : 599, "codepoint" : 225 }, { "width" : 599, "codepoint" : 226 }, { "width" : 599, "codepoint" : 227 }, { "width" : 599, "codepoint" : 228 }, { "width" : 599, "codepoint" : 229 }, { "width" : 599, "codepoint" : 230 }, { "width" : 599, "codepoint" : 231 }, { "width" : 599, "codepoint" : 232 }, { "width" : 599, "codepoint" : 233 }, { "width" : 599, "codepoint" : 234 }, { "width" : 599, "codepoint" : 235 }, { "width" : 599, "codepoint" : 236 }, { "width" : 599, "codepoint" : 237 }, { "width" : 599, "codepoint" : 238 }, { "width" : 599, "codepoint" : 239 }, { "width" : 599, "codepoint" : 240 }, { "width" : 599, "codepoint" : 241 }, { "width" : 599, "codepoint" : 242 }, { "width" : 599, "codepoint" : 243 }, { "width" : 599, "codepoint" : 244 }, { "width" : 599, "codepoint" : 245 }, { "width" : 599, "codepoint" : 246 }, { "width" : 599, "codepoint" : 247 }, { "width" : 599, "codepoint" : 248 }, { "width" : 599, "codepoint" : 249 }, { "width" : 599, "codepoint" : 250 }, { "width" : 599, "codepoint" : 251 }, { "width" : 599, "codepoint" : 252 }, { "width" : 599, "codepoint" : 253 }, { "width" : 599, "codepoint" : 254 }, { "width" : 599, "codepoint" : 255 } ] PDF-Create-1.43/share/helvetica.json0000644000175000017500000003362612716371451016571 0ustar manwarmanwar[ { "width" : 277, "codepoint" : 0 }, { "width" : 277, "codepoint" : 1 }, { "width" : 277, "codepoint" : 2 }, { "width" : 277, "codepoint" : 3 }, { "width" : 277, "codepoint" : 4 }, { "width" : 277, "codepoint" : 5 }, { "width" : 277, "codepoint" : 6 }, { "width" : 277, "codepoint" : 7 }, { "width" : 277, "codepoint" : 8 }, { "width" : 277, "codepoint" : 9 }, { "width" : 277, "codepoint" : 10 }, { "width" : 277, "codepoint" : 11 }, { "width" : 277, "codepoint" : 12 }, { "width" : 277, "codepoint" : 13 }, { "width" : 277, "codepoint" : 14 }, { "width" : 277, "codepoint" : 15 }, { "width" : 277, "codepoint" : 16 }, { "width" : 277, "codepoint" : 17 }, { "width" : 277, "codepoint" : 18 }, { "width" : 277, "codepoint" : 19 }, { "width" : 277, "codepoint" : 20 }, { "width" : 277, "codepoint" : 21 }, { "width" : 277, "codepoint" : 22 }, { "width" : 277, "codepoint" : 23 }, { "width" : 277, "codepoint" : 24 }, { "width" : 277, "codepoint" : 25 }, { "width" : 277, "codepoint" : 26 }, { "width" : 277, "codepoint" : 27 }, { "width" : 277, "codepoint" : 28 }, { "width" : 277, "codepoint" : 29 }, { "width" : 277, "codepoint" : 30 }, { "width" : 277, "codepoint" : 31 }, { "width" : 277, "codepoint" : 32 }, { "width" : 277, "codepoint" : 33 }, { "width" : 354, "codepoint" : 34 }, { "width" : 555, "codepoint" : 35 }, { "width" : 555, "codepoint" : 36 }, { "width" : 888, "codepoint" : 37 }, { "width" : 666, "codepoint" : 38 }, { "width" : 220, "codepoint" : 39 }, { "width" : 332, "codepoint" : 40 }, { "width" : 332, "codepoint" : 41 }, { "width" : 388, "codepoint" : 42 }, { "width" : 583, "codepoint" : 43 }, { "width" : 277, "codepoint" : 44 }, { "width" : 332, "codepoint" : 45 }, { "width" : 277, "codepoint" : 46 }, { "width" : 277, "codepoint" : 47 }, { "width" : 555, "codepoint" : 48 }, { "width" : 555, "codepoint" : 49 }, { "width" : 555, "codepoint" : 50 }, { "width" : 555, "codepoint" : 51 }, { "width" : 555, "codepoint" : 52 }, { "width" : 555, "codepoint" : 53 }, { "width" : 555, "codepoint" : 54 }, { "width" : 555, "codepoint" : 55 }, { "width" : 555, "codepoint" : 56 }, { "width" : 555, "codepoint" : 57 }, { "width" : 277, "codepoint" : 58 }, { "width" : 277, "codepoint" : 59 }, { "width" : 583, "codepoint" : 60 }, { "width" : 583, "codepoint" : 61 }, { "width" : 583, "codepoint" : 62 }, { "width" : 555, "codepoint" : 63 }, { "width" : 1014, "codepoint" : 64 }, { "width" : 666, "codepoint" : 65 }, { "width" : 666, "codepoint" : 66 }, { "width" : 721, "codepoint" : 67 }, { "width" : 721, "codepoint" : 68 }, { "width" : 666, "codepoint" : 69 }, { "width" : 610, "codepoint" : 70 }, { "width" : 777, "codepoint" : 71 }, { "width" : 721, "codepoint" : 72 }, { "width" : 277, "codepoint" : 73 }, { "width" : 499, "codepoint" : 74 }, { "width" : 666, "codepoint" : 75 }, { "width" : 555, "codepoint" : 76 }, { "width" : 832, "codepoint" : 77 }, { "width" : 721, "codepoint" : 78 }, { "width" : 777, "codepoint" : 79 }, { "width" : 666, "codepoint" : 80 }, { "width" : 777, "codepoint" : 81 }, { "width" : 721, "codepoint" : 82 }, { "width" : 666, "codepoint" : 83 }, { "width" : 610, "codepoint" : 84 }, { "width" : 721, "codepoint" : 85 }, { "width" : 666, "codepoint" : 86 }, { "width" : 943, "codepoint" : 87 }, { "width" : 666, "codepoint" : 88 }, { "width" : 666, "codepoint" : 89 }, { "width" : 610, "codepoint" : 90 }, { "width" : 277, "codepoint" : 91 }, { "width" : 277, "codepoint" : 92 }, { "width" : 277, "codepoint" : 93 }, { "width" : 468, "codepoint" : 94 }, { "width" : 555, "codepoint" : 95 }, { "width" : 221, "codepoint" : 96 }, { "width" : 555, "codepoint" : 97 }, { "width" : 555, "codepoint" : 98 }, { "width" : 499, "codepoint" : 99 }, { "width" : 555, "codepoint" : 100 }, { "width" : 555, "codepoint" : 101 }, { "width" : 277, "codepoint" : 102 }, { "width" : 555, "codepoint" : 103 }, { "width" : 555, "codepoint" : 104 }, { "width" : 221, "codepoint" : 105 }, { "width" : 221, "codepoint" : 106 }, { "width" : 499, "codepoint" : 107 }, { "width" : 221, "codepoint" : 108 }, { "width" : 832, "codepoint" : 109 }, { "width" : 555, "codepoint" : 110 }, { "width" : 555, "codepoint" : 111 }, { "width" : 555, "codepoint" : 112 }, { "width" : 555, "codepoint" : 113 }, { "width" : 332, "codepoint" : 114 }, { "width" : 499, "codepoint" : 115 }, { "width" : 277, "codepoint" : 116 }, { "width" : 555, "codepoint" : 117 }, { "width" : 499, "codepoint" : 118 }, { "width" : 721, "codepoint" : 119 }, { "width" : 499, "codepoint" : 120 }, { "width" : 499, "codepoint" : 121 }, { "width" : 499, "codepoint" : 122 }, { "width" : 333, "codepoint" : 123 }, { "width" : 259, "codepoint" : 124 }, { "width" : 333, "codepoint" : 125 }, { "width" : 583, "codepoint" : 126 }, { "width" : 277, "codepoint" : 127 }, { "width" : 277, "codepoint" : 128 }, { "width" : 277, "codepoint" : 129 }, { "width" : 277, "codepoint" : 130 }, { "width" : 277, "codepoint" : 131 }, { "width" : 277, "codepoint" : 132 }, { "width" : 277, "codepoint" : 133 }, { "width" : 277, "codepoint" : 134 }, { "width" : 277, "codepoint" : 135 }, { "width" : 277, "codepoint" : 136 }, { "width" : 277, "codepoint" : 137 }, { "width" : 277, "codepoint" : 138 }, { "width" : 277, "codepoint" : 139 }, { "width" : 277, "codepoint" : 140 }, { "width" : 277, "codepoint" : 141 }, { "width" : 277, "codepoint" : 142 }, { "width" : 277, "codepoint" : 143 }, { "width" : 277, "codepoint" : 144 }, { "width" : 277, "codepoint" : 145 }, { "width" : 277, "codepoint" : 146 }, { "width" : 277, "codepoint" : 147 }, { "width" : 277, "codepoint" : 148 }, { "width" : 277, "codepoint" : 149 }, { "width" : 277, "codepoint" : 150 }, { "width" : 277, "codepoint" : 151 }, { "width" : 277, "codepoint" : 152 }, { "width" : 277, "codepoint" : 153 }, { "width" : 277, "codepoint" : 154 }, { "width" : 277, "codepoint" : 155 }, { "width" : 277, "codepoint" : 156 }, { "width" : 277, "codepoint" : 157 }, { "width" : 277, "codepoint" : 158 }, { "width" : 277, "codepoint" : 159 }, { "width" : 277, "codepoint" : 160 }, { "width" : 332, "codepoint" : 161 }, { "width" : 555, "codepoint" : 162 }, { "width" : 555, "codepoint" : 163 }, { "width" : 555, "codepoint" : 164 }, { "width" : 555, "codepoint" : 165 }, { "width" : 333, "codepoint" : 166 }, { "width" : 555, "codepoint" : 167 }, { "width" : 444, "codepoint" : 168 }, { "width" : 666, "codepoint" : 169 }, { "width" : 332, "codepoint" : 170 }, { "width" : 555, "codepoint" : 171 }, { "width" : 555, "codepoint" : 172 }, { "width" : 332, "codepoint" : 173 }, { "width" : 832, "codepoint" : 174 }, { "width" : 499, "codepoint" : 175 }, { "width" : 499, "codepoint" : 176 }, { "width" : 555, "codepoint" : 177 }, { "width" : 555, "codepoint" : 178 }, { "width" : 555, "codepoint" : 179 }, { "width" : 277, "codepoint" : 180 }, { "width" : 555, "codepoint" : 181 }, { "width" : 536, "codepoint" : 182 }, { "width" : 349, "codepoint" : 183 }, { "width" : 349, "codepoint" : 184 }, { "width" : 332, "codepoint" : 185 }, { "width" : 332, "codepoint" : 186 }, { "width" : 555, "codepoint" : 187 }, { "width" : 999, "codepoint" : 188 }, { "width" : 999, "codepoint" : 189 }, { "width" : 999, "codepoint" : 190 }, { "width" : 610, "codepoint" : 191 }, { "width" : 666, "codepoint" : 192 }, { "width" : 666, "codepoint" : 193 }, { "width" : 666, "codepoint" : 194 }, { "width" : 666, "codepoint" : 195 }, { "width" : 666, "codepoint" : 196 }, { "width" : 666, "codepoint" : 197 }, { "width" : 888, "codepoint" : 198 }, { "width" : 666, "codepoint" : 199 }, { "width" : 666, "codepoint" : 200 }, { "width" : 666, "codepoint" : 201 }, { "width" : 666, "codepoint" : 202 }, { "width" : 666, "codepoint" : 203 }, { "width" : 277, "codepoint" : 204 }, { "width" : 332, "codepoint" : 205 }, { "width" : 332, "codepoint" : 206 }, { "width" : 332, "codepoint" : 207 }, { "width" : 666, "codepoint" : 208 }, { "width" : 666, "codepoint" : 209 }, { "width" : 700, "codepoint" : 210 }, { "width" : 700, "codepoint" : 211 }, { "width" : 700, "codepoint" : 212 }, { "width" : 700, "codepoint" : 213 }, { "width" : 700, "codepoint" : 214 }, { "width" : 610, "codepoint" : 215 }, { "width" : 666, "codepoint" : 216 }, { "width" : 721, "codepoint" : 217 }, { "width" : 721, "codepoint" : 218 }, { "width" : 721, "codepoint" : 219 }, { "width" : 721, "codepoint" : 220 }, { "width" : 700, "codepoint" : 221 }, { "width" : 700, "codepoint" : 222 }, { "width" : 610, "codepoint" : 223 }, { "width" : 555, "codepoint" : 224 }, { "width" : 555, "codepoint" : 225 }, { "width" : 555, "codepoint" : 226 }, { "width" : 555, "codepoint" : 227 }, { "width" : 555, "codepoint" : 228 }, { "width" : 555, "codepoint" : 229 }, { "width" : 888, "codepoint" : 230 }, { "width" : 555, "codepoint" : 231 }, { "width" : 555, "codepoint" : 232 }, { "width" : 555, "codepoint" : 233 }, { "width" : 555, "codepoint" : 234 }, { "width" : 555, "codepoint" : 235 }, { "width" : 277, "codepoint" : 236 }, { "width" : 277, "codepoint" : 237 }, { "width" : 277, "codepoint" : 238 }, { "width" : 277, "codepoint" : 239 }, { "width" : 555, "codepoint" : 240 }, { "width" : 555, "codepoint" : 241 }, { "width" : 555, "codepoint" : 242 }, { "width" : 555, "codepoint" : 243 }, { "width" : 555, "codepoint" : 244 }, { "width" : 555, "codepoint" : 245 }, { "width" : 555, "codepoint" : 246 }, { "width" : 555, "codepoint" : 247 }, { "width" : 555, "codepoint" : 248 }, { "width" : 610, "codepoint" : 249 }, { "width" : 555, "codepoint" : 250 }, { "width" : 555, "codepoint" : 251 }, { "width" : 555, "codepoint" : 252 }, { "width" : 555, "codepoint" : 253 }, { "width" : 555, "codepoint" : 254 }, { "width" : 555, "codepoint" : 255 } ] PDF-Create-1.43/share/times-roman.json0000644000175000017500000003362512710765550017060 0ustar manwarmanwar[ { "width" : 249, "codepoint" : 0 }, { "width" : 249, "codepoint" : 1 }, { "width" : 249, "codepoint" : 2 }, { "width" : 249, "codepoint" : 3 }, { "width" : 249, "codepoint" : 4 }, { "width" : 249, "codepoint" : 5 }, { "width" : 249, "codepoint" : 6 }, { "width" : 249, "codepoint" : 7 }, { "width" : 249, "codepoint" : 8 }, { "width" : 249, "codepoint" : 9 }, { "width" : 249, "codepoint" : 10 }, { "width" : 249, "codepoint" : 11 }, { "width" : 249, "codepoint" : 12 }, { "width" : 249, "codepoint" : 13 }, { "width" : 249, "codepoint" : 14 }, { "width" : 249, "codepoint" : 15 }, { "width" : 249, "codepoint" : 16 }, { "width" : 249, "codepoint" : 17 }, { "width" : 249, "codepoint" : 18 }, { "width" : 249, "codepoint" : 19 }, { "width" : 249, "codepoint" : 20 }, { "width" : 249, "codepoint" : 21 }, { "width" : 249, "codepoint" : 22 }, { "width" : 249, "codepoint" : 23 }, { "width" : 249, "codepoint" : 24 }, { "width" : 249, "codepoint" : 25 }, { "width" : 249, "codepoint" : 26 }, { "width" : 249, "codepoint" : 27 }, { "width" : 249, "codepoint" : 28 }, { "width" : 249, "codepoint" : 29 }, { "width" : 249, "codepoint" : 30 }, { "width" : 249, "codepoint" : 31 }, { "width" : 249, "codepoint" : 32 }, { "width" : 332, "codepoint" : 33 }, { "width" : 407, "codepoint" : 34 }, { "width" : 499, "codepoint" : 35 }, { "width" : 499, "codepoint" : 36 }, { "width" : 832, "codepoint" : 37 }, { "width" : 777, "codepoint" : 38 }, { "width" : 332, "codepoint" : 39 }, { "width" : 332, "codepoint" : 40 }, { "width" : 332, "codepoint" : 41 }, { "width" : 499, "codepoint" : 42 }, { "width" : 563, "codepoint" : 43 }, { "width" : 249, "codepoint" : 44 }, { "width" : 332, "codepoint" : 45 }, { "width" : 249, "codepoint" : 46 }, { "width" : 277, "codepoint" : 47 }, { "width" : 499, "codepoint" : 48 }, { "width" : 499, "codepoint" : 49 }, { "width" : 499, "codepoint" : 50 }, { "width" : 499, "codepoint" : 51 }, { "width" : 499, "codepoint" : 52 }, { "width" : 499, "codepoint" : 53 }, { "width" : 499, "codepoint" : 54 }, { "width" : 499, "codepoint" : 55 }, { "width" : 499, "codepoint" : 56 }, { "width" : 499, "codepoint" : 57 }, { "width" : 277, "codepoint" : 58 }, { "width" : 277, "codepoint" : 59 }, { "width" : 563, "codepoint" : 60 }, { "width" : 563, "codepoint" : 61 }, { "width" : 563, "codepoint" : 62 }, { "width" : 443, "codepoint" : 63 }, { "width" : 920, "codepoint" : 64 }, { "width" : 721, "codepoint" : 65 }, { "width" : 666, "codepoint" : 66 }, { "width" : 666, "codepoint" : 67 }, { "width" : 721, "codepoint" : 68 }, { "width" : 610, "codepoint" : 69 }, { "width" : 555, "codepoint" : 70 }, { "width" : 721, "codepoint" : 71 }, { "width" : 721, "codepoint" : 72 }, { "width" : 332, "codepoint" : 73 }, { "width" : 388, "codepoint" : 74 }, { "width" : 721, "codepoint" : 75 }, { "width" : 610, "codepoint" : 76 }, { "width" : 888, "codepoint" : 77 }, { "width" : 721, "codepoint" : 78 }, { "width" : 721, "codepoint" : 79 }, { "width" : 555, "codepoint" : 80 }, { "width" : 721, "codepoint" : 81 }, { "width" : 666, "codepoint" : 82 }, { "width" : 555, "codepoint" : 83 }, { "width" : 610, "codepoint" : 84 }, { "width" : 721, "codepoint" : 85 }, { "width" : 721, "codepoint" : 86 }, { "width" : 943, "codepoint" : 87 }, { "width" : 721, "codepoint" : 88 }, { "width" : 721, "codepoint" : 89 }, { "width" : 610, "codepoint" : 90 }, { "width" : 332, "codepoint" : 91 }, { "width" : 277, "codepoint" : 92 }, { "width" : 332, "codepoint" : 93 }, { "width" : 468, "codepoint" : 94 }, { "width" : 499, "codepoint" : 95 }, { "width" : 332, "codepoint" : 96 }, { "width" : 443, "codepoint" : 97 }, { "width" : 499, "codepoint" : 98 }, { "width" : 443, "codepoint" : 99 }, { "width" : 499, "codepoint" : 100 }, { "width" : 443, "codepoint" : 101 }, { "width" : 332, "codepoint" : 102 }, { "width" : 499, "codepoint" : 103 }, { "width" : 499, "codepoint" : 104 }, { "width" : 277, "codepoint" : 105 }, { "width" : 277, "codepoint" : 106 }, { "width" : 499, "codepoint" : 107 }, { "width" : 277, "codepoint" : 108 }, { "width" : 777, "codepoint" : 109 }, { "width" : 499, "codepoint" : 110 }, { "width" : 499, "codepoint" : 111 }, { "width" : 499, "codepoint" : 112 }, { "width" : 499, "codepoint" : 113 }, { "width" : 332, "codepoint" : 114 }, { "width" : 388, "codepoint" : 115 }, { "width" : 277, "codepoint" : 116 }, { "width" : 499, "codepoint" : 117 }, { "width" : 499, "codepoint" : 118 }, { "width" : 721, "codepoint" : 119 }, { "width" : 499, "codepoint" : 120 }, { "width" : 499, "codepoint" : 121 }, { "width" : 443, "codepoint" : 122 }, { "width" : 479, "codepoint" : 123 }, { "width" : 199, "codepoint" : 124 }, { "width" : 479, "codepoint" : 125 }, { "width" : 540, "codepoint" : 126 }, { "width" : 249, "codepoint" : 127 }, { "width" : 249, "codepoint" : 128 }, { "width" : 249, "codepoint" : 129 }, { "width" : 249, "codepoint" : 130 }, { "width" : 249, "codepoint" : 131 }, { "width" : 249, "codepoint" : 132 }, { "width" : 249, "codepoint" : 133 }, { "width" : 249, "codepoint" : 134 }, { "width" : 249, "codepoint" : 135 }, { "width" : 249, "codepoint" : 136 }, { "width" : 249, "codepoint" : 137 }, { "width" : 249, "codepoint" : 138 }, { "width" : 249, "codepoint" : 139 }, { "width" : 249, "codepoint" : 140 }, { "width" : 249, "codepoint" : 141 }, { "width" : 249, "codepoint" : 142 }, { "width" : 249, "codepoint" : 143 }, { "width" : 249, "codepoint" : 144 }, { "width" : 249, "codepoint" : 145 }, { "width" : 249, "codepoint" : 146 }, { "width" : 249, "codepoint" : 147 }, { "width" : 249, "codepoint" : 148 }, { "width" : 249, "codepoint" : 149 }, { "width" : 249, "codepoint" : 150 }, { "width" : 249, "codepoint" : 151 }, { "width" : 249, "codepoint" : 152 }, { "width" : 249, "codepoint" : 153 }, { "width" : 249, "codepoint" : 154 }, { "width" : 249, "codepoint" : 155 }, { "width" : 249, "codepoint" : 156 }, { "width" : 249, "codepoint" : 157 }, { "width" : 249, "codepoint" : 158 }, { "width" : 249, "codepoint" : 159 }, { "width" : 249, "codepoint" : 160 }, { "width" : 332, "codepoint" : 161 }, { "width" : 499, "codepoint" : 162 }, { "width" : 499, "codepoint" : 163 }, { "width" : 166, "codepoint" : 164 }, { "width" : 499, "codepoint" : 165 }, { "width" : 499, "codepoint" : 166 }, { "width" : 499, "codepoint" : 167 }, { "width" : 499, "codepoint" : 168 }, { "width" : 179, "codepoint" : 169 }, { "width" : 443, "codepoint" : 170 }, { "width" : 499, "codepoint" : 171 }, { "width" : 332, "codepoint" : 172 }, { "width" : 332, "codepoint" : 173 }, { "width" : 555, "codepoint" : 174 }, { "width" : 555, "codepoint" : 175 }, { "width" : 249, "codepoint" : 176 }, { "width" : 499, "codepoint" : 177 }, { "width" : 499, "codepoint" : 178 }, { "width" : 499, "codepoint" : 179 }, { "width" : 249, "codepoint" : 180 }, { "width" : 249, "codepoint" : 181 }, { "width" : 452, "codepoint" : 182 }, { "width" : 349, "codepoint" : 183 }, { "width" : 332, "codepoint" : 184 }, { "width" : 443, "codepoint" : 185 }, { "width" : 443, "codepoint" : 186 }, { "width" : 499, "codepoint" : 187 }, { "width" : 999, "codepoint" : 188 }, { "width" : 999, "codepoint" : 189 }, { "width" : 249, "codepoint" : 190 }, { "width" : 443, "codepoint" : 191 }, { "width" : 249, "codepoint" : 192 }, { "width" : 332, "codepoint" : 193 }, { "width" : 332, "codepoint" : 194 }, { "width" : 332, "codepoint" : 195 }, { "width" : 721, "codepoint" : 196 }, { "width" : 332, "codepoint" : 197 }, { "width" : 332, "codepoint" : 198 }, { "width" : 332, "codepoint" : 199 }, { "width" : 332, "codepoint" : 200 }, { "width" : 249, "codepoint" : 201 }, { "width" : 332, "codepoint" : 202 }, { "width" : 332, "codepoint" : 203 }, { "width" : 249, "codepoint" : 204 }, { "width" : 332, "codepoint" : 205 }, { "width" : 332, "codepoint" : 206 }, { "width" : 332, "codepoint" : 207 }, { "width" : 999, "codepoint" : 208 }, { "width" : 249, "codepoint" : 209 }, { "width" : 249, "codepoint" : 210 }, { "width" : 249, "codepoint" : 211 }, { "width" : 249, "codepoint" : 212 }, { "width" : 249, "codepoint" : 213 }, { "width" : 721, "codepoint" : 214 }, { "width" : 249, "codepoint" : 215 }, { "width" : 249, "codepoint" : 216 }, { "width" : 249, "codepoint" : 217 }, { "width" : 249, "codepoint" : 218 }, { "width" : 249, "codepoint" : 219 }, { "width" : 721, "codepoint" : 220 }, { "width" : 249, "codepoint" : 221 }, { "width" : 249, "codepoint" : 222 }, { "width" : 499, "codepoint" : 223 }, { "width" : 249, "codepoint" : 224 }, { "width" : 888, "codepoint" : 225 }, { "width" : 249, "codepoint" : 226 }, { "width" : 275, "codepoint" : 227 }, { "width" : 443, "codepoint" : 228 }, { "width" : 249, "codepoint" : 229 }, { "width" : 249, "codepoint" : 230 }, { "width" : 249, "codepoint" : 231 }, { "width" : 610, "codepoint" : 232 }, { "width" : 721, "codepoint" : 233 }, { "width" : 888, "codepoint" : 234 }, { "width" : 309, "codepoint" : 235 }, { "width" : 249, "codepoint" : 236 }, { "width" : 249, "codepoint" : 237 }, { "width" : 249, "codepoint" : 238 }, { "width" : 249, "codepoint" : 239 }, { "width" : 249, "codepoint" : 240 }, { "width" : 666, "codepoint" : 241 }, { "width" : 249, "codepoint" : 242 }, { "width" : 249, "codepoint" : 243 }, { "width" : 249, "codepoint" : 244 }, { "width" : 277, "codepoint" : 245 }, { "width" : 499, "codepoint" : 246 }, { "width" : 249, "codepoint" : 247 }, { "width" : 277, "codepoint" : 248 }, { "width" : 499, "codepoint" : 249 }, { "width" : 721, "codepoint" : 250 }, { "width" : 499, "codepoint" : 251 }, { "width" : 499, "codepoint" : 252 }, { "width" : 249, "codepoint" : 253 }, { "width" : 249, "codepoint" : 254 }, { "width" : 249, "codepoint" : 255 } ] PDF-Create-1.43/share/courier-oblique.json0000644000175000017500000003362512710765550017733 0ustar manwarmanwar[ { "width" : 599, "codepoint" : 0 }, { "width" : 599, "codepoint" : 1 }, { "width" : 599, "codepoint" : 2 }, { "width" : 599, "codepoint" : 3 }, { "width" : 599, "codepoint" : 4 }, { "width" : 599, "codepoint" : 5 }, { "width" : 599, "codepoint" : 6 }, { "width" : 599, "codepoint" : 7 }, { "width" : 599, "codepoint" : 8 }, { "width" : 599, "codepoint" : 9 }, { "width" : 599, "codepoint" : 10 }, { "width" : 599, "codepoint" : 11 }, { "width" : 599, "codepoint" : 12 }, { "width" : 599, "codepoint" : 13 }, { "width" : 599, "codepoint" : 14 }, { "width" : 599, "codepoint" : 15 }, { "width" : 599, "codepoint" : 16 }, { "width" : 599, "codepoint" : 17 }, { "width" : 599, "codepoint" : 18 }, { "width" : 599, "codepoint" : 19 }, { "width" : 599, "codepoint" : 20 }, { "width" : 599, "codepoint" : 21 }, { "width" : 599, "codepoint" : 22 }, { "width" : 599, "codepoint" : 23 }, { "width" : 599, "codepoint" : 24 }, { "width" : 599, "codepoint" : 25 }, { "width" : 599, "codepoint" : 26 }, { "width" : 599, "codepoint" : 27 }, { "width" : 599, "codepoint" : 28 }, { "width" : 599, "codepoint" : 29 }, { "width" : 599, "codepoint" : 30 }, { "width" : 599, "codepoint" : 31 }, { "width" : 599, "codepoint" : 32 }, { "width" : 599, "codepoint" : 33 }, { "width" : 599, "codepoint" : 34 }, { "width" : 599, "codepoint" : 35 }, { "width" : 599, "codepoint" : 36 }, { "width" : 599, "codepoint" : 37 }, { "width" : 599, "codepoint" : 38 }, { "width" : 599, "codepoint" : 39 }, { "width" : 599, "codepoint" : 40 }, { "width" : 599, "codepoint" : 41 }, { "width" : 599, "codepoint" : 42 }, { "width" : 599, "codepoint" : 43 }, { "width" : 599, "codepoint" : 44 }, { "width" : 599, "codepoint" : 45 }, { "width" : 599, "codepoint" : 46 }, { "width" : 599, "codepoint" : 47 }, { "width" : 599, "codepoint" : 48 }, { "width" : 599, "codepoint" : 49 }, { "width" : 599, "codepoint" : 50 }, { "width" : 599, "codepoint" : 51 }, { "width" : 599, "codepoint" : 52 }, { "width" : 599, "codepoint" : 53 }, { "width" : 599, "codepoint" : 54 }, { "width" : 599, "codepoint" : 55 }, { "width" : 599, "codepoint" : 56 }, { "width" : 599, "codepoint" : 57 }, { "width" : 599, "codepoint" : 58 }, { "width" : 599, "codepoint" : 59 }, { "width" : 599, "codepoint" : 60 }, { "width" : 599, "codepoint" : 61 }, { "width" : 599, "codepoint" : 62 }, { "width" : 599, "codepoint" : 63 }, { "width" : 599, "codepoint" : 64 }, { "width" : 599, "codepoint" : 65 }, { "width" : 599, "codepoint" : 66 }, { "width" : 599, "codepoint" : 67 }, { "width" : 599, "codepoint" : 68 }, { "width" : 599, "codepoint" : 69 }, { "width" : 599, "codepoint" : 70 }, { "width" : 599, "codepoint" : 71 }, { "width" : 599, "codepoint" : 72 }, { "width" : 599, "codepoint" : 73 }, { "width" : 599, "codepoint" : 74 }, { "width" : 599, "codepoint" : 75 }, { "width" : 599, "codepoint" : 76 }, { "width" : 599, "codepoint" : 77 }, { "width" : 599, "codepoint" : 78 }, { "width" : 599, "codepoint" : 79 }, { "width" : 599, "codepoint" : 80 }, { "width" : 599, "codepoint" : 81 }, { "width" : 599, "codepoint" : 82 }, { "width" : 599, "codepoint" : 83 }, { "width" : 599, "codepoint" : 84 }, { "width" : 599, "codepoint" : 85 }, { "width" : 599, "codepoint" : 86 }, { "width" : 599, "codepoint" : 87 }, { "width" : 599, "codepoint" : 88 }, { "width" : 599, "codepoint" : 89 }, { "width" : 599, "codepoint" : 90 }, { "width" : 599, "codepoint" : 91 }, { "width" : 599, "codepoint" : 92 }, { "width" : 599, "codepoint" : 93 }, { "width" : 599, "codepoint" : 94 }, { "width" : 599, "codepoint" : 95 }, { "width" : 599, "codepoint" : 96 }, { "width" : 599, "codepoint" : 97 }, { "width" : 599, "codepoint" : 98 }, { "width" : 599, "codepoint" : 99 }, { "width" : 599, "codepoint" : 100 }, { "width" : 599, "codepoint" : 101 }, { "width" : 599, "codepoint" : 102 }, { "width" : 599, "codepoint" : 103 }, { "width" : 599, "codepoint" : 104 }, { "width" : 599, "codepoint" : 105 }, { "width" : 599, "codepoint" : 106 }, { "width" : 599, "codepoint" : 107 }, { "width" : 599, "codepoint" : 108 }, { "width" : 599, "codepoint" : 109 }, { "width" : 599, "codepoint" : 110 }, { "width" : 599, "codepoint" : 111 }, { "width" : 599, "codepoint" : 112 }, { "width" : 599, "codepoint" : 113 }, { "width" : 599, "codepoint" : 114 }, { "width" : 599, "codepoint" : 115 }, { "width" : 599, "codepoint" : 116 }, { "width" : 599, "codepoint" : 117 }, { "width" : 599, "codepoint" : 118 }, { "width" : 599, "codepoint" : 119 }, { "width" : 599, "codepoint" : 120 }, { "width" : 599, "codepoint" : 121 }, { "width" : 599, "codepoint" : 122 }, { "width" : 599, "codepoint" : 123 }, { "width" : 599, "codepoint" : 124 }, { "width" : 599, "codepoint" : 125 }, { "width" : 599, "codepoint" : 126 }, { "width" : 599, "codepoint" : 127 }, { "width" : 599, "codepoint" : 128 }, { "width" : 599, "codepoint" : 129 }, { "width" : 599, "codepoint" : 130 }, { "width" : 599, "codepoint" : 131 }, { "width" : 599, "codepoint" : 132 }, { "width" : 599, "codepoint" : 133 }, { "width" : 599, "codepoint" : 134 }, { "width" : 599, "codepoint" : 135 }, { "width" : 599, "codepoint" : 136 }, { "width" : 599, "codepoint" : 137 }, { "width" : 599, "codepoint" : 138 }, { "width" : 599, "codepoint" : 139 }, { "width" : 599, "codepoint" : 140 }, { "width" : 599, "codepoint" : 141 }, { "width" : 599, "codepoint" : 142 }, { "width" : 599, "codepoint" : 143 }, { "width" : 599, "codepoint" : 144 }, { "width" : 599, "codepoint" : 145 }, { "width" : 599, "codepoint" : 146 }, { "width" : 599, "codepoint" : 147 }, { "width" : 599, "codepoint" : 148 }, { "width" : 599, "codepoint" : 149 }, { "width" : 599, "codepoint" : 150 }, { "width" : 599, "codepoint" : 151 }, { "width" : 599, "codepoint" : 152 }, { "width" : 599, "codepoint" : 153 }, { "width" : 599, "codepoint" : 154 }, { "width" : 599, "codepoint" : 155 }, { "width" : 599, "codepoint" : 156 }, { "width" : 599, "codepoint" : 157 }, { "width" : 599, "codepoint" : 158 }, { "width" : 599, "codepoint" : 159 }, { "width" : 599, "codepoint" : 160 }, { "width" : 599, "codepoint" : 161 }, { "width" : 599, "codepoint" : 162 }, { "width" : 599, "codepoint" : 163 }, { "width" : 599, "codepoint" : 164 }, { "width" : 599, "codepoint" : 165 }, { "width" : 599, "codepoint" : 166 }, { "width" : 599, "codepoint" : 167 }, { "width" : 599, "codepoint" : 168 }, { "width" : 599, "codepoint" : 169 }, { "width" : 599, "codepoint" : 170 }, { "width" : 599, "codepoint" : 171 }, { "width" : 599, "codepoint" : 172 }, { "width" : 599, "codepoint" : 173 }, { "width" : 599, "codepoint" : 174 }, { "width" : 599, "codepoint" : 175 }, { "width" : 599, "codepoint" : 176 }, { "width" : 599, "codepoint" : 177 }, { "width" : 599, "codepoint" : 178 }, { "width" : 599, "codepoint" : 179 }, { "width" : 599, "codepoint" : 180 }, { "width" : 599, "codepoint" : 181 }, { "width" : 599, "codepoint" : 182 }, { "width" : 599, "codepoint" : 183 }, { "width" : 599, "codepoint" : 184 }, { "width" : 599, "codepoint" : 185 }, { "width" : 599, "codepoint" : 186 }, { "width" : 599, "codepoint" : 187 }, { "width" : 599, "codepoint" : 188 }, { "width" : 599, "codepoint" : 189 }, { "width" : 599, "codepoint" : 190 }, { "width" : 599, "codepoint" : 191 }, { "width" : 599, "codepoint" : 192 }, { "width" : 599, "codepoint" : 193 }, { "width" : 599, "codepoint" : 194 }, { "width" : 599, "codepoint" : 195 }, { "width" : 599, "codepoint" : 196 }, { "width" : 599, "codepoint" : 197 }, { "width" : 599, "codepoint" : 198 }, { "width" : 599, "codepoint" : 199 }, { "width" : 599, "codepoint" : 200 }, { "width" : 599, "codepoint" : 201 }, { "width" : 599, "codepoint" : 202 }, { "width" : 599, "codepoint" : 203 }, { "width" : 599, "codepoint" : 204 }, { "width" : 599, "codepoint" : 205 }, { "width" : 599, "codepoint" : 206 }, { "width" : 599, "codepoint" : 207 }, { "width" : 599, "codepoint" : 208 }, { "width" : 599, "codepoint" : 209 }, { "width" : 599, "codepoint" : 210 }, { "width" : 599, "codepoint" : 211 }, { "width" : 599, "codepoint" : 212 }, { "width" : 599, "codepoint" : 213 }, { "width" : 599, "codepoint" : 214 }, { "width" : 599, "codepoint" : 215 }, { "width" : 599, "codepoint" : 216 }, { "width" : 599, "codepoint" : 217 }, { "width" : 599, "codepoint" : 218 }, { "width" : 599, "codepoint" : 219 }, { "width" : 599, "codepoint" : 220 }, { "width" : 599, "codepoint" : 221 }, { "width" : 599, "codepoint" : 222 }, { "width" : 599, "codepoint" : 223 }, { "width" : 599, "codepoint" : 224 }, { "width" : 599, "codepoint" : 225 }, { "width" : 599, "codepoint" : 226 }, { "width" : 599, "codepoint" : 227 }, { "width" : 599, "codepoint" : 228 }, { "width" : 599, "codepoint" : 229 }, { "width" : 599, "codepoint" : 230 }, { "width" : 599, "codepoint" : 231 }, { "width" : 599, "codepoint" : 232 }, { "width" : 599, "codepoint" : 233 }, { "width" : 599, "codepoint" : 234 }, { "width" : 599, "codepoint" : 235 }, { "width" : 599, "codepoint" : 236 }, { "width" : 599, "codepoint" : 237 }, { "width" : 599, "codepoint" : 238 }, { "width" : 599, "codepoint" : 239 }, { "width" : 599, "codepoint" : 240 }, { "width" : 599, "codepoint" : 241 }, { "width" : 599, "codepoint" : 242 }, { "width" : 599, "codepoint" : 243 }, { "width" : 599, "codepoint" : 244 }, { "width" : 599, "codepoint" : 245 }, { "width" : 599, "codepoint" : 246 }, { "width" : 599, "codepoint" : 247 }, { "width" : 599, "codepoint" : 248 }, { "width" : 599, "codepoint" : 249 }, { "width" : 599, "codepoint" : 250 }, { "width" : 599, "codepoint" : 251 }, { "width" : 599, "codepoint" : 252 }, { "width" : 599, "codepoint" : 253 }, { "width" : 599, "codepoint" : 254 }, { "width" : 599, "codepoint" : 255 } ] PDF-Create-1.43/share/times-bold.json0000644000175000017500000003362512710765550016664 0ustar manwarmanwar[ { "width" : 249, "codepoint" : 0 }, { "width" : 249, "codepoint" : 1 }, { "width" : 249, "codepoint" : 2 }, { "width" : 249, "codepoint" : 3 }, { "width" : 249, "codepoint" : 4 }, { "width" : 249, "codepoint" : 5 }, { "width" : 249, "codepoint" : 6 }, { "width" : 249, "codepoint" : 7 }, { "width" : 249, "codepoint" : 8 }, { "width" : 249, "codepoint" : 9 }, { "width" : 249, "codepoint" : 10 }, { "width" : 249, "codepoint" : 11 }, { "width" : 249, "codepoint" : 12 }, { "width" : 249, "codepoint" : 13 }, { "width" : 249, "codepoint" : 14 }, { "width" : 249, "codepoint" : 15 }, { "width" : 249, "codepoint" : 16 }, { "width" : 249, "codepoint" : 17 }, { "width" : 249, "codepoint" : 18 }, { "width" : 249, "codepoint" : 19 }, { "width" : 249, "codepoint" : 20 }, { "width" : 249, "codepoint" : 21 }, { "width" : 249, "codepoint" : 22 }, { "width" : 249, "codepoint" : 23 }, { "width" : 249, "codepoint" : 24 }, { "width" : 249, "codepoint" : 25 }, { "width" : 249, "codepoint" : 26 }, { "width" : 249, "codepoint" : 27 }, { "width" : 249, "codepoint" : 28 }, { "width" : 249, "codepoint" : 29 }, { "width" : 249, "codepoint" : 30 }, { "width" : 249, "codepoint" : 31 }, { "width" : 249, "codepoint" : 32 }, { "width" : 332, "codepoint" : 33 }, { "width" : 554, "codepoint" : 34 }, { "width" : 499, "codepoint" : 35 }, { "width" : 499, "codepoint" : 36 }, { "width" : 999, "codepoint" : 37 }, { "width" : 832, "codepoint" : 38 }, { "width" : 332, "codepoint" : 39 }, { "width" : 332, "codepoint" : 40 }, { "width" : 332, "codepoint" : 41 }, { "width" : 499, "codepoint" : 42 }, { "width" : 569, "codepoint" : 43 }, { "width" : 249, "codepoint" : 44 }, { "width" : 332, "codepoint" : 45 }, { "width" : 249, "codepoint" : 46 }, { "width" : 277, "codepoint" : 47 }, { "width" : 499, "codepoint" : 48 }, { "width" : 499, "codepoint" : 49 }, { "width" : 499, "codepoint" : 50 }, { "width" : 499, "codepoint" : 51 }, { "width" : 499, "codepoint" : 52 }, { "width" : 499, "codepoint" : 53 }, { "width" : 499, "codepoint" : 54 }, { "width" : 499, "codepoint" : 55 }, { "width" : 499, "codepoint" : 56 }, { "width" : 499, "codepoint" : 57 }, { "width" : 332, "codepoint" : 58 }, { "width" : 332, "codepoint" : 59 }, { "width" : 569, "codepoint" : 60 }, { "width" : 569, "codepoint" : 61 }, { "width" : 569, "codepoint" : 62 }, { "width" : 499, "codepoint" : 63 }, { "width" : 929, "codepoint" : 64 }, { "width" : 721, "codepoint" : 65 }, { "width" : 666, "codepoint" : 66 }, { "width" : 721, "codepoint" : 67 }, { "width" : 721, "codepoint" : 68 }, { "width" : 666, "codepoint" : 69 }, { "width" : 610, "codepoint" : 70 }, { "width" : 777, "codepoint" : 71 }, { "width" : 777, "codepoint" : 72 }, { "width" : 388, "codepoint" : 73 }, { "width" : 499, "codepoint" : 74 }, { "width" : 777, "codepoint" : 75 }, { "width" : 666, "codepoint" : 76 }, { "width" : 943, "codepoint" : 77 }, { "width" : 721, "codepoint" : 78 }, { "width" : 777, "codepoint" : 79 }, { "width" : 610, "codepoint" : 80 }, { "width" : 777, "codepoint" : 81 }, { "width" : 721, "codepoint" : 82 }, { "width" : 555, "codepoint" : 83 }, { "width" : 666, "codepoint" : 84 }, { "width" : 721, "codepoint" : 85 }, { "width" : 721, "codepoint" : 86 }, { "width" : 999, "codepoint" : 87 }, { "width" : 721, "codepoint" : 88 }, { "width" : 721, "codepoint" : 89 }, { "width" : 666, "codepoint" : 90 }, { "width" : 332, "codepoint" : 91 }, { "width" : 277, "codepoint" : 92 }, { "width" : 332, "codepoint" : 93 }, { "width" : 580, "codepoint" : 94 }, { "width" : 499, "codepoint" : 95 }, { "width" : 332, "codepoint" : 96 }, { "width" : 499, "codepoint" : 97 }, { "width" : 555, "codepoint" : 98 }, { "width" : 443, "codepoint" : 99 }, { "width" : 555, "codepoint" : 100 }, { "width" : 443, "codepoint" : 101 }, { "width" : 332, "codepoint" : 102 }, { "width" : 499, "codepoint" : 103 }, { "width" : 555, "codepoint" : 104 }, { "width" : 277, "codepoint" : 105 }, { "width" : 332, "codepoint" : 106 }, { "width" : 555, "codepoint" : 107 }, { "width" : 277, "codepoint" : 108 }, { "width" : 832, "codepoint" : 109 }, { "width" : 555, "codepoint" : 110 }, { "width" : 499, "codepoint" : 111 }, { "width" : 555, "codepoint" : 112 }, { "width" : 555, "codepoint" : 113 }, { "width" : 443, "codepoint" : 114 }, { "width" : 388, "codepoint" : 115 }, { "width" : 332, "codepoint" : 116 }, { "width" : 555, "codepoint" : 117 }, { "width" : 499, "codepoint" : 118 }, { "width" : 721, "codepoint" : 119 }, { "width" : 499, "codepoint" : 120 }, { "width" : 499, "codepoint" : 121 }, { "width" : 443, "codepoint" : 122 }, { "width" : 393, "codepoint" : 123 }, { "width" : 219, "codepoint" : 124 }, { "width" : 393, "codepoint" : 125 }, { "width" : 519, "codepoint" : 126 }, { "width" : 249, "codepoint" : 127 }, { "width" : 249, "codepoint" : 128 }, { "width" : 249, "codepoint" : 129 }, { "width" : 249, "codepoint" : 130 }, { "width" : 249, "codepoint" : 131 }, { "width" : 249, "codepoint" : 132 }, { "width" : 249, "codepoint" : 133 }, { "width" : 249, "codepoint" : 134 }, { "width" : 249, "codepoint" : 135 }, { "width" : 249, "codepoint" : 136 }, { "width" : 249, "codepoint" : 137 }, { "width" : 249, "codepoint" : 138 }, { "width" : 249, "codepoint" : 139 }, { "width" : 249, "codepoint" : 140 }, { "width" : 249, "codepoint" : 141 }, { "width" : 249, "codepoint" : 142 }, { "width" : 249, "codepoint" : 143 }, { "width" : 249, "codepoint" : 144 }, { "width" : 249, "codepoint" : 145 }, { "width" : 249, "codepoint" : 146 }, { "width" : 249, "codepoint" : 147 }, { "width" : 249, "codepoint" : 148 }, { "width" : 249, "codepoint" : 149 }, { "width" : 249, "codepoint" : 150 }, { "width" : 249, "codepoint" : 151 }, { "width" : 249, "codepoint" : 152 }, { "width" : 249, "codepoint" : 153 }, { "width" : 249, "codepoint" : 154 }, { "width" : 249, "codepoint" : 155 }, { "width" : 249, "codepoint" : 156 }, { "width" : 249, "codepoint" : 157 }, { "width" : 249, "codepoint" : 158 }, { "width" : 249, "codepoint" : 159 }, { "width" : 249, "codepoint" : 160 }, { "width" : 332, "codepoint" : 161 }, { "width" : 499, "codepoint" : 162 }, { "width" : 499, "codepoint" : 163 }, { "width" : 166, "codepoint" : 164 }, { "width" : 499, "codepoint" : 165 }, { "width" : 499, "codepoint" : 166 }, { "width" : 499, "codepoint" : 167 }, { "width" : 499, "codepoint" : 168 }, { "width" : 277, "codepoint" : 169 }, { "width" : 499, "codepoint" : 170 }, { "width" : 499, "codepoint" : 171 }, { "width" : 332, "codepoint" : 172 }, { "width" : 332, "codepoint" : 173 }, { "width" : 555, "codepoint" : 174 }, { "width" : 555, "codepoint" : 175 }, { "width" : 249, "codepoint" : 176 }, { "width" : 499, "codepoint" : 177 }, { "width" : 499, "codepoint" : 178 }, { "width" : 499, "codepoint" : 179 }, { "width" : 249, "codepoint" : 180 }, { "width" : 249, "codepoint" : 181 }, { "width" : 539, "codepoint" : 182 }, { "width" : 349, "codepoint" : 183 }, { "width" : 332, "codepoint" : 184 }, { "width" : 499, "codepoint" : 185 }, { "width" : 499, "codepoint" : 186 }, { "width" : 499, "codepoint" : 187 }, { "width" : 999, "codepoint" : 188 }, { "width" : 999, "codepoint" : 189 }, { "width" : 249, "codepoint" : 190 }, { "width" : 499, "codepoint" : 191 }, { "width" : 249, "codepoint" : 192 }, { "width" : 332, "codepoint" : 193 }, { "width" : 332, "codepoint" : 194 }, { "width" : 332, "codepoint" : 195 }, { "width" : 721, "codepoint" : 196 }, { "width" : 332, "codepoint" : 197 }, { "width" : 332, "codepoint" : 198 }, { "width" : 332, "codepoint" : 199 }, { "width" : 332, "codepoint" : 200 }, { "width" : 249, "codepoint" : 201 }, { "width" : 332, "codepoint" : 202 }, { "width" : 332, "codepoint" : 203 }, { "width" : 249, "codepoint" : 204 }, { "width" : 332, "codepoint" : 205 }, { "width" : 332, "codepoint" : 206 }, { "width" : 332, "codepoint" : 207 }, { "width" : 999, "codepoint" : 208 }, { "width" : 249, "codepoint" : 209 }, { "width" : 249, "codepoint" : 210 }, { "width" : 249, "codepoint" : 211 }, { "width" : 249, "codepoint" : 212 }, { "width" : 249, "codepoint" : 213 }, { "width" : 777, "codepoint" : 214 }, { "width" : 249, "codepoint" : 215 }, { "width" : 249, "codepoint" : 216 }, { "width" : 249, "codepoint" : 217 }, { "width" : 249, "codepoint" : 218 }, { "width" : 249, "codepoint" : 219 }, { "width" : 721, "codepoint" : 220 }, { "width" : 249, "codepoint" : 221 }, { "width" : 249, "codepoint" : 222 }, { "width" : 555, "codepoint" : 223 }, { "width" : 249, "codepoint" : 224 }, { "width" : 999, "codepoint" : 225 }, { "width" : 249, "codepoint" : 226 }, { "width" : 299, "codepoint" : 227 }, { "width" : 499, "codepoint" : 228 }, { "width" : 249, "codepoint" : 229 }, { "width" : 249, "codepoint" : 230 }, { "width" : 249, "codepoint" : 231 }, { "width" : 666, "codepoint" : 232 }, { "width" : 777, "codepoint" : 233 }, { "width" : 999, "codepoint" : 234 }, { "width" : 329, "codepoint" : 235 }, { "width" : 249, "codepoint" : 236 }, { "width" : 249, "codepoint" : 237 }, { "width" : 249, "codepoint" : 238 }, { "width" : 249, "codepoint" : 239 }, { "width" : 249, "codepoint" : 240 }, { "width" : 721, "codepoint" : 241 }, { "width" : 249, "codepoint" : 242 }, { "width" : 249, "codepoint" : 243 }, { "width" : 249, "codepoint" : 244 }, { "width" : 277, "codepoint" : 245 }, { "width" : 499, "codepoint" : 246 }, { "width" : 249, "codepoint" : 247 }, { "width" : 277, "codepoint" : 248 }, { "width" : 499, "codepoint" : 249 }, { "width" : 721, "codepoint" : 250 }, { "width" : 555, "codepoint" : 251 }, { "width" : 555, "codepoint" : 252 }, { "width" : 249, "codepoint" : 253 }, { "width" : 249, "codepoint" : 254 }, { "width" : 249, "codepoint" : 255 } ] PDF-Create-1.43/share/courier-bold.json0000644000175000017500000003362512710765550017213 0ustar manwarmanwar[ { "width" : 599, "codepoint" : 0 }, { "width" : 599, "codepoint" : 1 }, { "width" : 599, "codepoint" : 2 }, { "width" : 599, "codepoint" : 3 }, { "width" : 599, "codepoint" : 4 }, { "width" : 599, "codepoint" : 5 }, { "width" : 599, "codepoint" : 6 }, { "width" : 599, "codepoint" : 7 }, { "width" : 599, "codepoint" : 8 }, { "width" : 599, "codepoint" : 9 }, { "width" : 599, "codepoint" : 10 }, { "width" : 599, "codepoint" : 11 }, { "width" : 599, "codepoint" : 12 }, { "width" : 599, "codepoint" : 13 }, { "width" : 599, "codepoint" : 14 }, { "width" : 599, "codepoint" : 15 }, { "width" : 599, "codepoint" : 16 }, { "width" : 599, "codepoint" : 17 }, { "width" : 599, "codepoint" : 18 }, { "width" : 599, "codepoint" : 19 }, { "width" : 599, "codepoint" : 20 }, { "width" : 599, "codepoint" : 21 }, { "width" : 599, "codepoint" : 22 }, { "width" : 599, "codepoint" : 23 }, { "width" : 599, "codepoint" : 24 }, { "width" : 599, "codepoint" : 25 }, { "width" : 599, "codepoint" : 26 }, { "width" : 599, "codepoint" : 27 }, { "width" : 599, "codepoint" : 28 }, { "width" : 599, "codepoint" : 29 }, { "width" : 599, "codepoint" : 30 }, { "width" : 599, "codepoint" : 31 }, { "width" : 599, "codepoint" : 32 }, { "width" : 599, "codepoint" : 33 }, { "width" : 599, "codepoint" : 34 }, { "width" : 599, "codepoint" : 35 }, { "width" : 599, "codepoint" : 36 }, { "width" : 599, "codepoint" : 37 }, { "width" : 599, "codepoint" : 38 }, { "width" : 599, "codepoint" : 39 }, { "width" : 599, "codepoint" : 40 }, { "width" : 599, "codepoint" : 41 }, { "width" : 599, "codepoint" : 42 }, { "width" : 599, "codepoint" : 43 }, { "width" : 599, "codepoint" : 44 }, { "width" : 599, "codepoint" : 45 }, { "width" : 599, "codepoint" : 46 }, { "width" : 599, "codepoint" : 47 }, { "width" : 599, "codepoint" : 48 }, { "width" : 599, "codepoint" : 49 }, { "width" : 599, "codepoint" : 50 }, { "width" : 599, "codepoint" : 51 }, { "width" : 599, "codepoint" : 52 }, { "width" : 599, "codepoint" : 53 }, { "width" : 599, "codepoint" : 54 }, { "width" : 599, "codepoint" : 55 }, { "width" : 599, "codepoint" : 56 }, { "width" : 599, "codepoint" : 57 }, { "width" : 599, "codepoint" : 58 }, { "width" : 599, "codepoint" : 59 }, { "width" : 599, "codepoint" : 60 }, { "width" : 599, "codepoint" : 61 }, { "width" : 599, "codepoint" : 62 }, { "width" : 599, "codepoint" : 63 }, { "width" : 599, "codepoint" : 64 }, { "width" : 599, "codepoint" : 65 }, { "width" : 599, "codepoint" : 66 }, { "width" : 599, "codepoint" : 67 }, { "width" : 599, "codepoint" : 68 }, { "width" : 599, "codepoint" : 69 }, { "width" : 599, "codepoint" : 70 }, { "width" : 599, "codepoint" : 71 }, { "width" : 599, "codepoint" : 72 }, { "width" : 599, "codepoint" : 73 }, { "width" : 599, "codepoint" : 74 }, { "width" : 599, "codepoint" : 75 }, { "width" : 599, "codepoint" : 76 }, { "width" : 599, "codepoint" : 77 }, { "width" : 599, "codepoint" : 78 }, { "width" : 599, "codepoint" : 79 }, { "width" : 599, "codepoint" : 80 }, { "width" : 599, "codepoint" : 81 }, { "width" : 599, "codepoint" : 82 }, { "width" : 599, "codepoint" : 83 }, { "width" : 599, "codepoint" : 84 }, { "width" : 599, "codepoint" : 85 }, { "width" : 599, "codepoint" : 86 }, { "width" : 599, "codepoint" : 87 }, { "width" : 599, "codepoint" : 88 }, { "width" : 599, "codepoint" : 89 }, { "width" : 599, "codepoint" : 90 }, { "width" : 599, "codepoint" : 91 }, { "width" : 599, "codepoint" : 92 }, { "width" : 599, "codepoint" : 93 }, { "width" : 599, "codepoint" : 94 }, { "width" : 599, "codepoint" : 95 }, { "width" : 599, "codepoint" : 96 }, { "width" : 599, "codepoint" : 97 }, { "width" : 599, "codepoint" : 98 }, { "width" : 599, "codepoint" : 99 }, { "width" : 599, "codepoint" : 100 }, { "width" : 599, "codepoint" : 101 }, { "width" : 599, "codepoint" : 102 }, { "width" : 599, "codepoint" : 103 }, { "width" : 599, "codepoint" : 104 }, { "width" : 599, "codepoint" : 105 }, { "width" : 599, "codepoint" : 106 }, { "width" : 599, "codepoint" : 107 }, { "width" : 599, "codepoint" : 108 }, { "width" : 599, "codepoint" : 109 }, { "width" : 599, "codepoint" : 110 }, { "width" : 599, "codepoint" : 111 }, { "width" : 599, "codepoint" : 112 }, { "width" : 599, "codepoint" : 113 }, { "width" : 599, "codepoint" : 114 }, { "width" : 599, "codepoint" : 115 }, { "width" : 599, "codepoint" : 116 }, { "width" : 599, "codepoint" : 117 }, { "width" : 599, "codepoint" : 118 }, { "width" : 599, "codepoint" : 119 }, { "width" : 599, "codepoint" : 120 }, { "width" : 599, "codepoint" : 121 }, { "width" : 599, "codepoint" : 122 }, { "width" : 599, "codepoint" : 123 }, { "width" : 599, "codepoint" : 124 }, { "width" : 599, "codepoint" : 125 }, { "width" : 599, "codepoint" : 126 }, { "width" : 599, "codepoint" : 127 }, { "width" : 599, "codepoint" : 128 }, { "width" : 599, "codepoint" : 129 }, { "width" : 599, "codepoint" : 130 }, { "width" : 599, "codepoint" : 131 }, { "width" : 599, "codepoint" : 132 }, { "width" : 599, "codepoint" : 133 }, { "width" : 599, "codepoint" : 134 }, { "width" : 599, "codepoint" : 135 }, { "width" : 599, "codepoint" : 136 }, { "width" : 599, "codepoint" : 137 }, { "width" : 599, "codepoint" : 138 }, { "width" : 599, "codepoint" : 139 }, { "width" : 599, "codepoint" : 140 }, { "width" : 599, "codepoint" : 141 }, { "width" : 599, "codepoint" : 142 }, { "width" : 599, "codepoint" : 143 }, { "width" : 599, "codepoint" : 144 }, { "width" : 599, "codepoint" : 145 }, { "width" : 599, "codepoint" : 146 }, { "width" : 599, "codepoint" : 147 }, { "width" : 599, "codepoint" : 148 }, { "width" : 599, "codepoint" : 149 }, { "width" : 599, "codepoint" : 150 }, { "width" : 599, "codepoint" : 151 }, { "width" : 599, "codepoint" : 152 }, { "width" : 599, "codepoint" : 153 }, { "width" : 599, "codepoint" : 154 }, { "width" : 599, "codepoint" : 155 }, { "width" : 599, "codepoint" : 156 }, { "width" : 599, "codepoint" : 157 }, { "width" : 599, "codepoint" : 158 }, { "width" : 599, "codepoint" : 159 }, { "width" : 599, "codepoint" : 160 }, { "width" : 599, "codepoint" : 161 }, { "width" : 599, "codepoint" : 162 }, { "width" : 599, "codepoint" : 163 }, { "width" : 599, "codepoint" : 164 }, { "width" : 599, "codepoint" : 165 }, { "width" : 599, "codepoint" : 166 }, { "width" : 599, "codepoint" : 167 }, { "width" : 599, "codepoint" : 168 }, { "width" : 599, "codepoint" : 169 }, { "width" : 599, "codepoint" : 170 }, { "width" : 599, "codepoint" : 171 }, { "width" : 599, "codepoint" : 172 }, { "width" : 599, "codepoint" : 173 }, { "width" : 599, "codepoint" : 174 }, { "width" : 599, "codepoint" : 175 }, { "width" : 599, "codepoint" : 176 }, { "width" : 599, "codepoint" : 177 }, { "width" : 599, "codepoint" : 178 }, { "width" : 599, "codepoint" : 179 }, { "width" : 599, "codepoint" : 180 }, { "width" : 599, "codepoint" : 181 }, { "width" : 599, "codepoint" : 182 }, { "width" : 599, "codepoint" : 183 }, { "width" : 599, "codepoint" : 184 }, { "width" : 599, "codepoint" : 185 }, { "width" : 599, "codepoint" : 186 }, { "width" : 599, "codepoint" : 187 }, { "width" : 599, "codepoint" : 188 }, { "width" : 599, "codepoint" : 189 }, { "width" : 599, "codepoint" : 190 }, { "width" : 599, "codepoint" : 191 }, { "width" : 599, "codepoint" : 192 }, { "width" : 599, "codepoint" : 193 }, { "width" : 599, "codepoint" : 194 }, { "width" : 599, "codepoint" : 195 }, { "width" : 599, "codepoint" : 196 }, { "width" : 599, "codepoint" : 197 }, { "width" : 599, "codepoint" : 198 }, { "width" : 599, "codepoint" : 199 }, { "width" : 599, "codepoint" : 200 }, { "width" : 599, "codepoint" : 201 }, { "width" : 599, "codepoint" : 202 }, { "width" : 599, "codepoint" : 203 }, { "width" : 599, "codepoint" : 204 }, { "width" : 599, "codepoint" : 205 }, { "width" : 599, "codepoint" : 206 }, { "width" : 599, "codepoint" : 207 }, { "width" : 599, "codepoint" : 208 }, { "width" : 599, "codepoint" : 209 }, { "width" : 599, "codepoint" : 210 }, { "width" : 599, "codepoint" : 211 }, { "width" : 599, "codepoint" : 212 }, { "width" : 599, "codepoint" : 213 }, { "width" : 599, "codepoint" : 214 }, { "width" : 599, "codepoint" : 215 }, { "width" : 599, "codepoint" : 216 }, { "width" : 599, "codepoint" : 217 }, { "width" : 599, "codepoint" : 218 }, { "width" : 599, "codepoint" : 219 }, { "width" : 599, "codepoint" : 220 }, { "width" : 599, "codepoint" : 221 }, { "width" : 599, "codepoint" : 222 }, { "width" : 599, "codepoint" : 223 }, { "width" : 599, "codepoint" : 224 }, { "width" : 599, "codepoint" : 225 }, { "width" : 599, "codepoint" : 226 }, { "width" : 599, "codepoint" : 227 }, { "width" : 599, "codepoint" : 228 }, { "width" : 599, "codepoint" : 229 }, { "width" : 599, "codepoint" : 230 }, { "width" : 599, "codepoint" : 231 }, { "width" : 599, "codepoint" : 232 }, { "width" : 599, "codepoint" : 233 }, { "width" : 599, "codepoint" : 234 }, { "width" : 599, "codepoint" : 235 }, { "width" : 599, "codepoint" : 236 }, { "width" : 599, "codepoint" : 237 }, { "width" : 599, "codepoint" : 238 }, { "width" : 599, "codepoint" : 239 }, { "width" : 599, "codepoint" : 240 }, { "width" : 599, "codepoint" : 241 }, { "width" : 599, "codepoint" : 242 }, { "width" : 599, "codepoint" : 243 }, { "width" : 599, "codepoint" : 244 }, { "width" : 599, "codepoint" : 245 }, { "width" : 599, "codepoint" : 246 }, { "width" : 599, "codepoint" : 247 }, { "width" : 599, "codepoint" : 248 }, { "width" : 599, "codepoint" : 249 }, { "width" : 599, "codepoint" : 250 }, { "width" : 599, "codepoint" : 251 }, { "width" : 599, "codepoint" : 252 }, { "width" : 599, "codepoint" : 253 }, { "width" : 599, "codepoint" : 254 }, { "width" : 599, "codepoint" : 255 } ] PDF-Create-1.43/share/helvetica-boldoblique.json0000644000175000017500000003362512710765550021070 0ustar manwarmanwar[ { "width" : 277, "codepoint" : 0 }, { "width" : 277, "codepoint" : 1 }, { "width" : 277, "codepoint" : 2 }, { "width" : 277, "codepoint" : 3 }, { "width" : 277, "codepoint" : 4 }, { "width" : 277, "codepoint" : 5 }, { "width" : 277, "codepoint" : 6 }, { "width" : 277, "codepoint" : 7 }, { "width" : 277, "codepoint" : 8 }, { "width" : 277, "codepoint" : 9 }, { "width" : 277, "codepoint" : 10 }, { "width" : 277, "codepoint" : 11 }, { "width" : 277, "codepoint" : 12 }, { "width" : 277, "codepoint" : 13 }, { "width" : 277, "codepoint" : 14 }, { "width" : 277, "codepoint" : 15 }, { "width" : 277, "codepoint" : 16 }, { "width" : 277, "codepoint" : 17 }, { "width" : 277, "codepoint" : 18 }, { "width" : 277, "codepoint" : 19 }, { "width" : 277, "codepoint" : 20 }, { "width" : 277, "codepoint" : 21 }, { "width" : 277, "codepoint" : 22 }, { "width" : 277, "codepoint" : 23 }, { "width" : 277, "codepoint" : 24 }, { "width" : 277, "codepoint" : 25 }, { "width" : 277, "codepoint" : 26 }, { "width" : 277, "codepoint" : 27 }, { "width" : 277, "codepoint" : 28 }, { "width" : 277, "codepoint" : 29 }, { "width" : 277, "codepoint" : 30 }, { "width" : 277, "codepoint" : 31 }, { "width" : 277, "codepoint" : 32 }, { "width" : 332, "codepoint" : 33 }, { "width" : 473, "codepoint" : 34 }, { "width" : 555, "codepoint" : 35 }, { "width" : 555, "codepoint" : 36 }, { "width" : 888, "codepoint" : 37 }, { "width" : 721, "codepoint" : 38 }, { "width" : 277, "codepoint" : 39 }, { "width" : 332, "codepoint" : 40 }, { "width" : 332, "codepoint" : 41 }, { "width" : 388, "codepoint" : 42 }, { "width" : 583, "codepoint" : 43 }, { "width" : 277, "codepoint" : 44 }, { "width" : 332, "codepoint" : 45 }, { "width" : 277, "codepoint" : 46 }, { "width" : 277, "codepoint" : 47 }, { "width" : 555, "codepoint" : 48 }, { "width" : 555, "codepoint" : 49 }, { "width" : 555, "codepoint" : 50 }, { "width" : 555, "codepoint" : 51 }, { "width" : 555, "codepoint" : 52 }, { "width" : 555, "codepoint" : 53 }, { "width" : 555, "codepoint" : 54 }, { "width" : 555, "codepoint" : 55 }, { "width" : 555, "codepoint" : 56 }, { "width" : 555, "codepoint" : 57 }, { "width" : 332, "codepoint" : 58 }, { "width" : 332, "codepoint" : 59 }, { "width" : 583, "codepoint" : 60 }, { "width" : 583, "codepoint" : 61 }, { "width" : 583, "codepoint" : 62 }, { "width" : 610, "codepoint" : 63 }, { "width" : 974, "codepoint" : 64 }, { "width" : 721, "codepoint" : 65 }, { "width" : 721, "codepoint" : 66 }, { "width" : 721, "codepoint" : 67 }, { "width" : 721, "codepoint" : 68 }, { "width" : 666, "codepoint" : 69 }, { "width" : 610, "codepoint" : 70 }, { "width" : 777, "codepoint" : 71 }, { "width" : 721, "codepoint" : 72 }, { "width" : 277, "codepoint" : 73 }, { "width" : 555, "codepoint" : 74 }, { "width" : 721, "codepoint" : 75 }, { "width" : 610, "codepoint" : 76 }, { "width" : 832, "codepoint" : 77 }, { "width" : 721, "codepoint" : 78 }, { "width" : 777, "codepoint" : 79 }, { "width" : 666, "codepoint" : 80 }, { "width" : 777, "codepoint" : 81 }, { "width" : 721, "codepoint" : 82 }, { "width" : 666, "codepoint" : 83 }, { "width" : 610, "codepoint" : 84 }, { "width" : 721, "codepoint" : 85 }, { "width" : 666, "codepoint" : 86 }, { "width" : 943, "codepoint" : 87 }, { "width" : 666, "codepoint" : 88 }, { "width" : 666, "codepoint" : 89 }, { "width" : 610, "codepoint" : 90 }, { "width" : 332, "codepoint" : 91 }, { "width" : 277, "codepoint" : 92 }, { "width" : 332, "codepoint" : 93 }, { "width" : 583, "codepoint" : 94 }, { "width" : 555, "codepoint" : 95 }, { "width" : 277, "codepoint" : 96 }, { "width" : 555, "codepoint" : 97 }, { "width" : 610, "codepoint" : 98 }, { "width" : 555, "codepoint" : 99 }, { "width" : 610, "codepoint" : 100 }, { "width" : 555, "codepoint" : 101 }, { "width" : 332, "codepoint" : 102 }, { "width" : 610, "codepoint" : 103 }, { "width" : 610, "codepoint" : 104 }, { "width" : 277, "codepoint" : 105 }, { "width" : 277, "codepoint" : 106 }, { "width" : 555, "codepoint" : 107 }, { "width" : 277, "codepoint" : 108 }, { "width" : 888, "codepoint" : 109 }, { "width" : 610, "codepoint" : 110 }, { "width" : 610, "codepoint" : 111 }, { "width" : 610, "codepoint" : 112 }, { "width" : 610, "codepoint" : 113 }, { "width" : 388, "codepoint" : 114 }, { "width" : 555, "codepoint" : 115 }, { "width" : 332, "codepoint" : 116 }, { "width" : 610, "codepoint" : 117 }, { "width" : 555, "codepoint" : 118 }, { "width" : 777, "codepoint" : 119 }, { "width" : 555, "codepoint" : 120 }, { "width" : 555, "codepoint" : 121 }, { "width" : 499, "codepoint" : 122 }, { "width" : 388, "codepoint" : 123 }, { "width" : 279, "codepoint" : 124 }, { "width" : 388, "codepoint" : 125 }, { "width" : 583, "codepoint" : 126 }, { "width" : 277, "codepoint" : 127 }, { "width" : 277, "codepoint" : 128 }, { "width" : 277, "codepoint" : 129 }, { "width" : 277, "codepoint" : 130 }, { "width" : 277, "codepoint" : 131 }, { "width" : 277, "codepoint" : 132 }, { "width" : 277, "codepoint" : 133 }, { "width" : 277, "codepoint" : 134 }, { "width" : 277, "codepoint" : 135 }, { "width" : 277, "codepoint" : 136 }, { "width" : 277, "codepoint" : 137 }, { "width" : 277, "codepoint" : 138 }, { "width" : 277, "codepoint" : 139 }, { "width" : 277, "codepoint" : 140 }, { "width" : 277, "codepoint" : 141 }, { "width" : 277, "codepoint" : 142 }, { "width" : 277, "codepoint" : 143 }, { "width" : 277, "codepoint" : 144 }, { "width" : 277, "codepoint" : 145 }, { "width" : 277, "codepoint" : 146 }, { "width" : 277, "codepoint" : 147 }, { "width" : 277, "codepoint" : 148 }, { "width" : 277, "codepoint" : 149 }, { "width" : 277, "codepoint" : 150 }, { "width" : 277, "codepoint" : 151 }, { "width" : 277, "codepoint" : 152 }, { "width" : 277, "codepoint" : 153 }, { "width" : 277, "codepoint" : 154 }, { "width" : 277, "codepoint" : 155 }, { "width" : 277, "codepoint" : 156 }, { "width" : 277, "codepoint" : 157 }, { "width" : 277, "codepoint" : 158 }, { "width" : 277, "codepoint" : 159 }, { "width" : 277, "codepoint" : 160 }, { "width" : 332, "codepoint" : 161 }, { "width" : 555, "codepoint" : 162 }, { "width" : 555, "codepoint" : 163 }, { "width" : 166, "codepoint" : 164 }, { "width" : 555, "codepoint" : 165 }, { "width" : 555, "codepoint" : 166 }, { "width" : 555, "codepoint" : 167 }, { "width" : 555, "codepoint" : 168 }, { "width" : 237, "codepoint" : 169 }, { "width" : 499, "codepoint" : 170 }, { "width" : 555, "codepoint" : 171 }, { "width" : 332, "codepoint" : 172 }, { "width" : 332, "codepoint" : 173 }, { "width" : 610, "codepoint" : 174 }, { "width" : 610, "codepoint" : 175 }, { "width" : 277, "codepoint" : 176 }, { "width" : 555, "codepoint" : 177 }, { "width" : 555, "codepoint" : 178 }, { "width" : 555, "codepoint" : 179 }, { "width" : 277, "codepoint" : 180 }, { "width" : 277, "codepoint" : 181 }, { "width" : 555, "codepoint" : 182 }, { "width" : 349, "codepoint" : 183 }, { "width" : 277, "codepoint" : 184 }, { "width" : 499, "codepoint" : 185 }, { "width" : 499, "codepoint" : 186 }, { "width" : 555, "codepoint" : 187 }, { "width" : 999, "codepoint" : 188 }, { "width" : 999, "codepoint" : 189 }, { "width" : 277, "codepoint" : 190 }, { "width" : 610, "codepoint" : 191 }, { "width" : 277, "codepoint" : 192 }, { "width" : 332, "codepoint" : 193 }, { "width" : 332, "codepoint" : 194 }, { "width" : 332, "codepoint" : 195 }, { "width" : 721, "codepoint" : 196 }, { "width" : 332, "codepoint" : 197 }, { "width" : 332, "codepoint" : 198 }, { "width" : 332, "codepoint" : 199 }, { "width" : 332, "codepoint" : 200 }, { "width" : 277, "codepoint" : 201 }, { "width" : 332, "codepoint" : 202 }, { "width" : 332, "codepoint" : 203 }, { "width" : 277, "codepoint" : 204 }, { "width" : 332, "codepoint" : 205 }, { "width" : 332, "codepoint" : 206 }, { "width" : 332, "codepoint" : 207 }, { "width" : 999, "codepoint" : 208 }, { "width" : 277, "codepoint" : 209 }, { "width" : 277, "codepoint" : 210 }, { "width" : 277, "codepoint" : 211 }, { "width" : 277, "codepoint" : 212 }, { "width" : 277, "codepoint" : 213 }, { "width" : 777, "codepoint" : 214 }, { "width" : 277, "codepoint" : 215 }, { "width" : 277, "codepoint" : 216 }, { "width" : 277, "codepoint" : 217 }, { "width" : 277, "codepoint" : 218 }, { "width" : 277, "codepoint" : 219 }, { "width" : 721, "codepoint" : 220 }, { "width" : 277, "codepoint" : 221 }, { "width" : 277, "codepoint" : 222 }, { "width" : 610, "codepoint" : 223 }, { "width" : 277, "codepoint" : 224 }, { "width" : 999, "codepoint" : 225 }, { "width" : 277, "codepoint" : 226 }, { "width" : 369, "codepoint" : 227 }, { "width" : 555, "codepoint" : 228 }, { "width" : 277, "codepoint" : 229 }, { "width" : 277, "codepoint" : 230 }, { "width" : 277, "codepoint" : 231 }, { "width" : 610, "codepoint" : 232 }, { "width" : 777, "codepoint" : 233 }, { "width" : 999, "codepoint" : 234 }, { "width" : 364, "codepoint" : 235 }, { "width" : 277, "codepoint" : 236 }, { "width" : 277, "codepoint" : 237 }, { "width" : 277, "codepoint" : 238 }, { "width" : 277, "codepoint" : 239 }, { "width" : 277, "codepoint" : 240 }, { "width" : 888, "codepoint" : 241 }, { "width" : 277, "codepoint" : 242 }, { "width" : 277, "codepoint" : 243 }, { "width" : 277, "codepoint" : 244 }, { "width" : 277, "codepoint" : 245 }, { "width" : 610, "codepoint" : 246 }, { "width" : 277, "codepoint" : 247 }, { "width" : 277, "codepoint" : 248 }, { "width" : 610, "codepoint" : 249 }, { "width" : 943, "codepoint" : 250 }, { "width" : 610, "codepoint" : 251 }, { "width" : 610, "codepoint" : 252 }, { "width" : 277, "codepoint" : 253 }, { "width" : 277, "codepoint" : 254 }, { "width" : 277, "codepoint" : 255 } ] PDF-Create-1.43/share/helvetica-bold.json0000644000175000017500000003362512757624336017516 0ustar manwarmanwar[ { "width" : 277, "codepoint" : 0 }, { "width" : 277, "codepoint" : 1 }, { "width" : 277, "codepoint" : 2 }, { "width" : 277, "codepoint" : 3 }, { "width" : 277, "codepoint" : 4 }, { "width" : 277, "codepoint" : 5 }, { "width" : 277, "codepoint" : 6 }, { "width" : 277, "codepoint" : 7 }, { "width" : 277, "codepoint" : 8 }, { "width" : 277, "codepoint" : 9 }, { "width" : 277, "codepoint" : 10 }, { "width" : 277, "codepoint" : 11 }, { "width" : 277, "codepoint" : 12 }, { "width" : 277, "codepoint" : 13 }, { "width" : 277, "codepoint" : 14 }, { "width" : 277, "codepoint" : 15 }, { "width" : 277, "codepoint" : 16 }, { "width" : 277, "codepoint" : 17 }, { "width" : 277, "codepoint" : 18 }, { "width" : 277, "codepoint" : 19 }, { "width" : 277, "codepoint" : 20 }, { "width" : 277, "codepoint" : 21 }, { "width" : 277, "codepoint" : 22 }, { "width" : 277, "codepoint" : 23 }, { "width" : 277, "codepoint" : 24 }, { "width" : 277, "codepoint" : 25 }, { "width" : 277, "codepoint" : 26 }, { "width" : 277, "codepoint" : 27 }, { "width" : 277, "codepoint" : 28 }, { "width" : 277, "codepoint" : 29 }, { "width" : 277, "codepoint" : 30 }, { "width" : 277, "codepoint" : 31 }, { "width" : 277, "codepoint" : 32 }, { "width" : 332, "codepoint" : 33 }, { "width" : 473, "codepoint" : 34 }, { "width" : 555, "codepoint" : 35 }, { "width" : 555, "codepoint" : 36 }, { "width" : 888, "codepoint" : 37 }, { "width" : 721, "codepoint" : 38 }, { "width" : 277, "codepoint" : 39 }, { "width" : 332, "codepoint" : 40 }, { "width" : 332, "codepoint" : 41 }, { "width" : 388, "codepoint" : 42 }, { "width" : 583, "codepoint" : 43 }, { "width" : 277, "codepoint" : 44 }, { "width" : 332, "codepoint" : 45 }, { "width" : 277, "codepoint" : 46 }, { "width" : 277, "codepoint" : 47 }, { "width" : 555, "codepoint" : 48 }, { "width" : 555, "codepoint" : 49 }, { "width" : 555, "codepoint" : 50 }, { "width" : 555, "codepoint" : 51 }, { "width" : 555, "codepoint" : 52 }, { "width" : 555, "codepoint" : 53 }, { "width" : 555, "codepoint" : 54 }, { "width" : 555, "codepoint" : 55 }, { "width" : 555, "codepoint" : 56 }, { "width" : 555, "codepoint" : 57 }, { "width" : 332, "codepoint" : 58 }, { "width" : 332, "codepoint" : 59 }, { "width" : 583, "codepoint" : 60 }, { "width" : 583, "codepoint" : 61 }, { "width" : 583, "codepoint" : 62 }, { "width" : 610, "codepoint" : 63 }, { "width" : 974, "codepoint" : 64 }, { "width" : 721, "codepoint" : 65 }, { "width" : 721, "codepoint" : 66 }, { "width" : 721, "codepoint" : 67 }, { "width" : 721, "codepoint" : 68 }, { "width" : 666, "codepoint" : 69 }, { "width" : 610, "codepoint" : 70 }, { "width" : 777, "codepoint" : 71 }, { "width" : 721, "codepoint" : 72 }, { "width" : 277, "codepoint" : 73 }, { "width" : 555, "codepoint" : 74 }, { "width" : 721, "codepoint" : 75 }, { "width" : 610, "codepoint" : 76 }, { "width" : 832, "codepoint" : 77 }, { "width" : 721, "codepoint" : 78 }, { "width" : 777, "codepoint" : 79 }, { "width" : 666, "codepoint" : 80 }, { "width" : 777, "codepoint" : 81 }, { "width" : 721, "codepoint" : 82 }, { "width" : 666, "codepoint" : 83 }, { "width" : 610, "codepoint" : 84 }, { "width" : 721, "codepoint" : 85 }, { "width" : 666, "codepoint" : 86 }, { "width" : 943, "codepoint" : 87 }, { "width" : 666, "codepoint" : 88 }, { "width" : 666, "codepoint" : 89 }, { "width" : 610, "codepoint" : 90 }, { "width" : 332, "codepoint" : 91 }, { "width" : 277, "codepoint" : 92 }, { "width" : 332, "codepoint" : 93 }, { "width" : 583, "codepoint" : 94 }, { "width" : 555, "codepoint" : 95 }, { "width" : 277, "codepoint" : 96 }, { "width" : 555, "codepoint" : 97 }, { "width" : 610, "codepoint" : 98 }, { "width" : 555, "codepoint" : 99 }, { "width" : 610, "codepoint" : 100 }, { "width" : 555, "codepoint" : 101 }, { "width" : 332, "codepoint" : 102 }, { "width" : 610, "codepoint" : 103 }, { "width" : 610, "codepoint" : 104 }, { "width" : 277, "codepoint" : 105 }, { "width" : 277, "codepoint" : 106 }, { "width" : 555, "codepoint" : 107 }, { "width" : 277, "codepoint" : 108 }, { "width" : 888, "codepoint" : 109 }, { "width" : 610, "codepoint" : 110 }, { "width" : 610, "codepoint" : 111 }, { "width" : 610, "codepoint" : 112 }, { "width" : 610, "codepoint" : 113 }, { "width" : 388, "codepoint" : 114 }, { "width" : 555, "codepoint" : 115 }, { "width" : 332, "codepoint" : 116 }, { "width" : 610, "codepoint" : 117 }, { "width" : 555, "codepoint" : 118 }, { "width" : 777, "codepoint" : 119 }, { "width" : 555, "codepoint" : 120 }, { "width" : 555, "codepoint" : 121 }, { "width" : 499, "codepoint" : 122 }, { "width" : 388, "codepoint" : 123 }, { "width" : 279, "codepoint" : 124 }, { "width" : 388, "codepoint" : 125 }, { "width" : 583, "codepoint" : 126 }, { "width" : 277, "codepoint" : 127 }, { "width" : 277, "codepoint" : 128 }, { "width" : 277, "codepoint" : 129 }, { "width" : 277, "codepoint" : 130 }, { "width" : 277, "codepoint" : 131 }, { "width" : 277, "codepoint" : 132 }, { "width" : 277, "codepoint" : 133 }, { "width" : 277, "codepoint" : 134 }, { "width" : 277, "codepoint" : 135 }, { "width" : 277, "codepoint" : 136 }, { "width" : 277, "codepoint" : 137 }, { "width" : 277, "codepoint" : 138 }, { "width" : 277, "codepoint" : 139 }, { "width" : 277, "codepoint" : 140 }, { "width" : 277, "codepoint" : 141 }, { "width" : 277, "codepoint" : 142 }, { "width" : 277, "codepoint" : 143 }, { "width" : 277, "codepoint" : 144 }, { "width" : 277, "codepoint" : 145 }, { "width" : 277, "codepoint" : 146 }, { "width" : 277, "codepoint" : 147 }, { "width" : 277, "codepoint" : 148 }, { "width" : 277, "codepoint" : 149 }, { "width" : 277, "codepoint" : 150 }, { "width" : 277, "codepoint" : 151 }, { "width" : 277, "codepoint" : 152 }, { "width" : 277, "codepoint" : 153 }, { "width" : 277, "codepoint" : 154 }, { "width" : 277, "codepoint" : 155 }, { "width" : 277, "codepoint" : 156 }, { "width" : 277, "codepoint" : 157 }, { "width" : 277, "codepoint" : 158 }, { "width" : 277, "codepoint" : 159 }, { "width" : 277, "codepoint" : 160 }, { "width" : 332, "codepoint" : 161 }, { "width" : 555, "codepoint" : 162 }, { "width" : 555, "codepoint" : 163 }, { "width" : 555, "codepoint" : 164 }, { "width" : 555, "codepoint" : 165 }, { "width" : 388, "codepoint" : 166 }, { "width" : 555, "codepoint" : 167 }, { "width" : 388, "codepoint" : 168 }, { "width" : 666, "codepoint" : 169 }, { "width" : 332, "codepoint" : 170 }, { "width" : 555, "codepoint" : 171 }, { "width" : 555, "codepoint" : 172 }, { "width" : 332, "codepoint" : 173 }, { "width" : 666, "codepoint" : 174 }, { "width" : 444, "codepoint" : 175 }, { "width" : 388, "codepoint" : 176 }, { "width" : 555, "codepoint" : 177 }, { "width" : 332, "codepoint" : 178 }, { "width" : 332, "codepoint" : 179 }, { "width" : 277, "codepoint" : 180 }, { "width" : 555, "codepoint" : 181 }, { "width" : 555, "codepoint" : 182 }, { "width" : 349, "codepoint" : 183 }, { "width" : 277, "codepoint" : 184 }, { "width" : 332, "codepoint" : 185 }, { "width" : 332, "codepoint" : 186 }, { "width" : 555, "codepoint" : 187 }, { "width" : 777, "codepoint" : 188 }, { "width" : 777, "codepoint" : 189 }, { "width" : 777, "codepoint" : 190 }, { "width" : 610, "codepoint" : 191 }, { "width" : 721, "codepoint" : 192 }, { "width" : 721, "codepoint" : 193 }, { "width" : 721, "codepoint" : 194 }, { "width" : 721, "codepoint" : 195 }, { "width" : 721, "codepoint" : 196 }, { "width" : 721, "codepoint" : 197 }, { "width" : 888, "codepoint" : 198 }, { "width" : 721, "codepoint" : 199 }, { "width" : 721, "codepoint" : 200 }, { "width" : 721, "codepoint" : 201 }, { "width" : 721, "codepoint" : 202 }, { "width" : 721, "codepoint" : 203 }, { "width" : 277, "codepoint" : 204 }, { "width" : 332, "codepoint" : 205 }, { "width" : 332, "codepoint" : 206 }, { "width" : 332, "codepoint" : 207 }, { "width" : 721, "codepoint" : 208 }, { "width" : 721, "codepoint" : 209 }, { "width" : 721, "codepoint" : 210 }, { "width" : 721, "codepoint" : 211 }, { "width" : 721, "codepoint" : 212 }, { "width" : 721, "codepoint" : 213 }, { "width" : 777, "codepoint" : 214 }, { "width" : 555, "codepoint" : 215 }, { "width" : 721, "codepoint" : 216 }, { "width" : 721, "codepoint" : 217 }, { "width" : 721, "codepoint" : 218 }, { "width" : 721, "codepoint" : 219 }, { "width" : 721, "codepoint" : 220 }, { "width" : 721, "codepoint" : 221 }, { "width" : 610, "codepoint" : 222 }, { "width" : 610, "codepoint" : 223 }, { "width" : 555, "codepoint" : 224 }, { "width" : 555, "codepoint" : 225 }, { "width" : 555, "codepoint" : 226 }, { "width" : 555, "codepoint" : 227 }, { "width" : 555, "codepoint" : 228 }, { "width" : 555, "codepoint" : 229 }, { "width" : 777, "codepoint" : 230 }, { "width" : 555, "codepoint" : 231 }, { "width" : 555, "codepoint" : 232 }, { "width" : 555, "codepoint" : 233 }, { "width" : 555, "codepoint" : 234 }, { "width" : 555, "codepoint" : 235 }, { "width" : 277, "codepoint" : 236 }, { "width" : 277, "codepoint" : 237 }, { "width" : 277, "codepoint" : 238 }, { "width" : 277, "codepoint" : 239 }, { "width" : 555, "codepoint" : 240 }, { "width" : 555, "codepoint" : 241 }, { "width" : 555, "codepoint" : 242 }, { "width" : 555, "codepoint" : 243 }, { "width" : 555, "codepoint" : 244 }, { "width" : 555, "codepoint" : 245 }, { "width" : 555, "codepoint" : 246 }, { "width" : 555, "codepoint" : 247 }, { "width" : 555, "codepoint" : 248 }, { "width" : 610, "codepoint" : 249 }, { "width" : 555, "codepoint" : 250 }, { "width" : 555, "codepoint" : 251 }, { "width" : 610, "codepoint" : 252 }, { "width" : 555, "codepoint" : 253 }, { "width" : 555, "codepoint" : 254 }, { "width" : 555, "codepoint" : 255 } ] PDF-Create-1.43/share/symbol.json0000644000175000017500000003363112711527224016122 0ustar manwarmanwar[ { "codepoint" : 0, "width" : 250 }, { "width" : 250, "codepoint" : 1 }, { "codepoint" : 2, "width" : 250 }, { "codepoint" : 3, "width" : 250 }, { "codepoint" : 4, "width" : 250 }, { "width" : 250, "codepoint" : 5 }, { "width" : 250, "codepoint" : 6 }, { "codepoint" : 7, "width" : 250 }, { "codepoint" : 8, "width" : 250 }, { "codepoint" : 9, "width" : 250 }, { "width" : 250, "codepoint" : 10 }, { "codepoint" : 11, "width" : 250 }, { "codepoint" : 12, "width" : 250 }, { "width" : 250, "codepoint" : 13 }, { "codepoint" : 14, "width" : 250 }, { "width" : 250, "codepoint" : 15 }, { "width" : 250, "codepoint" : 16 }, { "width" : 250, "codepoint" : 17 }, { "width" : 250, "codepoint" : 18 }, { "codepoint" : 19, "width" : 250 }, { "width" : 250, "codepoint" : 20 }, { "codepoint" : 21, "width" : 250 }, { "width" : 250, "codepoint" : 22 }, { "codepoint" : 23, "width" : 250 }, { "codepoint" : 24, "width" : 250 }, { "codepoint" : 25, "width" : 250 }, { "codepoint" : 26, "width" : 250 }, { "codepoint" : 27, "width" : 250 }, { "codepoint" : 28, "width" : 250 }, { "width" : 250, "codepoint" : 29 }, { "codepoint" : 30, "width" : 250 }, { "width" : 250, "codepoint" : 31 }, { "codepoint" : 32, "width" : 250 }, { "width" : 333, "codepoint" : 33 }, { "width" : 713, "codepoint" : 34 }, { "codepoint" : 35, "width" : 500 }, { "codepoint" : 36, "width" : 549 }, { "width" : 833, "codepoint" : 37 }, { "codepoint" : 38, "width" : 778 }, { "width" : 439, "codepoint" : 39 }, { "codepoint" : 40, "width" : 333 }, { "width" : 333, "codepoint" : 41 }, { "codepoint" : 42, "width" : 500 }, { "width" : 549, "codepoint" : 43 }, { "width" : 250, "codepoint" : 44 }, { "width" : 549, "codepoint" : 45 }, { "codepoint" : 46, "width" : 250 }, { "codepoint" : 47, "width" : 278 }, { "codepoint" : 48, "width" : 500 }, { "width" : 500, "codepoint" : 49 }, { "codepoint" : 50, "width" : 500 }, { "width" : 500, "codepoint" : 51 }, { "width" : 500, "codepoint" : 52 }, { "width" : 500, "codepoint" : 53 }, { "codepoint" : 54, "width" : 500 }, { "codepoint" : 55, "width" : 500 }, { "codepoint" : 56, "width" : 500 }, { "width" : 500, "codepoint" : 57 }, { "width" : 278, "codepoint" : 58 }, { "codepoint" : 59, "width" : 278 }, { "codepoint" : 60, "width" : 549 }, { "codepoint" : 61, "width" : 549 }, { "codepoint" : 62, "width" : 549 }, { "codepoint" : 63, "width" : 444 }, { "codepoint" : 64, "width" : 549 }, { "codepoint" : 65, "width" : 722 }, { "width" : 667, "codepoint" : 66 }, { "width" : 722, "codepoint" : 67 }, { "codepoint" : 68, "width" : 612 }, { "codepoint" : 69, "width" : 611 }, { "codepoint" : 70, "width" : 763 }, { "codepoint" : 71, "width" : 603 }, { "width" : 722, "codepoint" : 72 }, { "codepoint" : 73, "width" : 333 }, { "codepoint" : 74, "width" : 631 }, { "width" : 722, "codepoint" : 75 }, { "width" : 686, "codepoint" : 76 }, { "width" : 889, "codepoint" : 77 }, { "width" : 722, "codepoint" : 78 }, { "codepoint" : 79, "width" : 722 }, { "codepoint" : 80, "width" : 768 }, { "width" : 741, "codepoint" : 81 }, { "codepoint" : 82, "width" : 556 }, { "codepoint" : 83, "width" : 592 }, { "codepoint" : 84, "width" : 611 }, { "width" : 690, "codepoint" : 85 }, { "codepoint" : 86, "width" : 439 }, { "codepoint" : 87, "width" : 768 }, { "codepoint" : 88, "width" : 645 }, { "codepoint" : 89, "width" : 795 }, { "width" : 611, "codepoint" : 90 }, { "width" : 333, "codepoint" : 91 }, { "codepoint" : 92, "width" : 863 }, { "codepoint" : 93, "width" : 333 }, { "width" : 658, "codepoint" : 94 }, { "codepoint" : 95, "width" : 500 }, { "codepoint" : 96, "width" : 500 }, { "codepoint" : 97, "width" : 631 }, { "codepoint" : 98, "width" : 549 }, { "width" : 549, "codepoint" : 99 }, { "codepoint" : 100, "width" : 494 }, { "width" : 439, "codepoint" : 101 }, { "width" : 521, "codepoint" : 102 }, { "codepoint" : 103, "width" : 411 }, { "codepoint" : 104, "width" : 603 }, { "codepoint" : 105, "width" : 329 }, { "width" : 603, "codepoint" : 106 }, { "width" : 549, "codepoint" : 107 }, { "codepoint" : 108, "width" : 549 }, { "codepoint" : 109, "width" : 576 }, { "codepoint" : 110, "width" : 521 }, { "codepoint" : 111, "width" : 549 }, { "width" : 549, "codepoint" : 112 }, { "codepoint" : 113, "width" : 521 }, { "codepoint" : 114, "width" : 549 }, { "width" : 603, "codepoint" : 115 }, { "codepoint" : 116, "width" : 439 }, { "width" : 576, "codepoint" : 117 }, { "codepoint" : 118, "width" : 713 }, { "width" : 686, "codepoint" : 119 }, { "width" : 493, "codepoint" : 120 }, { "width" : 686, "codepoint" : 121 }, { "width" : 494, "codepoint" : 122 }, { "codepoint" : 123, "width" : 480 }, { "width" : 200, "codepoint" : 124 }, { "width" : 480, "codepoint" : 125 }, { "codepoint" : 126, "width" : 549 }, { "width" : 250, "codepoint" : 127 }, { "width" : 250, "codepoint" : 128 }, { "codepoint" : 129, "width" : 250 }, { "width" : 250, "codepoint" : 130 }, { "codepoint" : 131, "width" : 250 }, { "codepoint" : 132, "width" : 250 }, { "width" : 250, "codepoint" : 133 }, { "codepoint" : 134, "width" : 250 }, { "codepoint" : 135, "width" : 250 }, { "width" : 250, "codepoint" : 136 }, { "codepoint" : 137, "width" : 250 }, { "codepoint" : 138, "width" : 250 }, { "width" : 250, "codepoint" : 139 }, { "width" : 250, "codepoint" : 140 }, { "codepoint" : 141, "width" : 250 }, { "codepoint" : 142, "width" : 250 }, { "width" : 250, "codepoint" : 143 }, { "width" : 250, "codepoint" : 144 }, { "width" : 250, "codepoint" : 145 }, { "codepoint" : 146, "width" : 250 }, { "codepoint" : 147, "width" : 250 }, { "width" : 250, "codepoint" : 148 }, { "codepoint" : 149, "width" : 250 }, { "codepoint" : 150, "width" : 250 }, { "codepoint" : 151, "width" : 250 }, { "width" : 250, "codepoint" : 152 }, { "codepoint" : 153, "width" : 250 }, { "codepoint" : 154, "width" : 250 }, { "codepoint" : 155, "width" : 250 }, { "width" : 250, "codepoint" : 156 }, { "width" : 250, "codepoint" : 157 }, { "codepoint" : 158, "width" : 250 }, { "codepoint" : 159, "width" : 250 }, { "codepoint" : 160, "width" : 250 }, { "width" : 620, "codepoint" : 161 }, { "width" : 247, "codepoint" : 162 }, { "codepoint" : 163, "width" : 549 }, { "width" : 167, "codepoint" : 164 }, { "codepoint" : 165, "width" : 713 }, { "width" : 500, "codepoint" : 166 }, { "width" : 753, "codepoint" : 167 }, { "width" : 753, "codepoint" : 168 }, { "codepoint" : 169, "width" : 753 }, { "codepoint" : 170, "width" : 753 }, { "width" : 1042, "codepoint" : 171 }, { "width" : 987, "codepoint" : 172 }, { "width" : 603, "codepoint" : 173 }, { "width" : 987, "codepoint" : 174 }, { "width" : 603, "codepoint" : 175 }, { "width" : 400, "codepoint" : 176 }, { "codepoint" : 177, "width" : 549 }, { "codepoint" : 178, "width" : 411 }, { "codepoint" : 179, "width" : 549 }, { "codepoint" : 180, "width" : 549 }, { "codepoint" : 181, "width" : 713 }, { "codepoint" : 182, "width" : 494 }, { "codepoint" : 183, "width" : 460 }, { "codepoint" : 184, "width" : 549 }, { "width" : 549, "codepoint" : 185 }, { "width" : 549, "codepoint" : 186 }, { "codepoint" : 187, "width" : 549 }, { "codepoint" : 188, "width" : 1000 }, { "width" : 603, "codepoint" : 189 }, { "codepoint" : 190, "width" : 1000 }, { "codepoint" : 191, "width" : 658 }, { "codepoint" : 192, "width" : 823 }, { "width" : 686, "codepoint" : 193 }, { "codepoint" : 194, "width" : 795 }, { "width" : 987, "codepoint" : 195 }, { "width" : 768, "codepoint" : 196 }, { "codepoint" : 197, "width" : 768 }, { "width" : 823, "codepoint" : 198 }, { "codepoint" : 199, "width" : 768 }, { "codepoint" : 200, "width" : 768 }, { "codepoint" : 201, "width" : 713 }, { "codepoint" : 202, "width" : 713 }, { "codepoint" : 203, "width" : 713 }, { "codepoint" : 204, "width" : 713 }, { "codepoint" : 205, "width" : 713 }, { "codepoint" : 206, "width" : 713 }, { "codepoint" : 207, "width" : 713 }, { "width" : 768, "codepoint" : 208 }, { "width" : 713, "codepoint" : 209 }, { "width" : 790, "codepoint" : 210 }, { "width" : 790, "codepoint" : 211 }, { "width" : 890, "codepoint" : 212 }, { "codepoint" : 213, "width" : 823 }, { "width" : 549, "codepoint" : 214 }, { "codepoint" : 215, "width" : 250 }, { "codepoint" : 216, "width" : 713 }, { "width" : 603, "codepoint" : 217 }, { "codepoint" : 218, "width" : 603 }, { "width" : 1042, "codepoint" : 219 }, { "codepoint" : 220, "width" : 987 }, { "width" : 603, "codepoint" : 221 }, { "width" : 987, "codepoint" : 222 }, { "codepoint" : 223, "width" : 603 }, { "codepoint" : 224, "width" : 494 }, { "width" : 329, "codepoint" : 225 }, { "width" : 790, "codepoint" : 226 }, { "codepoint" : 227, "width" : 790 }, { "codepoint" : 228, "width" : 786 }, { "codepoint" : 229, "width" : 713 }, { "width" : 384, "codepoint" : 230 }, { "width" : 384, "codepoint" : 231 }, { "width" : 384, "codepoint" : 232 }, { "width" : 384, "codepoint" : 233 }, { "codepoint" : 234, "width" : 384 }, { "width" : 384, "codepoint" : 235 }, { "codepoint" : 236, "width" : 494 }, { "codepoint" : 237, "width" : 494 }, { "width" : 494, "codepoint" : 238 }, { "width" : 494, "codepoint" : 239 }, { "width" : 250, "codepoint" : 240 }, { "width" : 329, "codepoint" : 241 }, { "codepoint" : 242, "width" : 274 }, { "width" : 686, "codepoint" : 243 }, { "width" : 686, "codepoint" : 244 }, { "codepoint" : 245, "width" : 686 }, { "codepoint" : 246, "width" : 384 }, { "width" : 384, "codepoint" : 247 }, { "codepoint" : 248, "width" : 384 }, { "width" : 384, "codepoint" : 249 }, { "codepoint" : 250, "width" : 384 }, { "width" : 384, "codepoint" : 251 }, { "width" : 494, "codepoint" : 252 }, { "width" : 494, "codepoint" : 253 }, { "width" : 494, "codepoint" : 254 }, { "codepoint" : 255, "width" : 250 } ] PDF-Create-1.43/eg/0000755000175000017500000000000013161531451013202 5ustar manwarmanwarPDF-Create-1.43/eg/verify-char-width0000644000175000017500000000342212711526500016461 0ustar manwarmanwar#!/usr/bin/perl # Inspired by the script provided by SREZIC (https://rt.cpan.org/Ticket/Display.html?id=110723) use strict; use warnings; use Getopt::Long; use PDF::Create; use PDF::Font; my $usage =<] [--help] Supported font names are as below: - Courier - Courier-Bold - Courier-BoldOblique - Courier-Oblique - Helvetica - Helvetica-Bold - Helvetica-BoldOblique - Helvetica-Oblique - Times-Bold - Times-BoldItalic - Times-Italic - Times-Roman - Symbol HELP my ($font_name, $help); GetOptions("font-name=s" => \$font_name, "help" => \$help) or die $usage; (defined $help) && die $usage; die "ERROR: Missing font name.\n" unless defined $font_name; die "ERROR: Invalid font name [$font_name].\n" unless (exists $PDF::Font::SUPPORTED_FONTS->{$font_name}); my $pdf = PDF::Create->new(filename => sprintf("%s.pdf", lc($font_name))); my $root = $pdf->new_page(MediaBox => $pdf->get_page_size('A4')); my $page = $root->new_page; my $font; if ($font_name eq 'Symbol') { $font = $pdf->font(BaseFont => $font_name, Encoding => $font_name); } else { $font = $pdf->font(BaseFont => $font_name); } my $x = 20; my $y = 800; foreach my $char (32..126, 160..255) { my $chr = chr($char); my $str = $chr . ':' . $char; my $w = $page->string_width($font, $str) * 20; if ($x + 55 > 575) { $x = 20; $y -= 30; } $page->string($font, 20, $x, $y, $str); my $w_line = $page->string_width($font, $chr) * 20; $page->line($x, $y, $x+$w_line, $y); $page->line($x, $y+20, $x+$w_line, $y+20); $page->line($x, $y, $x, $y+20); $page->line($x+$w_line, $y, $x+$w_line, $y+20); $x += 65; } $pdf->close; __END__ PDF-Create-1.43/eg/pdf-logo.jpg0000644000175000017500000000540112700523573015417 0ustar manwarmanwarJFIF``ExifMM*QQQ>Q 嫵\[^EFHUWՈ3300݃jo椦no{z}89=AfffX[˼ff쎏HHstt׵ゃWZILuw'*QSqqshh§ps$$GI腅fffff?Bdgᙙᗙ͙;<ﹺ|~!$vuxڷ겲BE}C      C  22" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?z>xtKWF%Lp3NJ_OgD׍ IcմfL#MIVKwDnXՎ0^_E~ɿkk?|}wjڜn-tIcU\>ͥHO qY~+-~$  }YZ?3Hd 7e{Y(nX/> <$7SWQJ*%XJ1KZWk7-#˥Ͷq& _[3iYKefWQ9k?Ux7ĺ4 jQidw!A"zO%]RO gg|*㻿z+JPE-0/o/ڴ7_ <yTh0vrWsH 0r,6 T}cDW[pxgUTQ NRkM%{G/7eMaKm uO}B9KpʨIaGCjݜ5*!pA?'o3~ɿhz_"~6iI״Ɛ LA1@=k_TpZ=y!gq|B JIaiʯ{^3#y%EVu<}RөQ]υx' ퟊͵R8y^^c?L,Ԥ݆X,WAO<~syO(O=bT\+|'a~33:__*xkT'~!k?ck(gz-fW]MX-OyH U2+8ʝ4ߢ>Ä+KT8hY29YvJxsDőX9C$4Ɔy:c#_A%>*|>um?^k;9Hn9O 5,P.,.H:~9J2>Tt.YEѦM=S[4GQEb V }mIW4V[xҸk?~ o,PXVodZt2 }{(Z2{l|4U )lj Mq> [tM6V ?gGR̈Y$it?z,0-VvZ.5]\͜udOHl[T5[m6]F{uʱMVFAk$Ӗwwr~6{vF/м/}=Z}_Aeo' 5&[2|ryhFWtK}kdϩ̳xeK&As6rMhRh(Ii}_ZH7ݙٸ,@U'GM-ۦM(؉ <1kffKwwbb+u|S~i~ī}he46 $ny\TdQcOZťI[蒠L?#D<F#61K䍀 ֔r5:((-:[ea,xv&Ui|mɫIIZN]}WQ[6=gNeY GV8'4QU PA'ކ xkM?dM)]h'IΑ3jʊ*dQEbPDF-Create-1.43/eg/sample.pl0000755000175000017500000000372712700523573015040 0ustar manwarmanwar#!/usr/bin/perl # PDF::Create sample usage use strict; use warnings; use PDF::Create; my $pdf = new PDF::Create( 'filename' => 'sample.pdf', 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'John Doe', 'Title' => 'Sample Document' ); my $root = $pdf->new_page('MediaBox' => $pdf->get_page_size('a4')); # Prepare 2 fonts my $font1 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica' ); my $font2 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica-Bold' ); # Add a page which inherits its attributes from $root my $page1 = $root->new_page; # Prepare a Table of Content my $toc = $pdf->new_outline('Title' => 'Sample Document'); # Add an entry to the outline $toc->new_outline('Title' => 'Page 1', 'Destination' => $page1); # Write some text to the page $page1->stringc($font2, 40, 306, 426, 'PDF::Create'); $page1->stringc($font1, 20, 306, 396, "version $PDF::Create::VERSION"); $page1->stringc($font1, 20, 300, 300, 'Fabien Tassin'); $page1->stringc($font1, 20, 300, 250, 'Markus Baertschi (markus@markus.org)'); # Add another page my $page2 = $root->new_page; my $s2 = $toc->new_outline('Title' => 'Page 2', 'Destination' => $page2); $s2->new_outline('Title' => 'GIF'); $s2->new_outline('Title' => 'JPEG'); # Draw a border around the page (A4 max is 595/842) $page2->line(10, 10, 10, 832); $page2->line(10, 10, 585, 10); $page2->line(10, 832, 585, 832); $page2->line(585, 10, 585, 832); # Add a gif image $page2->string($font1, 20, 50, 600, 'GIF Image:'); my $image1 = $pdf->image('pdf-logo.gif'); $page2->image('image'=>$image1, 'xscale'=>0.2, 'yscale'=>0.2, 'xpos'=>200, 'ypos'=>600); # Add a jpeg image $page2->string($font1, 20, 50, 500, 'JPEG Image:'); my $image2 = $pdf->image('pdf-logo.jpg'); $page2->image('image'=>$image2, 'xscale'=>0.2,'yscale'=>0.2, 'xpos'=>200, 'ypos'=>500); # Wrap up the PDF and close the file $pdf->close; PDF-Create-1.43/eg/pdf-logo.gif0000644000175000017500000002171212700523573015407 0ustar manwarmanwarGIF89a333fff33f3f3f3f3f3̙ff3f̙ff̙3̙33ff3333ff3f̙ff3ff33f3fff3f3ff3f3333f33ff33ff̙33fff3333f33f3fff̙f33ff33̙ff3̙f3ff333fff3f33ff33ff3f3fff3f33f33fff33333f3333ffff33f33f3̙ff̙f333ff̙f̙ff33f3f33̙f33ffff3̙33ff3fff33fff33f33f3333ffffffff3333̙33!,@H*,HÇ#JHŋ3jȱǏ C“(S\ɲ%†JI͛8sɳϟ@ Jѣ4 ǴxtIի "ʵׯ`Ê`ӳh @@ KKݻx˷߿ \7D!gҥǘ+ϠCs޻̢S]tV˞cl0< x3E\KL\0@ :]xI.`S;u^7zj߽0W?EAY4~|'z~9(Z|w7=}O_WWd)[E !^ lay^"UVT$8N "jW=*bGfiTVg9vԔ~ݸڌT棘a fZ_vLUyp~:U'gwvgr{Bg*7 饘fi^R)L#Ϩjꩨꪬ*무j뭸駓Vׯ $caƒ$69  WضTFڪxJ`mG)Ѷ zk/;Ev$P^g| cAD4@b rܱU,(g1E!K<TP4?ݒK%H"p6JPcmUd80kUvXEktpo5(uF#|47 O'[<2I7xQ?ItsF?$9M6G0gA,1*tFN.nصu <^$DW|fK|JDc:B|g49{'?CPl& `җ7ܭ_BwzW;pzЃ#zGA1h$Ot1@|a Cxup~8V$m)ߑA-P qAp OXV,D5Dj'kaD(NYLȑ'#l] v;핏t|ahp `Hðq)"q£#D ɋ1b%5F #$gJʼnr#N.듭+a)K-Rka.)D02H(MČ&Nع^{ uQdD&pΘ@&5gh8c;EIS5-LAU.Gi͛҅]B''c!;-cOzT$'2/ђ-tèIWZ/:oLgJӚHҞ@>3T>gYq8TJժz_Y*qN< X:]!%-?f%:Ԣ<&u6kr]g)~ (Z7J;qFхLwalc#䕬}kQNg⺚ľ4`ZT3^4Kh1'âV/`-Z3Eq[Hv(Z}Z*@ַ{uN` [&ewmn[o@o[(%9|o+DS'EI.]K澺Ho9ew6 bMΰ7L _  q̞VMWb`wh.RfBKb̠bch>VSR`Eؑ_d3:)#)wjaJ˫[h%l/tNb"e`}fQx9ҢL&(g?Ta3ЀfP nVht̴6NBjtzi{'8nk'P6&.8ӏuB39nNWEꟺE8IV6;kPޯwP[\{z?aodƓYG8hS~ǖ#br#{_s MՓAsMJOAGLmWSޢ7d}Ƒ_‡p6{ ">|헍O~ ~,mJ @SϿEbTu9D8Xx ؀q nG~7JV+x7!()E%hBfC:,d.e]Um.5b@aeZ?(NlRb?]2]nMZ!x`][Nl"\LfYk_m}``Xq^bwhA]s`Qw=|%~WuU!zu)^s!HFb}`Eĥ(%j…MщM P )Zޥ6`55:Gh{a&˜Zh#'pc"|1]8o<[y!\HpȍtA$x$h%rEЏ0QvhuQi8VxхQ~EJ"y2uay!!aX`QH^A@iI()#j8_g4Y6ُ ).l%8ؐ Ó xR\ю2ۨGJiȋȅF)e)J(L&FYŨa1H!ei%EI 7Y9 PؖŗW9]%OHifR9I0oYSw陉sbwQEw,1 IYw,hȚ+#*~B;C'}#hvJtՃD@梜QwpX&Z&e|dBE\$t9 >,Ly.yH9dl.7)N™lkyk9y5D'IU# )xI.Y6/[vrc-ؠ^3{*k)"Dh3$fl@ c&z#gGL"n:#[2f N |ɤ=lVZQFN2,+p6ǣ:g5h kZ3nA8bZJsc6ȦtmqzJQɨKsmaJTfJc&Gc-&jJUTBkhʪbd3G1nWe39yÝZNᄫ/\:jkJJ<2J>zv,j[\wmkJk9Ya1D=ko%Al^ģZxYL¤ł‰w릩GefeZbl\!s^\} INjAwL)f,kL:әǭĀ|6Pt|FE:rFeM$HF2O,Su/jPK{\.ћMɿ np )S\pFC:%:,3-$1U:ӁRӂA 9cҿbNPR=:T8XZ\^`b=d]f}h-EӯUUt]v}xz|~׀؂=؄]؆}؈xMYԯ+(M}$p"EE]٠ xT#3/-١Nx%J=oڴ=m?p %=Ý} .}ر$1yh闭ʼnv)eX~ޙwA)(=) 2-&H9^>_!sUJcxoI9&"NaዂףrmЏIQ6I!=俭_Y@1~|XiNᔩ!XF[ՈsFMOgiXi&kOc^e^V=> !!HJn ZqP_nYnEQ$S~X~Ty\[N5~1XhzIZ镳Ά硱L_z1n~\)&ږN^Ց|tޘڝOɃ*{MXȡOi(.Ѯ$YN> *)ޣ1yΒ^TH2 |q.iɮ.#/,+#X!QWRF1NL`~Y?8"9s!jIg^򙱏bh͎IOb\aP 3Оs_FoV3&z?|_C wZn[y@xAo fdYqM@lGrg/ږ7^Ǟ/0oU)ߴߗ"5B>?ob#NAh9z/8HO@ DPBC q-^ĘQF=v2"%M6RʔN|RLls Sgw4WÐ?ETG"I UTU^jhDK~iȧY͞EVZ[%ؑlśWTX#]eFXھ?Lŕ-_ܰ1dΑ SZÛ;+Yj֭][lڵm-1jH @nōG\r׻{?;pխ_Ǟ]{lн_\x͟GOߡXB߇>~˯G=8@PO0B ? /@'j0h8D1ð5T1,X Q[;PcGXt1`QEF d-2J*!ٓ&mDA[-'$G Ds<"kEԈD7M;}<3M=׼#Cz[OCSSO4<9UNT1ŔDC),ЎLDI3EM9 SCSS/7K5VeE,SqNA;3"YuEvE*{WT=dЍ4A\60^OiLpGXC55[sږ+DT]E\{3JW ͵؈r6#jK^ZV_!mt\rۈJ=VExb77@z-&_3pFk}mƀK.9_ف%31#fVsֹa/VfS9ӝ mp&Yꩁ:ӟ:1k{:l];0eVbv;Sy" n6:oTAG}Zps u\Qձ絼)%3e+e|kҳlsgB:"ǔQm78 3iU!i#e+R͐\ sɈdRd'ɡm)H SGT$QUEJ#M-m\vRVk~9Ks ))&)kLMfkr$&7+nRhQ-u& xǑ-e)g=ٔoӝ%[$ƎR7 CCgs]z<ӉMf`_(y}f0!JK(NPf*55wQ_v&(Z̕ $o 0GctK=JG7j)mU n,*t.:836&[W{# Ojjr::MU6xa=סmZlnJ@GY+F9$@gPXHacaZ6Jhm2XvmBKVoۖXs-zdڭ{ή%#Kd\v0׼INtpH1G+f'XR W'w;8-4—fO5#c^>7̄)l] #= pcdY Jem\JX)*9_"8i\7Ze;KW2;e8MΕ|#)YFs_4h_nHN٩(:ɞK.5W-m C~8f tĈX{;NgU8esFc({,Q?FZt s4ENe};GWDZ&|HM 1,!V#2fN)k#Eqʖz m{/"U6o2ef6gw}j;,FmHw7snӦk,&|zfx};ǚCu9q;5?}pn[0ckKf/E{>yέsreVZ$xrgwf C%ݏX?3es/ξ|0%zНdbe󞷗U.; $;>ː&Z^$+~rD^T7޹v~+m#]0>R_$r={+uC)]{GMot,wLf?/ؤ~}<)xx؋ 3ïje߱{ю?ɿP>:? پ>q2K@M X2*2Bp@oB<4+A(YE#By;#?6Ae9\@S4sý D "4|cpcB3qR58ѳ>+,d̟1Bczڋ:*6lC$C:;Dzk)~<=;CۼS3D7ܽK;\C9ʲHħ;ªSC#AN\#D,>F_@T7]4REZDDA)ľqE=ӺbYSLT\9{i jIl7_{DpňcEEJ-S,Ay:{D|ǔ tG)Hł,L dȆTE'zoK#doHkGiAǎT- {sqHмIFBȼkFɜď$JR6ȣL!dJ!rʧJʪlʫJ 'application/x-pdf', -attachment => 'sample.pdf' ); # Open pdf to stdout my $pdf = new PDF::Create( 'filename' => '-', 'Version' => 1.2, 'PageMode' => 'UseOutlines', 'Author' => 'John Doe', 'Title' => 'Sample Document', ); # Prepare 2 fonts my $font1 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica' ); my $font2 = $pdf->font( 'Subtype' => 'Type1', 'Encoding' => 'WinAnsiEncoding', 'BaseFont' => 'Helvetica-Bold' ); # Prepare a Table of Content my $toc = $pdf->new_outline('Title' => 'Sample Document'); # Create root page my $page = $pdf->new_page('MediaBox' => $pdf->get_page_size('a4')); # Add a entry to the outline $toc->new_outline('Title' => 'Page 1', 'Destination' => $page); # Write some text to the page $page->stringc($font2, 40, 306, 426, 'PDF::Create'); $page->stringc($font1, 20, 306, 396, "version $PDF::Create::VERSION"); $page->stringc($font1, 20, 300, 300, 'Fabien Tassin'); $page->stringc($font1, 20, 300, 250, 'Markus Baertschi (markus@markus.org)'); $page->stringc($font1, 20, 300, 200, 'sample-cgi.pl'); # Wrap up the PDF and close the file $pdf->close;