2012-11-27 5 views
4

J'ai besoin d'aide pour essayer de faire un colspan sur ce projet de table PDF que j'ai. Ici, sur cet exemple de code, je peux expliquer ce que j'essaie de faire. Je dois faire les lignes avec "Primary Info" et "Secondary Info" pour faire un "colspan". J'essaye également de faire la ligne de totaux pour s'étirer (colspan) au-dessus de la table pour créer une ligne pour diviser les sections sur cette table. Peut-être que je pourrais passer une image pour simuler le colspan, mais je ne peux pas comprendre comment passer le code de l'image à travers la chaîne de données. J'ai regardé partout et je ne trouve pas de solution pour cela, peut-être que quelqu'un ici a déjà fait ça et pourrait me montrer comment je peux le faire. Voici l'exemple de code et merci pour l'aide à l'avance!Colspan en PDF :: Table

#!/usr/bin/perl 

use warnings; 
use strict; 
use PDF::API2; 
use PDF::Table; 
use Data::Dumper; 

my $pdftable = new PDF::Table; 
my $pdf = new PDF::API2(-file => "report.pdf"); 
my $page = $pdf->page(); 
$pdf->mediabox('A4'); 

# some data to layout 
my $some_data =[ 

    ['Name', 'Address', 'Account', 'Amount',], 
    ['','','','',], 
    ['Primary Info','','','',], 
    ['','','','',], 
    ['1 - Charles Dawrwin', '1 - Boston, MA', '1 - 123456789', '150.00'], 
    ['2 - Arnold Shuwerts', '2 - San Rose, CA', '2 - 844756485' , '250.00'], 
    ['3 - Joe Doe',   '3 - Revere, MA', '3 - 000034559', '100.00'], 
    ['4 - Mary Loo',   '4 - New York, NY', '4 - 333449687', '125.00'], 
    ['','','','',], 
    ['','','','___________',], 
    ['','Primary Sub Total','','550.00',], 
    ['','','','',], 
    ['1a - Mary Dawrwin', '1a - Cambrigde, MA', '1a - 123452789', '550.00'], 
    ['2a - Joe Doark',  '2a - Miami, FL',  '2a - 844726485' , '350.00'], 
    ['','','','',], 
    ['Secondary Info','','','',], 
    ['','','','',], 
    ['5 - John Dell',   '5 - Portland, ME', '5 - 111000384', '55.00'], 
    ['6 - Mary Loumain',  '6 - Cambridge, MA','6 - 000034569','1,000.00'], 
    ['7 - Charles Town',  '7 - New Port, NH', '7 - 222299944', '200.00'], 
    ['8 - Jasmin Deen',  '8 - San Jose, CL', '8 - 000000122', '255.00'], 

    ['','','','___________',], 
    ['','','Total:','$3,450.00',], 

]; 

my $cell_props; 

my $j = 0; 
foreach my $row (@{$some_data})  
{ 
my $k = 0; 
foreach my $cell (@{$row}) 
{ 

    if (($cell eq 'Name') || ($cell eq 'Address') || ($cell eq 'Account') || ($cell eq 'Amount')) { 

    $cell_props->[$j]->[$k] ={ 
           background_color => '#808080', # 
           font_color  => '#FF0000', # 
           justify => "center", 
          }; 

    }elsif (($cell eq 'Primary Info') || ($cell eq 'Secondary Info')){ 

     $cell_props->[$j]->[$k] = { 
           font => $pdf->corefont("Helvetica", -encoding => "utf8"), 
           font_size => 15, 
           background_color => '#FFCA00', # 
           font_color  => '#4D4D4D', # 
           justify => "left", 
          }; 
    }elsif (($cell eq 'Total:')){ 

     $cell_props->[$j]->[$k] = { 
           background_color => '#FFCA00', # 
           font_color  => '#4D4D4D', # 
           justify => "center", 
          }; 

    }else { 

    $cell_props->[$j]->[$k] = { 
           font => $pdf->corefont("Helvetica", -encoding => "utf8"), 
           font_size => 8, 
           background_color => '#ffffff', # 
           font_color  => '#000000', # 
           justify => "center", 
          }; 
    } 

$k++; 

} 
$j++; 
} 


# build the table layout 
$pdftable->table(
    # required params 
    $pdf, 
    $page, 
    $some_data, # 2D arrayref of text strings 
    x => 50, #left_edge_of_table, 
    -w => 495, # width of table. technically optional, but almost always a good idea to use 
    start_y => 820, # baseline_of_first_line_on_first_page, 
    next_y => 800, # baseline_of_first_line_on_succeeding_pages, 
    -start_h => 800, # height_on_first_page, 
    next_h => 500, # height_on_succeeding_pages, 

    # some optional params 
    -padding => 3, # cell padding 
    padding_right => 10, #right cell padding, overides -pad 
    border => 0, # border width 0 for no border 
    background_color_odd => '', 
    background_color_even => '', #cell background color for even rows 

    header_props => 
     { 
     min_w => 250, 
     bg_color => "#808080", 
     font => $pdf->corefont("Helvetica", -encoding => "utf8"), 
     font_size => 13, 
     font_color => "#000000", 
     repeat => 1, 
     }, 

    column_props => [ map{{justify => 'center' }}1..4, ], 


    cell_props  => 
     $cell_props, 

); 

$pdf->saveas(); 
+0

http://www.perlmonks.org/?node_id=1005755 – toolic

Répondre

0

Jusqu'à ce que vous trouviez une solution appropriée, peut-être un hack brut fera l'affaire.

changement

['Primary Info','','','',],

à

['Primary Info','col$span','col$span','col$span',],

et de même pour les autres lignes que vous souhaitez "fixer". [De toute évidence, vous pouvez utiliser n'importe quelle autre chaîne à la place de 'col $ span', tant qu'elle n'apparaîtra pas naturellement.]

Ensuite, créez une nouvelle règle pour 'col $ span' même couleur que l'arrière-plan:

} elsif ($cell eq 'col$span') { 
    $cell_props->[$j]->[$k] = { 
    font => $pdf->corefont("Helvetica", -encoding => "utf8"), 
    font_size => 1, 
    background_color => '#FFCA00', # 
    font_color  => '#FFCA00', # 
}; 

Pas sûr que le total est exactement ce que vous voulez, mais les autres semblent comme ce que vous voulez, même si elle triche un peu.