在超出页面大小的行中显示大字符串(FPDF)

时间:2011-07-04 05:28:23

标签: php fpdf

我想在不中断的行中显示以下数组。

$header = array('Sl.', 'Session.', 'Time','Filename','Operator Name','Mobile No.','Amount','SSL Status','SSL Time','Operator Status','Op.Time','Reversal Reqd.?');

但它超出了页面大小。

请帮帮我。

1 个答案:

答案 0 :(得分:0)

我已将此扩展用于FPDF类。它介绍了MultiCell方法(为了方便起见,包含在OutputLines方法中)。在此方法中,您可以指定最大行数。将从函数返回不适合的字符串的任何部分。在这种情况下,您可以创建一个新函数并再次调用MultiCell,直到它返回''

<?

require 'fpdf.php';
// Class voor implementate van handige aanvullende features.
class EPDF extends FPDF {

    function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false, $maxline=0)
    {
        //Output text with automatic or explicit line breaks, at most $maxline lines
        $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 && $s[$nb-1]=="\n")
            $nb--;
        $b=0;
        if($border)
        {
            if($border==1)
            {
                $border='LTRB';
                $b='LRT';
                $b2='LR';
            }
            else
            {
                $b2='';
                if(is_int(strpos($border,'L')))
                    $b2.='L';
                if(is_int(strpos($border,'R')))
                    $b2.='R';
                $b=is_int(strpos($border,'T')) ? $b2.'T' : $b2;
            }
        }
        $sep=-1;
        $shy=-1;
        $shy1=-1;
        $brk=-1;
        $lshy=0;
          $cx = '';
        $i=0;
        $j=0;
        $l=0;
        $ns=0;
        $nl=1;
        while($i<$nb)
        {
            //Get next character
            $c=$s[$i];
            if($c=="\n")
            {
                //Explicit line break
                if($this->ws>0)
                {
                    $this->ws=0;
                    $this->_out('0 Tw');
                }
                $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
                $i++;
                $sep=-1;
                $shy=-1;
                $shy1=-1;
                $brk=-1;
                $cx='';
                $j=$i;
                $l=0;
                $ns=0;
                $nl++;
                if($border && $nl==2)
                    $b=$b2;
                if($maxline && $nl>$maxline)
                    return substr($s,$i);
                continue;
            }
            if($c==' ')
            {
                $sep=$i;
                $ls=$l;
                $ns++;
            }
            // Soft break (&shy;)
            if ($c==$GLOBALS["hyphen"])
            {
                // Afbreektekentje. Onthouden van laatste en voorlaatste positie.
                $shy1=$shy;
                $shy=$i;
                $lshy1=$lshy;
                $lshy = $l;

                $l-=$cw[$c];
            }
            if ($c=='-')
            {
                $brk=$i;
                $ls = $l + $cw[$c];
                $ns++;
                $cy = '-';
            }
            $l+=$cw[$c];
            if($l>$wmax)
            {
                // Woord past niet meer. Kijken of het af te breken is op een hard afbreekstreepje
                if ($brk>$shy)
                {
                    if ($brk>$sep)
                    {
                        $sep=$brk;
                        $cx='-';
                    }
                }
                elseif ($shy > $sep) // Of op een soft afbreekstreepje
                {
                    if ($lshy + $cw['-'] > $wmax)
                    {
                        if ($shy1 > $sep)
                        {
                            $sep = $shy1;
                            $ls = $lshy1;
                            $cx = '-';
                        }
                    }
                    else
                    {
                        $sep = $shy;
                        $ls = $lshy;
                        $cx = '-';
                    }
                }

                //Automatic line break
                if($sep==-1)
                {
                    if($i==$j)
                        $i++;
                    if($this->ws>0)
                    {
                        $this->ws=0;
                        $this->_out('0 Tw');
                    }
                    $this->Cell($w,$h,substr($s,$j,$i-$j).$cx,$b,2,$align,$fill);
                }
                else
                {
                    if($align=='J')
                    {
                        $this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0;
                        $this->_out(sprintf('%.3F Tw',$this->ws*$this->k));
                    }
                    $this->Cell($w,$h,substr($s,$j,$sep-$j).$cx,$b,2,$align,$fill);
                    $i=$sep+1;
                }
                $sep=-1;
                $shy=-1;
                $shy1=-1;
                    $cx = '';
                $j=$i;
                $l=0;
                $ns=0;
                $nl++;
                if($border && $nl==2)
                    $b=$b2;
                if($maxline && $nl>$maxline)
                {
                    if($this->ws>0)
                    {
                        $this->ws=0;
                        $this->_out('0 Tw');
                    }
                    return substr($s,$i);
                }
            }
            else
                $i++;
        }
        //Last chunk
        if($this->ws>0)
        {
            $this->ws=0;
            $this->_out('0 Tw');
        }
        if($border && is_int(strpos($border,'B')))
            $b.='B';
        $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
        $this->x=$this->lMargin;
        return '';
    }

    function OutputLines($w, $h, $text, $maxline = 0)
    {
        return $this->MultiCell($w, $h, $text, 0, 'L', false, $maxline);
    }

}