Zend_Pdf计算当前字体中用于换行的文本字符串的长度 - php

有没有人有一种简单的方法来计算一段文本在一个特定的字体和大小下会消耗多少个页面? (简单=最少的代码行+计算便宜)。 Zend_Pdf似乎没有执行此操作的功能,除了对getGlyphForCharacter(),getUnitsPerEm()和getWidthsForGlyph()的每个字符进行一些非常昂贵的调用外。

我正在生成一个多页PDF,每页上都有多个表,并且需要将文本包装在各列中。创建它已经花费了几秒钟,我不希望它花费太多时间,否则我将不得不开始处理后台任务或进度条等。

我想出的唯一解决方案是预先计算所使用的每种字体大小中每个字符的宽度(以磅为单位),然后将其加到每个字符串上。仍然相当昂贵。

我想念什么吗?还是您有更简单的方法?

谢谢!

参考方案

有一种方法可以精确地计算宽度,而不是使用Gorilla3D's worst case algorithm。

从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写入磁盘,因此重复视图非常快,并且在可能的情况下缓存/硬编码数据。

PHP Zend Controller插件被调用两次 - php

我注意到我的插件被调用了两次。我知道这个事实是因为在我的ViewSetup插件中它注册了标题,并且标题两次包含相同的内容。有任何想法吗? 参考方案 您最有可能将呼叫复制到preDispatch或postDispatch。对于尚未调度的每个请求,在Zend_Controller_Front::dispatch的循环内调用这些方法。这意味着将分派设置为false…

zend framework(1.1)将javascript文件附加到页脚? - php

在视图脚本的页脚中是否有一种开箱即用的方式来加载某些JavaScript?这对于诸如Google Analytics(分析)之类的脚本特别有用。还是这需要扩展$ this-> headScript()并创建$ this-> footScript()? 参考方案 在$this->layout()->footScript之类的布局中使用p…

在ZEND中处理JSONP调用 - php

通过搜索(或Google)找不到答案,所以我自己问。是否可以处理对zend框架的JSONP调用?仅找到此页面:http://framework.zend.com/wiki/display/ZFPROP/Zend_Json_Server+-+Lode+Blomme但我不确定它是否已经实施!谢谢 参考方案 JSONP只是包装在客户端上执行的指定回调函数中的JSO…

zend_navigation和模块 - php

目前,我正在使用zend开发应用程序,并将该应用程序分为模块。默认模块是未登录用户访问并可以自由浏览的主站点。登录时,根据用户类型,您将转到由简单ACL控制的模块A或模块B。如果您可以访问模块A,则不能访问模块B,反之亦然。两种用户类型都可以看到默认模块。现在,我想使用Zend_Navigation来管理所有模块中的整个应用程序导航。我不确定该怎么做,因为我…

共享vs专用php库 - php

我有一个由几个Zend Framework应用程序组成的服务器。我想知道在服务器上上传Zend Library并在所有应用程序之间共享而不是按应用程序上传是一个好主意。例如,多个应用程序同时请求或不请求一个库,是否会影响速度。它的优点和缺点是什么?提前谢谢。 参考方案 正如其他人指出的那样,有其优点和缺点。最大的缺点是,每次您要升级库代码时,都需要测试每个应…