From 7616982ff237d3bf9f55220c279f36fd3810c741 Mon Sep 17 00:00:00 2001 From: dave Date: Sat, 3 Apr 2010 08:48:20 +0000 Subject: [PATCH] Fix font height computation. Implement truncate and '...' on overflow. --- tcpdf.inc.php | 55 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/tcpdf.inc.php b/tcpdf.inc.php index 2e7a94f..0d30a25 100644 --- a/tcpdf.inc.php +++ b/tcpdf.inc.php @@ -169,34 +169,40 @@ class pdf extends TCPDF { $x = $this->getX(); $y = $this->getY(); $orig_fs = $this->getFontSizePt(); + $add_ellipses = false; $fontsize = $orig_fs; while(1) { $lines = $this->_fitcell_lines($w, $h, $txt, $fontsize); - $label_h = $this->cMargin * 2 + ($this->getFontSize($fontsize) * count($lines)); -// echo "h=$h; fs=".$this->getFontSize($fontsize).", lines=".count($lines).", total=$label_h\n"; + $cell_height = $this->cMargin * 2 + $this->FontSize; + $label_h = $cell_height * count($lines); + if($label_h <= $h) { /* It fits! */ break; } + /* else, it doesn't fit */ if($on_overflow == 'scale') { /* reduce the font size and try again */ $fontsize -= 0.5; $this->setFontSize($fontsize); -// echo "retry...\n"; continue; + } - } else if($on_overflow == '...') { - /* truncate, add ... */ - echo "Not implemented: FitCell::on_overflow=..."; - exit; - } else { - /* truncate */ - echo "Not implemented: FitCell::on_overflow=truncate"; - exit; - } + /* If it doesn't fit, and we're not scaling, it must + * be a truncate. Compute the number of lines that + * can be displayed */ + $display_lines = floor($h / $cell_height); + /* Adjust height */ + $label_h -= (count($lines) - $display_lines) * $cell_height; + + /* truncate */ + $lines = array_slice($lines, 0, $display_lines); + + if($on_overflow == '...') $add_ellipses = true; + break; } /* SetX, find Y based on alignment */ @@ -212,23 +218,29 @@ class pdf extends TCPDF { break; } + /* Fontsize will be correctly set here */ /* Cell( float $w, [float $h = 0], [string $txt = ''], [mixed $border = 0], [int $ln = 0], [string $align = ''], [int $fill = 0], [mixed $link = ''], [int $stretch = 0], [boolean $ignore_min_height = false]) */ - $this->setFontSize($fontsize); foreach($lines as $l) { $this->Cell($w, 0, $l, 0, 2, $align, 0, 0, 0, false); } - /* Restore original fontsize */ - $this->setFontSize($orig_fs); + if($add_ellipses) { + /* Only use fontsize so the '...' is really close to the lower right. */ + $this->SetXY($x, $y + $h - $cell_height); + $this->Cell($w, 0, '...', 0, 0, 'R'); + } /* Restore original location */ $this->SetXY($x,$y); + /* Restore original fontsize */ + $this->setFontSize($orig_fs); + /* Deal with the border and ln, leaving x,y wherever $ln * tells us to */ - $this->Cell($w, $h, '', $border, $ln); + $this->Cell($w, $h, '', $border, $ln, 'R'); } function GetFontList() @@ -327,11 +339,13 @@ class pdf extends TCPDF { } - function output() + function output($filename='', $dest='I') { - $filename=strtolower($this->subject); - $filename=ereg_replace("[^a-z0-9]","_",$filename); - parent::Output($filename.".pdf", "I"); + if($filename == '') { + $filename=strtolower($this->subject); + $filename=ereg_replace("[^a-z0-9]","_",$filename).'.pdf'; + } + parent::Output($filename, $dest); } /* align = left, center, right @@ -384,5 +398,4 @@ class pdf extends TCPDF { { $this->Rect($this->lMargin + $x, $this->tMargin + $y, $w, $h); } - }