如何使用CGPDF间接引用页面对象?

时间:2011-06-09 13:46:53

标签: iphone pdf cgpdf

根据Adobe的“文档管理 - 可移植文档格式 - 第1部分:PDF 1.7”Pdf32000_2008.pdf),第12.3.2.1节规定:

  

目的地定义一个特定的   文件的视图,由...组成   以下项目:

     
      
  • 将显示的文件页面

  •   
  • 该页面上文档窗口的位置

  •   
  • 放大(缩放)系数

  •   

示例:

[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

如何从3 0 R获取/D [3 0 R /FitR –4 399 199 533]

如何间接引用页面对象,如[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

谢谢你的回复,非常感谢你...我希望得到你的回答!

3 个答案:

答案 0 :(得分:4)

首先,您引用了PDF参考文档第136页的表151中的错误示例,因为它与您的案例不符:

[page /XYZ left top zoom]

符合您案例的真实示例是:

[page /FitR left bottom right top]

含义:

  

显示页面指定的页面,其内容放大到足以完全适合窗口左,底,右和顶部指定的矩形,水平和垂直均在窗口内。如果所需的水平和垂直放大系数不同,请使用两者中较小的一个,将窗口中的矩形居中放在另一个维度中。

因为您的案例被引用为:

[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],则同一文档还应包含另一个将页面对象(间接引用)定义为{{1 }}。这部分定义了页面对象,可以这样读:

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 R。后两者指向对象31和23,它们保存页面的内容(31)和资源(23),f.e。字体,由它使用。第一个指向此页面的父对象(11)。

注意2:对象的编号不需要按顺序显示在PDF文件中。 (几乎)唯一的条件是编号是uniq。

答案 1 :(得分:-1)

唉,虽然答案很快,但我们还不清楚我们需要什么。显示我们必须跳转到的页码或名称的代码片段可以解决这个问题。

答案 2 :(得分:-1)

检查vfr / Reader中github中的代码。他们似乎已经想出了所有这些链接。从PDF文档中可以清楚地知道发生了什么。