2012-02-14 57 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