2012-02-14 90 views
2

我想以下几点: 我想开一个现有的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

的基本问题是,Zend_Pdf_Page使用媒体盒属性计算每个页面的宽度和高度,而不是(在该特定情况下)裁剪框。有关各种盒子的更多解释,请参阅此链接:http://www.prepressure.com/pdf/basics/page_boxes

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

不过,我没有足够的经验说用裁剪框永久是否是一个好主意或没有。也许别人可以对此发表评论?我从前面提到的链接中得到的印象是Trim Box可能是一个更好的选择,但是我不认为你提到的示例PDF包含了这些数据。

无论你是否相信,Zend_Pdf_Page当前行为的正确与否实际上取决于定义。你想要整个画布的大小,即。一张纸,稍后您可能会进行物理修剪(您可能想知道这一点,以便您可以将注释添加到不打算用于打印的部分页面中),或者您通常希望在屏幕上看到的可查看区域?正确的答案可能是两者:Zend_Pdf_Page可能需要更多的方法,或者至少一个参数添加到getWidth()getHeight()允许调用指定他们到底是哪方面感兴趣,我不得不对ZF问题跟踪和couldn快速浏览一下。没有找到任何关于此的信息,所以我会添加一张票。至少文档块应该提到它返回媒体框的大小,并鼓励用户理解这意味着什么。

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

+0

喜詹姆斯,非常感谢你的详细解答。你也可以给我任何提示如何改变框架,我可以打开并阅读交叉参考文档?或者这会是一件相当困难的工作?因为如果我不能阅读交叉参考PDF文件,我必须使用别的东西....谢谢! – user897237 2012-02-15 15:20:08

+0

我不知道这是否会起作用(它不适用于上面提到的示例文档),但可能需要进一步调查: foreach($ pdf-> getNamedDestinations()as $ destination) 如果($ destination-> isRemote()) { echo $ destination-> getResource() - > toString(),“\ n”; } } – JamesG 2012-02-16 03:23:05

+0

嗨,詹姆斯,谢谢你的反馈!我编辑了我的问题。如果您不介意我会请您查看一下。交叉引用引起的错误是什么?谢谢! – user897237 2012-02-16 13:52:29