Получение высоты текста, чтобы узнать высоту заливки, как в TCPDF - PullRequest
3 голосов
/ 08 января 2011

Я пытаюсь просмотреть код TCPDF , чтобы понять, как он вычисляет высоту текста, который будет отображаться, но я слишком много справляюсь без запроса.

Что я хочу знать: в PDF из примера 5 http://www.tcpdf.org/examples/example_005.pdf это дает ячейке желтый фон. Я предполагаю, что на базовом уровне он сначала рисует прямоугольник с этим цветом заливки, затем добавляет текст, так какой метод он вызывает, чтобы получить высоту текста, чтобы узнать высоту поля для заполнения?

Я могу видеть из примера кода, что MultiCell() является точкой входа, но не ясно, какой метод он вызывает, чтобы получить высоту текста. Я вставил код для MultiCell() в эту вставку

http://pastebin.com/A1niGrQG

Кто-нибудь знает, как отследить это, потому что делать это вручную и просматривать код у меня совсем не работает.

Ответы [ 3 ]

3 голосов
/ 27 сентября 2011

TCPDF (по крайней мере, последняя версия) включает в себя метод getStringHeight() для получения расчетной высоты, необходимой для печати простой текстовой строки с использованием метода Multicell().Кроме того, метод getNumLines() дает приблизительное количество строк.Обратитесь к документации по исходному коду по адресу http://www.tcpdf org для получения дополнительной информации.

1 голос
/ 08 января 2011

Ячейка отрисовывается MultiCell: http://www.tcpdf.org/examples/example_005.phps

$pdf->MultiCell(55, 5, '[LEFT] '.$txt, 1, 'L', 1, 0, '', '', true);

и от: http://api.joomla.org/com-tecnick-tcpdf/TCPDF.html

 int MultiCell (float $w, float $h, string $txt, [mixed $border = 0], [string $align = 'J'], [int $fill = 0], [int $ln = 1], [int $x = ''], [int $y = ''], [boolean $reseth = true], [int $stretch = 0]) 

Итак, как вы можете видеть, первые два значения статически присваивают MultiCell ширину (55) и высоту (5)


Дополнительно:

// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

Вы можете видеть единицу измерения программы / класса по умолчанию PDF_UNIT


Размер шрифта затем устанавливается с помощью

$pdf->SetFont('times', '', 10);

(или просто используйте SetFontSize только для размера)

0 голосов
/ 08 января 2011

Так же, как очень простое доказательство концепции того, что я сказал в своем последнем комментарии к моему другому ответу ...

** Вам нужно использовать моноширинный шрифт и строкуВысота, равная высоте вашего текста (то есть или измените код для высоты строки вместо высоты текста), довольно простое исправление ...

Вы также должны выяснить вашу приблизительную моноширинную ширину. Лучше всего использоватьКапитолий M (M - самый широкий символ - поэтому моноширинные символы установлены на эту ширину ..)

<html><head></head><body style="font-family:'Courier New', Courier, monospace; line-height:12px;">
<?php

//If you are using a monospace font, this kinda works
$divWidth = 300;  // in px;

$fontSize = 12;  // (in px);
$fontWidth = 7;  // in px - aprox monospace font width


$lineChars = floor($divWidth / $fontWidth);


$text = <<<EOT
MMMMMMMMMM (capital M is the widest character)I'm trying to go through the code of TCPDF to understand how it calculates the height of the text to be rendered, but it's too much for me to handle without asking. 

What I want to know: in the PDF from example 5 it gives the cell a yellow background. I'm guessing that at the basic level, it first draws a box with this fill color, then adds the text, so what method is it calling to get the height of the text to know the height of the box to fill? 

I can see from the example code that MultiCell() is the entry point, but it's not clear what's the method it calls to get the height of the text. I pasted the code for MultiCell() in this pastebin 
EOT;


$wrappedText = wordwrap($text, $lineChars, "LINEHERE");
$lines = substr_count($wrappedText, "LINEHERE");
$newlines = substr_count($text, "\n");
$text = str_replace("\n", "<br>",$text);
$lines += $newlines;

$divHeight = $lines * $fontSize;
echo "With a width of: " . $divWidth . "<br>";
echo "Number of Lines: " . $lines . "<br>";
echo "Height Required: " . $divHeight . "px<br>";
echo "Wrapped Text at: " . $lineChars . " characters<br><br>";

$divsize = "width:$divWidth px; height:$divHeight px; font-size:$fontSize px; ";

$outStr = "<div style='overflow:auto; display:inline-block; background-color:aqua; $divsize'>$text</div>";
$outStr .= "<div style=' display:inline-block; background-color:fuchsia; $divsize'>&nbsp;</div>";

echo $outStr;
?> 
</body></html>
...