Hi there if you are still around.
I used your example here to build what I have, it has been a great help. I am having an issue where I need to have two tables side by side and I can not figured it out how to align them, seeing that all the data on this PDF page is dynamic, it can be a few rows of data or it can be several rows o data.
If you run this code I am posting, you can see where the issue is on the tables labeled "TABLE A" and "TABLE B". Everything else works how it should work for me, unless there are better ways to doing what I am trying to do.
It would be relay appreciated if you could look at this code and tell me how I could align tables side by side and dynamic have them still aligned if the data grows or shrink.
Here is the code:

#!/usr/bin/perl use strict; use warnings; use PDF::API2; use PDF::Table; use Data::Dumper; # #A4 Landscape my $width = 842; my $height = 595; my $pdftable = new PDF::Table; my $pdf = new PDF::API2(-file => "tables_side_by_side_test.pdf"); $pdf->mediabox($width, $height); my $font_HB = $pdf->corefont('Helvetica-Bold'); my $font_H = $pdf->corefont("Helvetica"); my $page_num; # Font settings my %font = ( Helvetica => { Bold => $pdf->corefont( 'Helvetica-Bold' +, -encoding => 'utf8' ), Roman => $pdf->corefont( 'Helvetica', + -encoding => 'utf8' ), Italic => $pdf->corefont( 'Helvetica-Obliq +ue', -encoding => 'utf8' ), }, ); my ($principal, $principal_a ,$principal_b) = _get_data(); main_table( $pdf ); $pdf->saveas(); sub main_table { my $got_pdf = shift; my $left_edge_of_table = 50; # 50 my $page = _page(); my ($x,$y) = ($left_edge_of_table,490); my $page_height = 500; # create new page if caption too low if ($y < 100){ $page = _page(); $y = 500; } # add caption for table 1 my $caption = $page->text(); $caption->font($font_HB, 10); $caption->translate($x,$y); #$caption->text("Caption for table 1 \$t"); $caption->text("The First Table"); # create table my $col_numbers_tb1 = 4; my ($nextpage,$new_y) = _table( $pdf, $page, $y, _ob_disc(), $left_ed +ge_of_table, $col_numbers_tb1 ); $page = $nextpage; # gap to next table $y = $new_y - 20; # add caption for table 2 $caption = $page->text(); $caption->font($font_HB, 10); $caption->translate($x,$y); $caption->text("The Second Table"); my $col_numbers_tb2 = 11; my ($nextpage2,$new_y2) = _table( $pdf, $page, $y, _excluded(), $left +_edge_of_table, $col_numbers_tb2 ); $page = $nextpage2; # gap to next table $y = $new_y2 - 20; # add caption for table 3 $caption = $page->text(); $caption->font($font_HB, 10); $caption->translate($x,$y); $caption->text("Block Tables Start"); while (@$principal) { my ($data_princ_acc, $data_princ_a, $data_princ_b) = _send_data_to_p +df(); my $col_numbers_tb3 = 4; my ($nextpage3,$new_y3) = _table( $pdf, $page, $y, $data_princ_acc, +$left_edge_of_table, $col_numbers_tb3 ); $page = $nextpage3; # gap to next table $y = $new_y3 - 20; # I tried setting up here a new value here for this table #my $xy = $y - 19; # add caption for table 4 $caption = $page->text(); $caption->font($font_HB, 10); $caption->translate($x,$y); $caption->text("Table A: + Table B:"); my $col_numbers_tb4 = 3; my ($nextpage4,$new_y4) = _table_a( $pdf, $page, $y, $data_princ_a, +$left_edge_of_table, $col_numbers_tb4 ); $page = $nextpage4; # gap to next table $y = $new_y4 - 20; my $col_numbers_tb5 = 8; my ($nextpage5,$new_y5) = _table_b( $pdf, $page, $y, $data_princ_b, +$left_edge_of_table, $col_numbers_tb5 ); $page = $nextpage5; # gap to next table $y = $new_y5 - 20; } } # create table main sub _table { my ($pdf,$page,$boty,$data,$left_edge,$col_numbers_tb) = @_; my $pdftable = new PDF::Table; my ($next_page, undef, $new_y) = $pdftable->table( $pdf, $page, $data, x => $left_edge, # center main table on the page w => 650, # 495 width of main table on the page start_y => $boty-10, next_y => 500, start_h => $boty-10, next_h => 500, new_page_func => \&_page, # it brings header to other pages padding => 2, padding_right => 10, border => 0, background_color_odd => "#E0E0E0", background_color_even => "#FFFFFF", header_props => { # This param could be a pdf core font or user specified TTF. # See PDF::API2 FONT METHODS for more information font => $pdf->corefont("Helvetica-Bold", -encoding => "utf8" +), font_size => 10, font_color => '#000000', bg_color => '#FFFFFF', repeat => 1, # 1/0 eq On/Off if the header row should be r +epeated to every new page justify => 'center', }, column_props => [ map{ { justify => 'center', font => $font{'Helvetica'}{'Roman'}, font_size => 9, } }1..$col_numbers_tb, ], ); return ($next_page,$new_y); }; sub _table_a { my ($pdf,$page,$boty,$data,$left_edge,$col_numbers_tb) = @_; my $pdftable = new PDF::Table; my ($next_page, undef, $new_y) = $pdftable->table( $pdf, $page, $data, x => $left_edge, # center main table on the page w => 180, # 495 width of main table on the page start_y => $boty-10, next_y => 500, start_h => $boty-10, next_h => 500, new_page_func => \&_page, # it brings header to other pages padding => 2, padding_right => 10, border => 0, background_color_odd => "#E0E0E0", background_color_even => "#FFFFFF", header_props => { # This param could be a pdf core font or user specified TTF. # See PDF::API2 FONT METHODS for more information font => $pdf->corefont("Helvetica-Bold", -encoding => "utf8" +), font_size => 10, font_color => '#000000', bg_color => '#FFFFFF', repeat => 1, # 1/0 eq On/Off if the header row should be r +epeated to every new page justify => 'center', }, column_props => [ map{ { justify => 'center', font => $font{'Helvetica'}{'Roman'}, font_size => 9, } }1..$col_numbers_tb, ], ); return ($next_page,$new_y); }; sub _table_b { my ($pdf,$page,$boty,$data,$left_edge,$col_numbers_tb) = @_; my $pdftable = new PDF::Table; my ($next_page, undef, $new_y) = $pdftable->table( $pdf, $page, $data, x => 260, # center main table on the page w => 440, # 495 width of main table on the page start_y => $boty+10, next_y => 500, start_h => $boty+10, next_h => 500, new_page_func => \&_page, # it brings header to other pages padding => 2, padding_right => 10, border => 0, background_color_odd => "#E0E0E0", background_color_even => "#FFFFFF", header_props => { # This param could be a pdf core font or user specified TTF. # See PDF::API2 FONT METHODS for more information font => $pdf->corefont("Helvetica-Bold", -encoding => "utf8" +), font_size => 10, font_color => '#000000', bg_color => '#FFFFFF', repeat => 1, # 1/0 eq On/Off if the header row should be r +epeated to every new page justify => 'center', }, column_props => [ map{ { justify => 'center', font => $font{'Helvetica'}{'Roman'}, font_size => 9, } }1..$col_numbers_tb, ], ); return ($next_page,$new_y); }; # create new page sub _page { ++$page_num; my $page = $pdf->page; ##add stuff add_title($page); # horiz line my $g = $page->gfx(); $g->linewidth(1); $g->move(20,510); $g->line($width-20,510); $g->stroke; # page num $g->textlabel(760,15,$font_H,8,"Page $page_num", -color => '#808080', -align => 'right', ); return $page; }; sub _ob_disc { my $disc; # This is simulating random rows of data coming from the database $disc = [ ["A Number", "Name", "Date", "Reference"], ["23456", "Aname Another", "01/11/2014", "00007"], ["23456", "jhjhj ssaaa", "01/11/2014", "00007"], ["23456", "Loren asddf", "01/11/2014", "00007"], ["23456", "Serrt jahft", "01/11/2014", "00007"], ["23456", "Ojshfg treiu", "01/11/2014", "00007"], ["23456", "Rssskjj tehrrr", "01/11/2014", "00007"], ["23456", "Maru Smith", "01/11/2014", "00007"], ["23456", "Joe A Smith", "01/11/2014", "00007"], ["23456", "Marck Del", "01/11/2014", "00007"], ["23456", "Gujjnn Theeee", "01/11/2014", "00007"], ["23456", "Mary Lou", "01/11/2014", "00007"], ["23456", "Jackob Joen", "01/11/2014", "00007"], ["23456", "Marcouys De Larent", "01/11/2014", "00007"], ["23456", "Once Uon Time", "01/11/2014", "00007"], ["23456", "Nelson Mkkjhtt", "01/11/2014", "00007"], ]; return $disc }; sub _excluded { my $exc; # This is simulating random rows of data coming from the database push @$exc, ["Acc #", "Date", "Name", "Name #", "Others", "SSW", +"XXXS", "#1", "#2" , "#3","#4",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07 +/2014", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ["12345", "11/01/2014", "consequat quis", "3", "Joe Doe", "03/07/20 +14", "0", "O", "E" , "P","",], ; return $exc; }; sub _send_data_to_pdf { return shift @$principal, shift @$principal_a , shift @$principal_b; }; sub _get_data{ my ($q_principal, $q_principal_b ,$q_principal_c); my $h_principal = ["Acc #", "Name", "OB Date", "Number",],; # This is simulating random rows of data coming from the database $q_principal = [ [ ["12345", "Carl Sea", "03/13/2014", "4",], ], [ ["764539", "Deon gomes", "11/07/2013", "2",], ] ] ; unshift @{$_},$h_principal foreach @{$q_principal}; my $h_principal_v = ["Tie #", "Year", "MOdel",], # This is simulating random rows of data coming from the database $q_principal_b = [ [ ["1", "2000", "OLD",], ["2", "2001", "OLD",], ["3", "2002", "OLD",], ["4", "2003", "OLD",], ["5", "2004", "OLD",], ["6", "2005", "OLD",], ["6", "2011", "NEW",], ], [ ["A", "2000", "OLD",], ["B", "2001", "OLD",], ["C", "2002", "OLD",], ["D", "2003", "OLD",], ["E", "2004", "OLD",], ["F", "2005", "OLD",], ["G", "2011", "NEW",], ], ] ; unshift @{$_},$h_principal_v foreach @{$q_principal_b}; my $header_principal_o = ["NAme #","All", "DXS", "Delst","A #1","B #2" +, "C #3", "D #4",],; # This is simulating random rows of data coming from the database $q_principal_c = [ [ ["1","Stephen King", "5/5/1930", "N","O","P", "-", "-",], ["2","Charles Xing", "6/28/1550", "N","P","O", "-", "-",], ["3","Dnieal Cruz", "07/25/1988", "N","O","E", "-", "-",], ["4","Dnieal Cruz", "07/25/1988", "N","O","E", "-", "-",], ["5","Dnieal Cruz", "07/25/1988", "N","O","E", "-", "-",], ["6","Dnieal Cruz", "07/25/1988", "N","O","E", "-", "-",], ["7","Dnieal Cruz", "07/25/1988", "N","O","E", "-", "-",], ["8","Dnieal Cruz", "07/25/1988", "N","O","E", "-", "-",], ], [ ["A","Maru Louey", "5/5/1950", "N","O","P", "-", "-",], ["B","Gome Thing", "6/28/1950", "N","P","O", "-", "-",], ["C","Dnieal Cruz", "07/25/1988", "N","O","E", "-", "-",], ["D","Dnieal Cruz", "07/25/1988", "N","O","E", "-", "-",], ["E","Dnieal Cruz", "07/25/1988", "N","O","E", "-", "-",], ["F","Dnieal Cruz", "07/25/1988", "N","O","E", "-", "-",], ["G","Dnieal Cruz", "07/25/1988", "N","O","E", "-", "-",], ["H","Dnieal Cruz", "07/25/1988", "N","O","E", "-", "-",], ], ]; unshift @{$_},$header_principal_o foreach @{$q_principal_c}; return $q_principal, $q_principal_b ,$q_principal_c; } sub add_title { my $page = shift; $page->gfx->textlabel( # PDF::API2 method 416, 566, # x, y $pdf->corefont("Helvetica-Bold"), 11, # font, size "Test Tables PDF", # text -color => '#000000', -align => 'center', ); }

Thanks for the help and looking!

In reply to Re^8: Making PDF Tables by Anonymous Monk
in thread Making PDF Tables by Anonymous Monk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.