阅读和检查PDF文件

时间:2012-02-14 23:58:05

标签: php zend-framework pdf

我正在尝试以下方法: 我想打开现有的PDF文档并检查其中每个页面的宽度。

$pdf = Zend_Pdf::Load( $fullFilePath );      
foreach($pdf->pages As $key => $page)
{
  $width  = $page->getWidth();
}

但我每次都得到相同的宽度。即使有“双页”(了解我的意思,请参阅http://www.reinkesupply.com/Acoustical%20Cross-Reference.pdf

我还有一个问题。我希望也可以使用交叉引用PDF。 任何人都可以给我任何暗示我应该修复什么来达到目标​​? 如前所述,我只打开PDF文件并检查页面宽度。

在检查几个dos时,我收到以下错误:

Message:

PDF file syntax error. Offset - 0x12E9048. Wrong W dictionary entry. Only type field of stream entries has default value and could be zero length.

Stack trace:

#0 C:\xampp\htdocs\qs\library\Zend\Pdf\Parser.php(455): Zend_Pdf_Parser->_loadXRefTable('19828808')
#1 C:\xampp\htdocs\qs\library\Zend\Pdf.php(297): Zend_Pdf_Parser->__construct('C:\xampp\htdocs...', Object(Zend_Pdf_ElementFactory_Proxy), true)
#2 C:\xampp\htdocs\qs\library\Zend\Pdf.php(250): Zend_Pdf->__construct('C:\xampp\htdocs...', NULL, true)
#3 C:\xampp\htdocs\qs\application\controllers\IndexController.php(18): Zend_Pdf::load('C:\xampp\htdocs...')
#4 C:\xampp\htdocs\qs\library\Zend\Controller\Action.php(503): IndexController->indexAction()
#5 C:\xampp\htdocs\qs\library\Zend\Controller\Dispatcher\Standard.php(285): Zend_Controller_Action->dispatch('indexAction')
#6 C:\xampp\htdocs\qs\library\Zend\Controller\Front.php(934): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#7 C:\xampp\htdocs\qs\public\index.php(24): Zend_Controller_Front->dispatch()
#8 {main}

我想这是因为交叉引用。我对吗?有没有简单的方法来解决它?

由于

1 个答案:

答案 0 :(得分:1)

基本问题是Zend_Pdf_Page使用Media Box属性来计算每个页面的宽度和高度,而不是(在这种特殊情况下)Crop Box。有关各种框的进一步说明,请参阅以下链接:http://www.prepressure.com/pdf/basics/page_boxes

在您的情况下,一种可能的解决方案是修补Zend_Pdf_Page,以便它在可用时使用裁剪框值,否则返回媒体框值。代码位于getHeight()getWidth()方法中,从ZF 1.1.11中的第459行开始。

但是,我没有足够的经验说明永久使用Crop Box是否是个好主意。也许其他人可以对此发表评论?我从前面提到的链接得到的印象是Trim Box可能是更好的选择,但我不认为您引用的示例PDF包含该数据。

您是否认为Zend_Pdf_Page的当前行为是否正确取决于定义。你想要整个画布的大小,即。一张纸,您可能会在以后进行物理修剪(您可能想知道这一点,以便您可以在不打算打印的页面部分添加注释),或者您通常希望在屏幕上看到的可视区域?正确答案可能是:Zend_Pdf_Page可能需要更多方法,或至少添加到getWidth()getHeight()的参数,允许调用者准确指定他们感兴趣的维度。我快速浏览了ZF问题跟踪器,找不到任何相关信息,所以我会添加一张票。至少doc块应该提到它返回Media Box的大小并鼓励用户理解这意味着什么。

最终,如果我是你,我可能会进入并修补Zend_Pdf_Page,以便当裁剪框可用时返回该大小,否则返回媒体框。如果你想贡献那个补丁,你的旅程从这里开始:http://framework.zend.com/wiki/display/ZFDEV/Contributing+to+Zend+Framework: - )