in reply to Re^5: Can't use string as an ARRAY ref
in thread Can't use string as an ARRAY ref
#!/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; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^7: Can't use string as an ARRAY ref
by poj (Abbot) on Aug 24, 2015 at 15:05 UTC | |
by Anonymous Monk on Aug 24, 2015 at 15:31 UTC | |
by poj (Abbot) on Aug 24, 2015 at 16:13 UTC | |
by Anonymous Monk on Aug 24, 2015 at 16:36 UTC | |
by poj (Abbot) on Aug 24, 2015 at 17:04 UTC | |
by Anonymous Monk on Aug 24, 2015 at 18:22 UTC | |
by poj (Abbot) on Aug 24, 2015 at 18:46 UTC | |
by Anonymous Monk on Aug 25, 2015 at 12:09 UTC | |
|