我需要使用Perl将CSV数据转换为PDF表格。
我尝试过使用PDF::API2
和PDF::Table
,但无法实现我的目标。
任何人都可以建议我错过了什么,或者是否有更好的模块可供使用?
use strict;
use lib '/data/fdr/scripts/irp/PDF-API2-2.031/lib';
use lib '/data/fdr/scripts/irp/PDF-Table-0.9.12/lib';
use PDF::API2;
use PDF::Table;
my %env_cfg;
my @inp_arg = @ARGV;
my ($ldlm, $bid, $lf, $xf, $hdrcnt, $klm, $sts,
$iR, $iC, $od, $lst, $csv, $cell, $hdr_seq,
$key_cnt, $dat_rec, $dat_off, $dat_lmt, $len_cnt, $len_cnt1
) = ( '', '', '', '', '', '', '', 0, 0, '', '', '', '', 0, 0, '', 0, 0, 0, 0 );
my ( $worksheet, $workbook, $fxls, $keyhdr, $dathdr, $dat_cnt, $csvcol )
= ( '', '', '', '', '', 0, 0 );
my @csv_rcd = ( '' );
my $header = '';
my $data = '';
my $somedata = [];
my $cellval = '';
my $testfile = "/data/fdr/scripts/config_file/test.txt";
$sts = open( CSV, "< /data/fdr/output/IRP/FILING/1/Misc_Symbols.csv" );
if ( $sts == 0 ) {
print LOG tmstmp() . ": Error opening CSV file Misc_Symbols.csv\n";
print LOG "$ldlm\n";
next;
}
my $pdftable = new PDF::Table;
my $pdf = PDF::API2->new();
my $page = $pdf->page();
$page->mediabox( 'A4' );
my $font = $pdf->corefont( 'Helvetica-Bold' );
my $text = $page->text();
$text->textstart;
$text->font( $font, 12 );
$text->translate( 200, 700 );
$iR = -1;
$iC = 0;
while ( <CSV> ) {
$iR++;
$iC = 0; # This is the column co-ordinate for the excel file
$csvcol = -1; # This is the column co-ordinate for the csv file
$csv = $_;
chomp( $csv );
$cellval = '';
@csv_rcd = split( ',', $csv );
foreach $cell ( @csv_rcd ) {
$csvcol++;
if ( ( ${cell} ne '*' ) ) {
if ( $iR <= 5 ) {
$text->lead( 10 );
$text->section( "${cell}", 500, 800 );
}
else {
$cellval = $cellval . $cell;
push( @$somedata, [ $cellval . ',' ] );
}
}
$iC++;
}
}
close CSV;
$pdftable->table(
# required params
$pdf,
$page,
$somedata,
x => 50,
w => 495,
start_y => 792,
next_y => 700,
start_h => 400,
next_h => 500,
# some optional params
border => 1,
font_size => 20,
max_word_length => 20,
padding => 5,
row_height => 30,
column_props => [
{}, # no properties for the first column
{ min_w => 250,
justify => "right",
font => $pdf->corefont( "Times", -encoding => "latin1" ),
font_size => 14,
font_color => 'white',
background_color => '#8CA6C5',
},
],
);
$text->textend;
$pdf->saveas( "Sample3.pdf" );
$pdf->end();
答案 0 :(得分:2)
似乎问题就在这一行:
push( @$somedata, [ $cellval .',' ] );
生成N x 1
矩阵$somedata
。您需要N x M
矩阵$somedata
。所以你应该在内部@rowdata
循环中创建一个行数组foreach
:
push @rowdata, $cellval;
并且,在外部while
循环的底部,您可以执行
push @$somedata, \@rowdata;
这给出了以下循环:
while ( my $csv = <$CSV> ) {
chomp $csv;
++$iR;
$iC = 0; # This is the column co-ordinate for the Excel file
my $csvcol = -1; # This is the column co-ordinate for the CSV file
my $cellval = '';
@csv_rcd = split /,/, $csv;
my @rowdata;
foreach my $cell ( @csv_rcd ) {
++$csvcol;
if ( $cell ne '*' ) {
if ( $iR <= 5 ) {
$text->lead( 10 );
$text->section( $cell, 500, 800 );
}
else {
push @rowdata, $cell;
}
}
$iC++;
}
push @$somedata, \@rowdata;
}