1#!/usr/bin/env perl 2use warnings; 3use strict; 4use diagnostics; 5use PDF::Table; 6 7# Please use TABSTOP=4 for best view 8# ------------- 9# -A or -B on command line to select preferred library (if available) 10# then look for PDFpref file and read A or B forms 11my ($PDFpref, $rcA, $rcB); # which is available? 12my $prefFile = "./PDFpref"; 13my $prefDefault = "B"; # PDF::Builder default if no prefFile, or both installed 14if (@ARGV) { 15 # A or -A argument: set PDFpref to A else B 16 if ($ARGV[0] =~ m/^-?([AB])/i) { 17 $PDFpref = uc($1); 18 } else { 19 print STDERR "Unknown command line flag $ARGV[0] ignored.\n"; 20 } 21} 22if (!defined $PDFpref) { 23 if (-f $prefFile && -r $prefFile) { 24 open my $FH, '<', $prefFile or die "error opening $prefFile: $!\n"; 25 $PDFpref = <$FH>; 26 if ($PDFpref =~ m/^A/i) { 27 # something starting with A, assume want PDF::API2 28 $PDFpref = 'A'; 29 } elsif ($PDFpref =~ m/^B/i) { 30 # something starting with B, assume want PDF::Builder 31 $PDFpref = 'B'; 32 } elsif ($PDFpref =~ m/^PDF:{1,2}A/i) { 33 # something starting with PDF:A or PDF::A, assume want PDF::API2 34 $PDFpref = 'A'; 35 } elsif ($PDFpref =~ m/^PDF:{1,2}B/i) { 36 # something starting with PDF:B or PDF::B, assume want PDF::Builder 37 $PDFpref = 'B'; 38 } else { 39 print STDERR "Don't see A... or B..., default to $prefDefault\n"; 40 $PDFpref = $prefDefault; 41 } 42 close $FH; 43 } else { 44 # no preference expressed, default to PDF::Builder 45 print STDERR "No preference file found, so default to $prefDefault\n"; 46 $PDFpref = $prefDefault; 47 } 48} 49foreach (1 .. 2) { 50 if ($PDFpref eq 'A') { # A(PI2) preferred 51 $rcA = eval { 52 require PDF::API2; 53 1; 54 }; 55 if (!defined $rcA) { $rcA = 0; } # else is 1; 56 if ($rcA) { $rcB = 0; last; } 57 $PDFpref = 'B'; 58 } 59 if ($PDFpref eq 'B') { # B(uilder) preferred 60 $rcB = eval { 61 require PDF::Builder; 62 1; 63 }; 64 if (!defined $rcB) { $rcB = 0; } # else is 1; 65 if ($rcB) { $rcA = 0; last; } 66 $PDFpref = 'A'; 67 } 68} 69if (!$rcA && !$rcB) { 70 die "Neither PDF::API2 nor PDF::Builder is installed!\n"; 71} 72# ------------- 73 74our $VERSION = '1.002'; # VERSION 75my $LAST_UPDATE = '1.000'; # manually update whenever code is changed 76 77my $outfile = $0; 78if ($outfile =~ m#[\\/]([^\\/]+)$#) { $outfile = $1; } 79$outfile =~ s/\.pl$/.pdf/; 80 81my $pdftable = PDF::Table->new(); 82# ------------- 83my $pdf; 84if ($rcA) { 85 print STDERR "Using PDF::API2 library\n"; 86 $pdf = PDF::API2->new( -file => $outfile ); 87} else { 88 print STDERR "Using PDF::Builder library\n"; 89 $pdf = PDF::Builder->new( -file => $outfile ); 90} 91# ------------- 92my $page = $pdf->page(); 93$pdf->mediabox('A4'); 94 95# A4 as defined by PDF::API2 is h=842 w=545 for portrait 96 97# some data to layout 98my $some_data = [ 99 [ 'Header', 'Row', 'Test' ], 100 [ '1 Lorem ipsum dolor', 'Donec', 'consequat quis, tincidunt vel, felis.' ], 101 [ '2 Lorem ipsum dolor', 'Donec super long text goes here to provoke a text block', 'consequat quis, tincidunt vel, felis.' ], 102 [ '3 Lorem ipsum dolor', 'Donec', 'consequat quis, tincidunt vel, felis.' ], 103 [ '4 Lorem ipsum dolor', 'Donec super long text goes here to provoke a text block', 'consequat quis, tincidunt vel, felis.' ], 104 [ '5 Lorem ipsum dolor', 'Donec', 'consequat quis, tincidunt vel, felis.' ], 105 [ '6 Lorem ipsum dolor', 'Donec', 'consequat quis, tincidunt vel, felis.' ], 106 [ '7 Lorem ipsum dolor', 'Donec', 'consequat quis, tincidunt vel, felis.' ], 107 [ '8 Lorem ipsum dolor', 'Donec', 'consequat quis, tincidunt vel, felis.' ], 108 [ '9 Lorem ipsum dolor', 'Donec', 'consequat quis, tincidunt vel, felis.' ], 109 110]; 111 112# build the table layout 113my $cell_props = []; 114$cell_props->[2][1] = { 115 background_color => '#000000', # or bg_color 116 font_color => 'blue', # or fg_color 117 justify => 'left' 118}; 119$cell_props->[4][1] = { 120 background_color => '#000000', 121 font_color => 'red', 122 justify => 'center' 123}; 124$cell_props->[6][1] = { 125 background_color => '#000000', 126 font_color => 'yellow', 127 justify => 'right' 128}; 129 130# note that cell properties taken out-of-line 131$pdftable->table( 132 133 # required params 134 $pdf, 135 $page, 136 $some_data, 137 x => 10, 138 w => 350, 139 start_y => 780, # or y 140 next_y => 780, 141 start_h => 210, # or h 142 next_h => 210, 143 144 # some optional params 145 font_size => 10, 146 padding => 10, 147 #padding_right => 10, 148 horizontal_borders => 1, 149 header_props => { 150 bg_color => "silver", 151 font => $pdf->corefont( "Helvetica", -encoding => "utf8" ), 152 font_size => 20, 153 font_color => "#006600", # or fg_color 154 #justify => 'left', 155 repeat => 1, # default 156 }, 157 cell_props => $cell_props 158); 159 160$pdf->save(); 161