根据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
谢谢你的回复,非常感谢你...我希望得到你的回答!答案 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 R
和31 0 R
。后两者指向对象31和23,它们保存页面的内容(31)和资源(23),f.e。字体,由它使用。第一个指向此页面的父对象(11)。
注意2:对象的编号不需要按顺序显示在PDF文件中。 (几乎)唯一的条件是编号是uniq。
答案 1 :(得分:-1)
答案 2 :(得分:-1)
检查vfr / Reader中github中的代码。他们似乎已经想出了所有这些链接。从PDF文档中可以清楚地知道发生了什么。