首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用CGPDF间接引用页面对象?

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

Stack Overflow用户
提问于 2011-06-09 13:46:53
回答 3查看 1.3K关注 0票数 4

根据Adobe的“文档管理-便携式文档格式-第1部分:PDF-1.7”(2008.pdf),第12.3.2.1节规定:

目的地定义文档的特定视图,其中包括以下项目:

  • 应显示的文档页。
  • 文档窗口在该页上的位置。
  • 放大(变焦)因子

示例:

[page /XYZ left top zoom]

但在我的代码里

代码语言:javascript
复制
CGPDFArrayGetObject(dArray, 0, &dObj)

是一个CGPDFDictionaryRef

代码语言:javascript
复制
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]的页面对象这样的页面对象的间接引用?

这是我的代码:

代码语言:javascript
复制
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?

代码语言:javascript
复制
CGPDFArrayGetObject(dArray, 0, &dObj)

得到一个CGPDFDictionaryRef,但我没有找到字段是"3 0 R“

还有另一个问题,如果我知道是"3 0 R“

我在哪里可以找到通过搜索你的PDF 3 0 obj

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

EN

回答 3

Stack Overflow用户

发布于 2011-06-09 19:04:55

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

代码语言:javascript
复制
[page /XYZ left top zoom]

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

代码语言:javascript
复制
[page /FitR left bottom right top]

意思:

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

因为你的案例被引用为:

代码语言:javascript
复制
[3 0 R /FitR –4 399 199 533]

现在,这个例子所指的是page,在您的例子中,它变成了3 0 R。后者是对对象号3(第0代)的引用,您可以通过搜索3 0 obj找到它。这是定义对象3的地方,它应该为您的目的地命名您所寻找的page

更新:如果您真正的文档确实包含了代码段[3 0 R /FitR –4 399 199 533],那么同一文档还应该包含另一个部分,该部分将页面对象(间接引用)定义为3 0 obj。此部分定义页面对象,可以如下所示:

代码语言:javascript
复制
 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),f.e。字体,被它用过。第一个指向此页面的父对象(11)。

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

票数 4
EN

Stack Overflow用户

发布于 2014-06-29 17:56:50

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

票数 -1
EN

Stack Overflow用户

发布于 2014-06-30 21:29:22

检查vfr/Reader中github中的代码。他们似乎已经发现了所有这些联系。从PDF文档中可以确定到底是怎么回事。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6293789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档