2011-06-09 12 views
4

根據Adobe的「文檔管理 - 便攜式文檔格式 - 第1部分:PDF 1.7」Pdf32000_2008.pdf),第12.3.2.1狀態:如何使用CGPDF獲取對頁面對象的間接引用?

目的地定義特定 視圖一個文件,,由在 以下項目:

  • 是應顯示的文檔的頁面

  • 的該網頁上的文檔窗口的位置

  • 放大倍率(變焦)因子

例子:

[page /XYZ left top zoom]

但在我的代碼

CGPDFArrayGetObject(dArray, 0, &dObj) 

CGPDFDictionaryRef

93 0 obj 
<< /Type /Annot 
     /Subtype /Link 
     /Rect [71 717 190 734] 
     /Border [16 16 1] 
     /A << /Type /Action 
     /S /GoTo 
     /D [3 0 R /FitR –4 399 199 533] 
     >> 
>> 
endobj 

如何從/D [3 0 R /FitR –4 399 199 533]獲得3 0 R

如何獲得間接引用頁面對象如[page /XYZ left top zoom]的頁面對象?

這裏是我的代碼:

CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdfRef, pageNum); 
CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(pdfPage); 
CGPDFArrayRef outputArray; 
if(CGPDFDictionaryGetArray(pageDictionary, "Annots", &outputArray)) 
{ 
    int arrayCount = 0; 
    arrayCount = CGPDFArrayGetCount(outputArray); 
    if(arrayCount>0) 
    { 
     for(int j = 0; j < arrayCount; ++j) 
     { 
      CGPDFObjectRef aDictObj; 
      if(CGPDFArrayGetObject(outputArray, j, &aDictObj)) 
      { 
       CGPDFDictionaryRef annotDict; 
       if(CGPDFObjectGetValue(aDictObj, kCGPDFObjectTypeDictionary, &annotDict)) 
       { 
        CGPDFDictionaryRef aDict; 
        if(CGPDFDictionaryGetDictionary(annotDict, "A", &aDict))//page 1 returns here 
        { 
         CGPDFArrayRef dArray; 
         if(CGPDFDictionaryGetArray(aDict, "D", &dArray)) 
         { 
          CGPDFObjectRef dObj; 
          if(CGPDFArrayGetObject(dArray, 0, &dObj)){ 
           CGPDFDictionaryRef annotDict; 
           if(CGPDFObjectGetValue(dObj, kCGPDFObjectTypeDictionary, &annotDict)) 
           { 

           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

非常感謝你對你重播〜但我有一個問題 我在哪裏可以知道這個對象數爲3?

CGPDFArrayGetObject(dArray, 0, &dObj) 

得到CGPDFDictionaryRef,但我沒有發現場是 「3 0 R」

和另外一個問題,如果我知道的是 「3 0 R」

我在哪裏可以找到搜索你的PDF爲3 0 obj

謝謝你的回覆,非常感謝你非常非常...我希望得到你的答案!

回答

4

首先,你引用表151,PDF文檔參考366頁的錯誤的榜樣,因爲它不符合你的情況:

[page /XYZ left top zoom] 

真正的例子你的情況相符是:

[page /FitR left bottom right top] 

含義:

顯示的頁面d通過頁面指定,其內容被放大到剛好足以在水平和垂直方向上完全匹配座標左側,底部,右側和頂部所指定的矩形。如果所需的水平和垂直放大係數不同,請使用兩者中較小的一個,將矩形在另一維中的窗口中居中。

,因爲你的情況是引述:你的情況

[3 0 R /FitR –4 399 199 533] 

現在,例如是指爲page什麼,變得3 0 R。後者是一個參考對象編號3(第0代),您可以通過搜索您的PDF尋找3 0 obj。這是定義對象編號3的地方,它應該爲您的目的地命名爲page


更新:如果你真正的文件確實不包含片段[3 0 R /FitR –4 399 199 533],那麼同樣的文件也應包含定義的頁面對象(間接簡稱)爲3 0 obj另一部分。這部分定義的頁面對象,並可以這樣寫:

3 0 obj 
    << /Type /Page 
     /Parent 11 0 R 
     /MediaBox [ 0 0 597.6 842.4 ] 
     /Contents 31 0 R 
     /Group << 
       /Type /Group 
       /S /Transparency 
       /CS /DeviceRGB 
      >> 
     /Resources 23 0 R 
    >> 
endobj 

注意,這是如何再次對象並參考其他三個對象:11 0 R31 0 R23 0 R。後兩者指向保存頁面內容(31)和資源(23)的對象31和23。字體,由它使用。第一個指向這個頁面的父對象(11)。

注2:隨着對象出現在PDF文件中,對象的編號不需要順序排列。 (幾乎)唯一的條件是編號是uniq。

+0

非常感謝您的回覆〜但我有一個問題,我可以在哪裏知道這個對象編號是3? CGPDFArrayGetObject(dArray,0,&DOBJ) 得到CGPDFDictionaryRef,但我沒有發現場是 「3 0 R」 和另外一個問題,如果我知道的是 「3 0 R」 我在哪裏可以找到通過搜索您的PDF爲3 0目標 謝謝你的回覆,非常感謝你非常非常...我希望得到你的答案! – user476489 2011-06-10 09:37:31

+0

@我會更新答案有點... – 2011-06-10 12:02:28

+0

非常感謝你! – user476489 2011-06-11 06:58:10

-1

唉,雖然答案是領先的,但我們仍然不清楚我們需要什麼。顯示我們必須跳轉到的頁碼或名稱的代碼片段就可以實現。

-1

檢查vfr/Reader中github中的代碼。他們似乎已經想出了所有這些聯繫。從PDF文檔可以確定發生了什麼。

相關問題