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