4

根据 Adob​​e 的“文档管理 - 便携式文档格式 - 第 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]'s page 对象)的间接引用?

这是我的代码:

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

3 回答 3

4

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

[page /XYZ left top zoom]

与您的情况相匹配的真实示例是:

[page /FitR left bottom right top]

意义:

显示由 page 指定的页面,其内容被放大到刚好适合左、下、右和上坐标指定的矩形在水平和垂直方向上完全位于窗口内。如果所需的水平和垂直放大系数不同,请使用两者中较小的一个,将矩形在另一个维度的窗口中居中。

因为您的案例被引用为:

[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),fe 字体,由它使用。第一个指向此页面的父对象 (11)。

注 2:对象的编号不需要按顺序编号,因为对象出现在 PDF 文件中。(几乎)唯一的条件是编号是唯一的。

于 2011-06-09T19:04:55.707 回答
-1

唉,虽然答案是领先的,但我们仍然不清楚我们需要什么。一个显示我们必须跳转到的页码或名称的代码片段就可以了。

于 2014-06-29T17:56:50.903 回答
-1

在 vfr/Reader 中检查 github 中的代码。他们似乎已经弄清楚了所有这些链接。从 PDF 文档中肯定不清楚发生了什么。

于 2014-06-30T21:29:22.967 回答