Here is a more complete code I am using and it shows why I need the "for loop" to make tables for that block of data, I hope you can still read this:
#!/usr/bin/perl
use strict;
use warnings;
use PDF::API2;
use PDF::Table;
use Data::Dumper;
# Landscape
my $width = 785;
my $height = 590;
my $border_left = 50;
my $border_right = 50;
my $border_top = 100;
my $border_bottom = 50;
my $table_spacing = 50;
my $target_page_no;
my $page_no = 0;
my $just_data = collect_data();
processing_data($just_data);
exit;
### Collect data
sub collect_data {
my $multi = get_multi();
my $external = get_external();
my ($princ, $type, $person) = get_person();
my $just_data;
foreach my $multi_row ( @{$multi} ) {
my $member_number = shift @{$multi_row};
push ( @{$just_data->{$member_number}{multi}}, $multi_row);
}
foreach my $excluded_row ( @{$external} ) {
my $member_number = shift @{$excluded_row};
push ( @{$just_data->{$member_number}{excluded}}, $excluded_row);
}
# The sub get_person returns 3 different sets of data
foreach my $princ_row ( @{$princ} ) {
my $member_number = shift @{ $princ_row };
push ( @{ $just_data->{$member_number}{princ} }, $princ_row);
}
foreach my $type_row ( @{$type} ) {
my $member_number = shift @{ $type_row };
push ( @{ $just_data->{$member_number}{type} }, $type_row);
}
foreach my $person_row ( @{$person} ) {
my $member_number = shift @{ $person_row };
push ( @{ $just_data->{$member_number}{person} }, $person_row);
}
return $just_data;
}
sub processing_data {
my $just_data = shift;
foreach my $member_number ( keys %{$just_data} ) {
my $pdf = new PDF::API2(-file => "my_dir/".$member_number.".pdf");
$pdf->mediabox($width, $height);
my $multi = $just_data->{$member_number}{multi};
unshift @$multi,["Header 1a", "Header 1b", "Header 1c", "Header 1d"
+];
### First Table
my ($first_pdf, $first_page, undef, $first_y) = make_table(
pdf => $pdf,
#page => $page,
data => $multi,
title => "Sub Header for 1a",
pol_y => "",
doc_name => $member_number,
);
table_space(
pdf => $first_pdf,
table_spacing => $table_spacing,
page => $first_page,
send_y => $first_y,
);
### End First Table
my $excluded = $just_data->{$member_number}{excluded};
unshift @$excluded,["Header 2a", "Header 2b", "Header 2c", "Header
+2d", "Header 2e", "Header 2f", "Header 2g", "Header 2h", "Header 2i"
+, "Header 2j", "VHeader 2k"];
### Second table
my($sec_pdf, $sec_page, undef, $sec_y) = make_table(
pdf => $first_pdf,
#page => $first_page,
data => $excluded,
title => "Sub Header for Header 2",
pol_y => "",
doc_name => $member_number,
);
table_space(
pdf => $sec_pdf,
table_spacing => $table_spacing,
page => $sec_page,
send_y => $sec_y,
);
### End Second Table
my $princ = $just_data->{$member_number}{princ};
unshift @$princ,["Header 3a", "Header 3b", "Header 3c", "Header 3d"
+];
my $type = $just_data->{$member_number}{type};
unshift @$type,["Header 4a", "Header 4b", "Header 4c",];
my $person = $just_data->{$member_number}{person};
unshift @$person,["Header 5a","Header 5b", "Header 5c", "Header 5d"
+,"Header 5e","Header 5f", "Header 5g", "Header 5h",];
# print 3 tables for each block
for my $i ( 0 .. $#{ $princ } ){
my $x = $border_left;
my $w = 650;
# table
my ($third_pdf, $third_page,undef,$third_y) = make_table(
pdf => $
+sec_pdf,
#page => $page,
data => $princ->[$i],
title => "More Header 5"
+,
pol_y => "",
doc_name
+ => $member_number,
);
table_space(
pdf => $third_pdf,
table_spacing => $table_spacing/2,
page => $third_page,
send_y => $third_y,
);
my $block_page_no = $pdf->pages;
# table
$w = 180;
$target_page_no = $block_page_no;
my ($fourth_pdf, $fourth_page,$fourth_span,$fourth_y) = make_tabl
+e(
+ pdf => $third_pdf,
#page => $page,
data => $type->
+[$i],
title => "More Header 6",
pol_y => "",
doc_name => $me
+mber_number,
);
# table
$x = 260;
$w = 440;
$target_page_no = $block_page_no;
my ($fifth_pdf, $fifth_page, $fifth_span, $fifth_y) = make_table(
+ pdf => $fourth_pdf,
+ #page => $page,
data => $person->
+[$i],
title => "More He
+ader 7",
pol_y => "",
doc_name => $memb
+er_number,
);
# call start of next block
if( $fourth_span > $fifth_span ) {
$third_page = $fourth_page;
$third_y = $fourth_y;
}elsif($fifth_span > $fourth_span) {
$third_page = $fifth_page;
$third_y = $fifth_y;
}else {
$third_page = $fourth_page;
$third_y = ($fourth_y < $fifth_y) ? $fourth_y : $fifth_y;
}
table_space(
pdf => $third_pdf,
table_spacing => $table_spacing,
page => $third_page,
send_y => $third_y,
);
}
$pdf->save;
$pdf->end();
}
} # End of sub
# Make tables
sub make_table{
my (%args) = @_;
my $pdf = $args{pdf} || '';
my $data = $args{data} || '';
my $title = $args{title} || 'title';
my $princ_y = $args{pol_y} || '';
my $doc_name = $args{doc_name} || 'report name';
my $x = $border_left;
my $y = $height-$border_top;
my $w = $width-$border_left-$border_right;
my %font = (
'H' => $pdf->corefont("Helvetica", -encoding => "utf8"),
'HB'=> $pdf->corefont("Helvetica-Bold", -encoding => "utf8"),
);
my $page = new_page(
pdf => $pdf,
# send_y => $y,
# send_font => %font,
);
# title
my $caption = $page->text();
$caption->font($font{'HB'},10);
$caption->translate($x,$y+1);
$caption->text($title);
my $pdftable = new PDF::Table;
my ($next_page, $span, $new_y) = $pdftable->table(
$pdf, $page, $data,
x => $x,
w => $w,
start_y => $y - 5, next_y => $height-$border_top,
start_h => $y - 5, next_h => $height-$border_top,
new_page_func => \&new_page,
padding => 2, padding_right => 10,
border => 0,
background_color_odd => "#FFFFFF",
background_color_even => "#E0E0E0",
header_props => {
font => $font{'HB'},
font_size => 10,
font_color => '#000000',
bg_color => '#FFFFFF',
repeat => 1,
justify => 'center',
},
column_props => [ map{ {
justify => 'center',
font => $font{'H'},
font_size => 10,
} }1..@{$data->[0]}],
);
return ($pdf, $next_page, $span, $new_y);
};
# create new page
sub new_page {
my (%args) = @_;
my $pdf = $args{ pdf } || '';
my %font = (
'H' => $pdf->corefont("Helvetica", -encoding => "utf8"),
'HB'=> $pdf->corefont("Helvetica-Bold", -encoding => "utf8"),
);
++$target_page_no;
if ($target_page_no <= $page_no){
return $pdf->openpage($target_page_no);
}
# new page
my $page = $pdf->page;
++$page_no;
# page logo
my $logo = "images/logo.jpg";
my $image = $pdf->image_jpeg($logo, 122, 35);
my $gfx = $page->gfx;
$gfx->image($image, 5, 538, 230, 57); # logo position and size on pag
+e
# page numbers
my $g = $page->gfx();
$g->textlabel($width - 30,15,$font{'H'},8,
"Page $page_no",
-color => '#808080',
-align => 'right',
);
doc_title( pdf=>$pdf, page=>$page);
month_doc( pdf=>$pdf, page=>$page);
ind_inform( pdf=>$pdf, page=>$page);
# line
$g->linewidth(1);
my $x = $border_left;
my $y = $height - $border_top + 15;
$g->move($x,$y);
$g->line($width - $x,$y);
$g->stroke;
return $page;
}
# create space between tables
sub table_space{
my (%args) = @_;
my $page = $args{ page };
my $pdf = $args{ pdf };
my $got_y = $args{ send_y };
$got_y -= $args{table_spacing};
if ($got_y < $border_bottom){
$got_y = $height-$border_top;
$page = new_page(
pdf => $pdf,
);
}
}
sub doc_title {
my (%args) = @_;
my $pdf = $args{pdf};
my $page = $args{page};
my %font = (
'H' => $pdf->corefont("Helvetica", -encoding => "utf8"),
'HB'=> $pdf->corefont("Helvetica-Bold", -encoding => "utf8"),
);
$page->gfx->textlabel( # PDF::API2 method
416, 566, # x, y
$font{'HB'}, 11, # font, size
"My Documment Name Here", # text
-color => '#000000',
-align => 'center',
);
$page->gfx->textlabel( # PDF::API2 method
416, 553, # x, y
$font{'H'}, 10, # font, size
"More Doc title Here", # text
-color => '#000000',
-align => 'center',
);
$page->gfx->textlabel( # PDF::API2 method
416, 543, # x, y
$font{'H'}, 9, # font, size
"100 Main street", # text
-color => '#000000',
-align => 'center',
);
}
sub month_doc {
my (%args) = @_;
my $pdf = $args{pdf};
my $page = $args{page};
my $date = get_date();
my %font = (
'H' => $pdf->corefont("Helvetica", -encoding => "utf8"),
'HB'=> $pdf->corefont("Helvetica-Bold", -encoding => "utf8"),
);
$page->gfx->textlabel( # PDF::API2 method
740, 565, # x, y
$font{'H'}, 8, # font, size
"For the Month: ", # text
-color => '#000000',
-align => 'right',
);
$page->gfx->textlabel( # PDF::API2 method
777, 565, # x, y
$font{'HB'}, 8, # font, size
"$date", # text
-color => '#000000',
-align => 'right',
);
$page->gfx->textlabel( # PDF::API2 method
740, 555, # x, y
$font{'H'}, 8, # font, size
"Doc Number: ", # text
-color => '#000000',
-align => 'right',
);
$page->gfx->textlabel( # PDF::API2 method
770, 555, # x, y
$font{'HB'}, 8, # font, size
"0000007", # text
-color => '#000000',
-align => 'right',
);
}
sub ind_inform {
my (%args) = @_;
my $pdf = $args{pdf};
my $page = $args{page};
my $date = get_date();
my %font = (
'H' => $pdf->corefont("Helvetica", -encoding => "utf8"),
'HB'=> $pdf->corefont("Helvetica-Bold", -encoding => "utf8"),
);
$page->gfx->textlabel( # PDF::API2 method
416, 520, # first less move to left - second less move d
+own # x, y
$font{'HB'}, 12, # font, size
"More tile infor here", # text
-color => '#000000',
-align => 'center',
);
$page->gfx->textlabel( # PDF::API2 method
116, 520, # first less move to left - second less move d
+own # x, y
$font{'HB'}, 12, # font, size
"Member Number: xx000", # text
-color => '#000000',
-align => 'center',
);
}
sub get_date {
my ($mon, $mday, $year) = (localtime)[4,3,5];
return sprintf '%02d-%02d-%04d', $mon+1, $mday, $year+1900;
}
Thanks for looking! |