Add-On TextBox
Informations
Author:Darren Gates & Adrian TufaLicense: FPDF
Description
The drawTextBox() function draws a string within a rectangle defined by the function parameters. Any text that does not fit within the rectangle's boundaries is truncated. One may specify vertical and horizontal alignment for the text within the box, and whether or not to surround the box with a border.drawTextBox(string strText, float w, float h [, string align [, string valign [, boolean border]]])
strText
: the string to printw
: width of the boxh
: height of the boxalign
: horizontal alignment (L
,C
,R
orJ
). Default value:L
valign
: vertical alignment (T
,M
orB
). Default value:T
border
: whether to draw the border of the box. Default value:true
Source
<?php
require('fpdf.php');
class PDF_TextBox extends FPDF
{
/**
* Draws text within a box defined by width = w, height = h, and aligns
* the text vertically within the box ($valign = M/B/T for middle, bottom, or top)
* Also, aligns the text horizontally ($align = L/C/R/J for left, centered, right or justified)
* drawTextBox uses drawRows
*
* This function is provided by TUFaT.com
*/
function drawTextBox($strText, $w, $h, $align='L', $valign='T', $border=true)
{
$xi=$this->GetX();
$yi=$this->GetY();
$hrow=$this->FontSize;
$textrows=$this->drawRows($w, $hrow, $strText, 0, $align, 0, 0, 0);
$maxrows=floor($h/$this->FontSize);
$rows=min($textrows, $maxrows);
$dy=0;
if (strtoupper($valign)=='M')
$dy=($h-$rows*$this->FontSize)/2;
if (strtoupper($valign)=='B')
$dy=$h-$rows*$this->FontSize;
$this->SetY($yi+$dy);
$this->SetX($xi);
$this->drawRows($w, $hrow, $strText, 0, $align, false, $rows, 1);
if ($border)
$this->Rect($xi, $yi, $w, $h);
}
function drawRows($w, $h, $txt, $border=0, $align='J', $fill=false, $maxline=0, $prn=0)
{
if(!isset($this->CurrentFont))
$this->Error('No font has been set');
$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", '', (string)$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;
$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;
if ($prn==1) $this->_out('0 Tw');
}
if ($prn==1) {
$this->Cell($w, $h, substr($s, $j, $i-$j), $b, 2, $align, $fill);
}
$i++;
$sep=-1;
$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++;
}
$l+=$cw[$c];
if($l>$wmax)
{
//Automatic line break
if($sep==-1)
{
if($i==$j)
$i++;
if($this->ws>0)
{
$this->ws=0;
if ($prn==1) $this->_out('0 Tw');
}
if ($prn==1) {
$this->Cell($w, $h, substr($s, $j, $i-$j), $b, 2, $align, $fill);
}
}
else
{
if($align=='J')
{
$this->ws=($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0;
if ($prn==1) $this->_out(sprintf('%.3F Tw', $this->ws*$this->k));
}
if ($prn==1){
$this->Cell($w, $h, substr($s, $j, $sep-$j), $b, 2, $align, $fill);
}
$i=$sep+1;
}
$sep=-1;
$j=$i;
$l=0;
$ns=0;
$nl++;
if($border && $nl==2)
$b=$b2;
if ( $maxline && $nl > $maxline )
return substr($s, $i);
}
else
$i++;
}
//Last chunk
if($this->ws>0)
{
$this->ws=0;
if ($prn==1) $this->_out('0 Tw');
}
if($border && is_int(strpos($border, 'B')))
$b.='B';
if ($prn==1) {
$this->Cell($w, $h, substr($s, $j, $i-$j), $b, 2, $align, $fill);
}
$this->x=$this->lMargin;
return $nl;
}
}
?>
Example
<?php
require('textbox.php');
$pdf=new PDF_TextBox();
$pdf->AddPage();
$pdf->SetFont('Arial', '', 15);
$pdf->SetXY(80, 35);
$pdf->drawTextBox('This sentence is centered in the middle of the box.', 50, 50, 'C', 'M');
$pdf->Output();
?>