Продолжительность вычисления Zend_Pdf текстовой строки в текущем шрифте для обертывания строки

Обычно я не использовал бы спецификаторы исключения. Однако в случаях, где, если бы какое-либо другое исключение должно было прибыть из рассматриваемой функции, что программа окончательно была бы неспособна к корректный , затем это может быть полезно. Во всех случаях удостоверьтесь, что зарегистрировали ясно, какие исключения могли ожидаться от той функции.

Да, ожидаемое поведение неуказанного исключения, бросаемого от функции со спецификаторами исключения, состоит в том, чтобы назвать оконечным ().

я также отмечу, что Scott Meyers затрагивает эту тему в Более эффективном C++. Его Эффективный C++ и Более эффективный C++ настоятельно рекомендованы книги.

12
задан Steve 16 August 2009 в 05:56
поделиться

2 ответа

Существует способ точно рассчитать ширину, а не использовать алгоритм Gorilla3D наихудшего случая .

Попробуйте этот код из http: //devzone.zend. com / article / 2525-Zend_Pdf-tutorial # comments-2535

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

/**
* Returns the total width in points of the string using the specified font and
* size.
*
* This is not the most efficient way to perform this calculation. I'm
* concentrating optimization efforts on the upcoming layout manager class.
* Similar calculations exist inside the layout manager class, but widths are
* generally calculated only after determining line fragments.
* 
* @link http://devzone.zend.com/article/2525-Zend_Pdf-tutorial#comments-2535 
* @param string $string
* @param Zend_Pdf_Resource_Font $font
* @param float $fontSize Font size in points
* @return float
*/
function widthForStringUsingFontSize($string, $font, $fontSize)
{
     $drawingString = iconv('UTF-8', 'UTF-16BE//IGNORE', $string);
     $characters = array();
     for ($i = 0; $i < strlen($drawingString); $i++) {
         $characters[] = (ord($drawingString[$i++]) << 8 ) | ord($drawingString[$i]);
     }
     $glyphs = $font->glyphNumbersForCharacters($characters);
     $widths = $font->widthsForGlyphs($glyphs);
     $stringWidth = (array_sum($widths) / $font->getUnitsPerEm()) * $fontSize;
     return $stringWidth;
 }

Что касается производительности, я не использовал его интенсивно в сценарии, но я могу представить, что это медленно. Я бы посоветовал записать PDF-файлы на диск, если это возможно, поэтому повторные просмотры выполняются очень быстро, а данные кэшируются / жестко кодируются, где это возможно.

29
ответ дан 2 December 2019 в 05:15
поделиться

Поразмыслите над этим еще немного. Возьмите самые широкие символы шрифта, который вы используете, и определите ширину каждого символа. Это будет неточно, но это предотвратит выталкивание текста за отметку.

$pdf = new Zend_Pdf();
$font      = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_COURIER); 
$font_size = $pdf->getFontSize();


$letters = array();
foreach(range(0, 127) as $idx)
{
    array_push($letters, chr($idx));
}
$max_width = max($font->widthsForGlyphs($letters));

// Text wrapping settings
$text_font_size = $max_width; // widest possible glyph
$text_max_width = 238;        // 238px

// Text wrapping calcs
$posible_character_limit = round($text_max_width / $text_font_size);
$text = wordwrap($text, $posible_character_limit, "@newline@");
$text = explode('@newline@', $text);
0
ответ дан 2 December 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: