在php中使用fpdf创建带有包裹数据的pdf表格[英] create table in pdf with wrap data using fpdf in php

本文是小编为大家收集整理的关于在php中使用fpdf创建带有包裹数据的pdf表格的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

我使用FPDF库在PDF中创建表结构时有问题.当任何细胞的任何数据具有较长的字符串,则单元数据将与其他单元格数据重叠. 因此全表数据已经无序.然后,PDF中的数据似乎无法正确.

任何一个人,请帮助我根据单元格中的数据创建PDF自动调整所有单元格.

    <?php
if($_POST['cmbReportType'] == '1')
{
$fromdate = date_format(date_create($_POST['txtFromDate']), 'd-M-y');
$import = ociparse($c, "SELECT 
                            t2.membercardno, (t1.firstname||' '||t1.middlename||' '||t1.lastname) as fullname,
                            t3.description,
                            to_char(t2.startdate,'DD-MON-YY') startdate,
                            to_char(t2.expirydate,'DD-MON-YY') expirydate,
                            t2.ramount,
                            t1.address1,
                            t1.address2
                        FROM 
                            useradmin t1, 
                            userplan t2, 
                            plan t3
                        WHERE 
                            t1.memberid = t2.memberid
                        AND 
                            t2.planid = t3.planid
                        AND 
                            t1.branchid = 3
                        AND 
                            t2.startdate >= '$fromdate'
                        ORDER BY t2.membercardno");


OCIExecute($import);
$k=0;
while(OCIFetch($import))
{
    $a[$k]['membercardno'] = ociresult($import,"MEMBERCARDNO");
    $a[$k]['fullname']   = ociresult($import,"FULLNAME");
    $a[$k]['description'] = ociresult($import,"DESCRIPTION");
    $a[$k]['startdate']  = ociresult($import, "STARTDATE");
    $a[$k]['expirydate'] = ociresult($import, "EXPIRYDATE");
    $a[$k]['ramount']  =  ociresult($import, "RAMOUNT");
    $a[$k]['address1'] = ociresult($import, "ADDRESS1");
    $a[$k]['address2'] = ociresult($import, "ADDRESS2");    
    $k++;
}
$resultcount = count($a);

elseif($_POST['rdbReportFormat'] == 'pdf')
{
/***This report view in tabular format.****/
    $pdf=new FPDF();

$pdf->AddPage();
$reportdate = date('d-m-Y');
$filename = $reportdate.'_report.pdf';
$pdf->SetFillColor(255,0,0);
$pdf->SetTextColor(255);
$pdf->SetDrawColor(128,0,0);
$pdf->SetLineWidth(.3);
$pdf->SetFont('Arial', 'B', 6);
// Header
$header=array('Member Card No','Full Name','Description', 'Start Date', 'Expiry Date', 'ramount', 'Address1', 'Address2');
$w = array(25, 35, 35, 15, 18, 15, 30, 30);
for($i=0;$i<count($header); $i++)
    $pdf->Cell($w[$i],7, $header[$i], 1, 0, 'L', true);

$pdf->Ln();

// Reset colour set for data 
$pdf->SetFillColor(224,235,255);
$pdf->SetTextColor(0);
$pdf->SetFont('courier','',7);
$fill=false;
for($i=0;$i<$resultcount;$i++)
{
    $height =6;
    $pdf->Cell($w[0], '$height', $a[$i]['membercardno'], '1', '0', 'L', $fill);
    $pdf->Cell($w[1], '$height', $a[$i]['fullname'], '1', '0', 'L', $fill);
    $pdf->Cell($w[2], '$height', $a[$i]['description'], '1', '0', 'L', $fill);
    $pdf->Cell($w[3], '$height', $a[$i]['startdate'], '1', '0', 'L', $fill);
    $pdf->Cell($w[4], '$height', $a[$i]['expirydate'], '1', '0', 'L', $fill);
    $pdf->Cell($w[5], '$height', $a[$i]['ramount'], '1', '0', 'L', $fill);
    $pdf->Cell($w[5], '$height', $a[$i]['address1'], '1', '0', 'L', $fill);
    $pdf->Cell($w[5], '$height', $a[$i]['address2'], '1', '0', 'L', $fill);
    $pdf->Ln();
    $fill = !$fill;

}   
$pdf->Cell(array_sum($w),0,'','T');
$pdf->Output($filename, 'I');
}
}   
?>

推荐答案

尝试使用Multicell()()编写问题字段(即描述 - 无法预测最大长度).这会将它们包裹在多行上.

对于每个多中心字段,您将需要使用NBline来查看它是否要包装并计算下一行位置.您还需要执行一个setxy()来设置下一个单元格的开始.

这是nblines(在此处找到: http://www.svn.churchtool.org/viewvc/trunk/fpdf/mc_table.php?revision=1&view=markup ):

function NbLines($w,$txt) {
//Computes the number of lines a MultiCell of width w will take
$cw=&$this->CurrentFont['cw'];
if($w==0)
    $w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
$s=str_replace("\r",'',$txt);
$nb=strlen($s);
if($nb>0 and $s[$nb-1]=="\n")
    $nb--;
$sep=-1;
$i=0;
$j=0;
$l=0;
$nl=1;
while($i<$nb)
{
    $c=$s[$i];
    if($c=="\n")
    {
        $i++;
        $sep=-1;
        $j=$i;
        $l=0;
        $nl++;
        continue;
    }
    if($c==' ')
        $sep=$i;
    $l+=$cw[$c];
    if($l>$wmax)
    {
        if($sep==-1)
        {
            if($i==$j)
                $i++;
        }
        else
            $i=$sep+1;
        $sep=-1;
        $j=$i;
        $l=0;
        $nl++;
    }
    else
        $i++;
}
return $nl;
}

本文地址:https://www.itbaoku.cn/post/2090919.html

问题描述

I have a problem in creating table structure in pdf using fpdf library. when any data of perticular cell have a long string then the cell data will overlap with other cell data. So whole table data has been disordered. then data in pdf will not seem correctly.

any one please help me to create table in pdf auto adjust all cells according to data in cell.

    <?php
if($_POST['cmbReportType'] == '1')
{
$fromdate = date_format(date_create($_POST['txtFromDate']), 'd-M-y');
$import = ociparse($c, "SELECT 
                            t2.membercardno, (t1.firstname||' '||t1.middlename||' '||t1.lastname) as fullname,
                            t3.description,
                            to_char(t2.startdate,'DD-MON-YY') startdate,
                            to_char(t2.expirydate,'DD-MON-YY') expirydate,
                            t2.ramount,
                            t1.address1,
                            t1.address2
                        FROM 
                            useradmin t1, 
                            userplan t2, 
                            plan t3
                        WHERE 
                            t1.memberid = t2.memberid
                        AND 
                            t2.planid = t3.planid
                        AND 
                            t1.branchid = 3
                        AND 
                            t2.startdate >= '$fromdate'
                        ORDER BY t2.membercardno");


OCIExecute($import);
$k=0;
while(OCIFetch($import))
{
    $a[$k]['membercardno'] = ociresult($import,"MEMBERCARDNO");
    $a[$k]['fullname']   = ociresult($import,"FULLNAME");
    $a[$k]['description'] = ociresult($import,"DESCRIPTION");
    $a[$k]['startdate']  = ociresult($import, "STARTDATE");
    $a[$k]['expirydate'] = ociresult($import, "EXPIRYDATE");
    $a[$k]['ramount']  =  ociresult($import, "RAMOUNT");
    $a[$k]['address1'] = ociresult($import, "ADDRESS1");
    $a[$k]['address2'] = ociresult($import, "ADDRESS2");    
    $k++;
}
$resultcount = count($a);

elseif($_POST['rdbReportFormat'] == 'pdf')
{
/***This report view in tabular format.****/
    $pdf=new FPDF();

$pdf->AddPage();
$reportdate = date('d-m-Y');
$filename = $reportdate.'_report.pdf';
$pdf->SetFillColor(255,0,0);
$pdf->SetTextColor(255);
$pdf->SetDrawColor(128,0,0);
$pdf->SetLineWidth(.3);
$pdf->SetFont('Arial', 'B', 6);
// Header
$header=array('Member Card No','Full Name','Description', 'Start Date', 'Expiry Date', 'ramount', 'Address1', 'Address2');
$w = array(25, 35, 35, 15, 18, 15, 30, 30);
for($i=0;$i<count($header); $i++)
    $pdf->Cell($w[$i],7, $header[$i], 1, 0, 'L', true);

$pdf->Ln();

// Reset colour set for data 
$pdf->SetFillColor(224,235,255);
$pdf->SetTextColor(0);
$pdf->SetFont('courier','',7);
$fill=false;
for($i=0;$i<$resultcount;$i++)
{
    $height =6;
    $pdf->Cell($w[0], '$height', $a[$i]['membercardno'], '1', '0', 'L', $fill);
    $pdf->Cell($w[1], '$height', $a[$i]['fullname'], '1', '0', 'L', $fill);
    $pdf->Cell($w[2], '$height', $a[$i]['description'], '1', '0', 'L', $fill);
    $pdf->Cell($w[3], '$height', $a[$i]['startdate'], '1', '0', 'L', $fill);
    $pdf->Cell($w[4], '$height', $a[$i]['expirydate'], '1', '0', 'L', $fill);
    $pdf->Cell($w[5], '$height', $a[$i]['ramount'], '1', '0', 'L', $fill);
    $pdf->Cell($w[5], '$height', $a[$i]['address1'], '1', '0', 'L', $fill);
    $pdf->Cell($w[5], '$height', $a[$i]['address2'], '1', '0', 'L', $fill);
    $pdf->Ln();
    $fill = !$fill;

}   
$pdf->Cell(array_sum($w),0,'','T');
$pdf->Output($filename, 'I');
}
}   
?>

推荐答案

Try writing problem fields (i.e. description - ones you cannot predict a max length for) using multicell(). This will wrap them on multiple lines.

For each multicell field you will need to use nbLines to see if it is going to wrap and calculate the next line position. you will also need to do a setXY() to set the start of the next cell.

Here is nbLines (found here: http://www.svn.churchtool.org/viewvc/trunk/fpdf/mc_table.php?revision=1&view=markup):

function NbLines($w,$txt) {
//Computes the number of lines a MultiCell of width w will take
$cw=&$this->CurrentFont['cw'];
if($w==0)
    $w=$this->w-$this->rMargin-$this->x;
$wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
$s=str_replace("\r",'',$txt);
$nb=strlen($s);
if($nb>0 and $s[$nb-1]=="\n")
    $nb--;
$sep=-1;
$i=0;
$j=0;
$l=0;
$nl=1;
while($i<$nb)
{
    $c=$s[$i];
    if($c=="\n")
    {
        $i++;
        $sep=-1;
        $j=$i;
        $l=0;
        $nl++;
        continue;
    }
    if($c==' ')
        $sep=$i;
    $l+=$cw[$c];
    if($l>$wmax)
    {
        if($sep==-1)
        {
            if($i==$j)
                $i++;
        }
        else
            $i=$sep+1;
        $sep=-1;
        $j=$i;
        $l=0;
        $nl++;
    }
    else
        $i++;
}
return $nl;
}