This method is an extension of Cell() allowing to output text with either character spacing or horizontal scaling. The first 8 parameters are the same as Cell(). The additional parameters are:
CellFit(float w [, float h [, string txt [, mixed border [, int ln [, string align [, boolean fill [, mixed link [, boolean scale [, boolean force]]]]]]]]])
## scale
false: character spacing
true: horizontal scaling
## force
false: only space/scale if necessary (not when text is short enough to fit)
true: always space/scale
## The following four methods are also provided for convenience, allowing all combinations of scale/force, and using only the 8 parameters of Cell():
CellFitScale()
CellFitScaleForce()
CellFitSpace()
CellFitSpaceForce()
cellfit.php
<?php require('fpdf.php'); class FPDF_CellFit extends FPDF { //Cell with horizontal scaling if text is too wide function CellFit($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='', $scale=false, $force=true) { //Get string width $str_width=$this->GetStringWidth($txt); //Calculate ratio to fit cell if($w==0) $w = $this->w-$this->rMargin-$this->x; $ratio = ($w-$this->cMargin*2)/$str_width; $fit = ($ratio < 1 || ($ratio > 1 && $force)); if ($fit) { if ($scale) { //Calculate horizontal scaling $horiz_scale=$ratio*100.0; //Set horizontal scaling $this->_out(sprintf('BT %.2F Tz ET',$horiz_scale)); } else { //Calculate character spacing in points $char_space=($w-$this->cMargin*2-$str_width)/max(strlen($txt)-1,1)*$this->k; //Set character spacing $this->_out(sprintf('BT %.2F Tc ET',$char_space)); } //Override user alignment (since text will fill up cell) $align=''; } //Pass on to Cell method $this->Cell($w,$h,$txt,$border,$ln,$align,$fill,$link); //Reset character spacing/horizontal scaling if ($fit) $this->_out('BT '.($scale ? '100 Tz' : '0 Tc').' ET'); } //Cell with horizontal scaling only if necessary function CellFitScale($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='') { $this->CellFit($w,$h,$txt,$border,$ln,$align,$fill,$link,true,false); } //Cell with horizontal scaling always function CellFitScaleForce($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='') { $this->CellFit($w,$h,$txt,$border,$ln,$align,$fill,$link,true,true); } //Cell with character spacing only if necessary function CellFitSpace($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='') { $this->CellFit($w,$h,$txt,$border,$ln,$align,$fill,$link,false,false); } //Cell with character spacing always function CellFitSpaceForce($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='') { //Same as calling CellFit directly $this->CellFit($w,$h,$txt,$border,$ln,$align,$fill,$link,false,true); } } ?>
index.php
<?php require('cellfit.php'); $txt_short = 'This text is short enough.'; $txt_long = 'This text is way too long.'; for ($i = 1; $i <= 2; $i++) $txt_long.=' '.$txt_long; $pdf = new FPDF_CellFit(); $pdf->AddPage(); $pdf->SetFillColor(0xff,0xff,0x99); $pdf->SetFont('Arial','B',16); $pdf->Write(10,'Cell'); $pdf->SetFont(''); $pdf->Ln(); $pdf->Cell(0,10,$txt_short,1,1); $pdf->Cell(0,10,$txt_long,1,1); $pdf->Ln(20); $pdf->SetFont('','B'); $pdf->Write(10,'CellFitScale'); $pdf->SetFont(''); $pdf->Write(10,' (horizontal scaling only if necessary)'); $pdf->Ln(); $pdf->CellFitScale(0,10,$txt_short,1,1); $pdf->CellFitScale(0,10,$txt_long,1,1,'',1); $pdf->Ln(); $pdf->SetFont('','B'); $pdf->Write(10,'CellFitScaleForce'); $pdf->SetFont(''); $pdf->Write(10,' (horizontal scaling always)'); $pdf->Ln(); $pdf->CellFitScaleForce(0,10,$txt_short,1,1,'',1); $pdf->CellFitScaleForce(0,10,$txt_long,1,1,'',1); $pdf->Ln(20); $pdf->SetFont('','B'); $pdf->Write(10,'CellFitSpace'); $pdf->SetFont(''); $pdf->Write(10,' (character spacing only if necessary)'); $pdf->Ln(); $pdf->CellFitSpace(0,10,$txt_short,1,1); $pdf->CellFitSpace(0,10,$txt_long,1,1,'',1); $pdf->Ln(); $pdf->SetFont('','B'); $pdf->Write(10,'CellFitSpaceForce'); $pdf->SetFont(''); $pdf->Write(10,' (character spacing always)'); $pdf->Ln(); $pdf->CellFitSpaceForce(0,10,$txt_short,1,1,'',1); $pdf->CellFitSpaceForce(0,10,$txt_long,1,1,'',1); $pdf->Output(); ?>