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

查看:49
本文介绍了使用php中的fpdf在pdf中创建带有包装数据的表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用fpdf库在pdf中创建表结构时遇到问题.当任何一个垂直细胞的数据具有长字符串时,该细胞数据将与其他细胞数据重叠. 因此整个表的数据已经混乱了.则pdf中的数据看起来将不正确.

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.

任何人都可以帮助我在pdf中创建表格,并根据单元格中的数据自动调整所有单元格.

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');
}
}   
?>

推荐答案

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

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

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

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.

这里是nbLines(在此处找到:

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;
}

这篇关于使用php中的fpdf在pdf中创建带有包装数据的表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆