in reply to Re^4: Can't use string as an ARRAY ref
in thread Can't use string as an ARRAY ref

Here is a working example for creating tables in PDF using your structures. I was not able to understand what the loop was for. Can you modify it to demonstrate the problem that you have ?.

#!/usr/bin/perl use strict; use warnings; use PDF::API2; use PDF::Table; use Data::Dump 'pp'; my $data = { 1=>{ 'main' => [ [ '12345', 'MONICA', '01/01/1900','0X10' ], [ '000001', 'MARY L', '01/01/2000','0111P' ], [ '8884', 'JOHN M.','01/01/1932','0OK8' ],], 'type' => [ ['Main','1900','Red'], ['APT', '1290','Blue'], ['AVAL','1921','Green'],], 'princ' => [ ['Q3.0', 'OK','1900-01-01','N','O','O','X','Y'], ['12w','PL','2000-01-02','N','P','O','X','A'],], }}; my $pdftable = new PDF::Table; my $pdf = new PDF::API2( -file => "table.pdf" ); my $page = $pdf->page; $pdf->mediabox(842, 595); foreach my $num ( keys %{$data} ) { my $main = $data->{$num}{main}; unshift @$main,["Account", "Name", "Date", "Code #"]; #pp $main; my $type = $data->{$num}{type}; unshift @$type,["HOUSE", "YEAR", "COLOR"]; #pp $type; my $princ = $data->{$num}{princ}; unshift @$princ,["AC #","Name", "DATE", "Ref","Case #1","Case #2", " +Case #3", "Case #4"]; #pp $princ; #for my $i ( 0 .. $#{ $main } ){ # more stuff my $y = 500; (undef,undef,$y) = add_more( data => $main, y => $y ); (undef,undef,$y) = add_more( data => $type, y => $y-10 ); (undef,undef,$y) = add_more( data => $princ, y => $y-10 ); #} } $pdf->save; sub add_more{ my (%args) = @_; my $data = $args{data}; my $y = $args{y}; $pdftable->table( $pdf, $page, $data, -x => 100, -start_y => $y, -next_y => 700, -start_h => 300, -next_h => 500, -w => 570, -padding => 5, -column_props=>[ map{ { justify => 'center' } }1..@{$data->[0]} ], ); }
poj

Replies are listed 'Best First'.
Re^6: Can't use string as an ARRAY ref
by Anonymous Monk on Aug 21, 2015 at 22:26 UTC
    Right now I don't have access to the rest of the code, but the PDF I am making is kind of complex, I will need the code the way I has in my question, unless of course if its not possible to pass those values as references. Can I get back to you on that?
Re^6: Can't use string as an ARRAY ref
by Anonymous Monk on Aug 24, 2015 at 13:07 UTC
    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!
      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, );
      $princ->[$i] is a single row of data not a block of data.
      poj
        I know, and that is the nature of my problem, I just don't don how to get around that.