如何使用PDF :: Table将CSV数据转换为PDF表格

时间:2017-04-26 18:11:05

标签: perl pdf

我需要使用Perl将CSV数据转换为PDF表格。

我尝试过使用PDF::API2PDF::Table,但无法实现我的目标。

任何人都可以建议我错过了什么,或者是否有更好的模块可供使用?

CSV

enter image description here

预期的PDF输出

enter image description here

实际输出

enter image description here

我的Perl代码

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();

1 个答案:

答案 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;
}
相关问题