我在理解Apple的PDFKit中的PDFOutline对象的索引时遇到麻烦。
用于.index
方法的documentation说:
大纲对象的索引是相对于其同级对象的,并且相对于 轮廓对象的父对象的透视图。根轮廓 对象,并且没有父对象的任何轮廓对象的索引值为 0。
将子大纲添加到根(或其他任何大纲)的唯一方法是使用.insertChild:atIndex
,但是当我尝试添加第一个子大纲时,必须使用0作为索引,否则得到超出范围的错误。
肯定没有孩子的孩子是零索引吗?
我问是因为我试图使用python以编程方式添加目录。虽然代码似乎可以正常工作,并且生成了ToC,但Acrobat会标记语法错误,并且PDF数据确实显得有些奇怪。
2 0 obj
<< /First 57 0 R /Last 58 0 R >>
endobj
58 0 obj
<< /Dest [ 4 0 R /XYZ 0 841 null ] /Count 0 /Title (firstLabel) /Parent 59 0 R >>
endobj
59 0 obj
<< >>
endobj
57 0 obj
<< /Dest [ 4 0 R /XYZ 0 841 null ] /Count 0 /Title (firstLabel) /Parent 59 0 R >>
endobj
由于某种原因,最后一个轮廓出现两次(在此示例中,最后一个也是第一个轮廓,只有一个轮廓)。并且大纲将指向单独的Blank对象作为其父对象,而不是对象2。(Acrobat的错误抱怨对象59没有标题或父对象。)尽管每个大纲仍然显示,但它们指向的是与其实际父对象不同的空白父对象。在ToC中,因为它们的“下一个”值指向另一个值。我希望这样的事情:
2 0 obj
<< /First 27 0 R /Last 27 0 R>>
endobj
27 0 obj
<< /Dest [ 51 0 R /XYZ 0 842 null ] /Parent 2 0 R /Title (firstLabel)>>
endobj
对象2指向ToC,其唯一项指向它作为其父级。连续的轮廓线都是对象2的子级。
我正在使用python。相关代码在这里:
def getOutline(page, label):
# Create Outline object from label and page number
# Think this function is fine
myPage = myPDF.pageAtIndex_(page)
pageSize = myPage.boundsForBox_(Quartz.kCGPDFMediaBox)
x = 0
y = Quartz.CGRectGetMaxY(pageSize)
pagePoint = Quartz.CGPointMake(x,y)
myDestination = Quartz.PDFDestination.alloc().initWithPage_atPoint_(myPage, pagePoint)
myLabel = NSString.stringWithString_(label)
myOutline = Quartz.PDFOutline.alloc().init()
myOutline.setLabel_(myLabel)
myOutline.setDestination_(myDestination)
return myOutline
# Now load in pdf data from file
pdfURL = NSURL.fileURLWithPath_(infile)
myPDF = Quartz.PDFDocument.alloc().initWithURL_(pdfURL)
if myPDF:
# Create Outlines. Add the Page Index (from 0) and label in pairs here:
myTableOfContents = [
(0, 'firstLabel'),
(1, 'secondLabel'),
(2, 'thirdLabel')
]
allMyOutlines = []
for index, outline in myTableOfContents:
allMyOutlines.append(getOutline(index, outline))
# init the rootOutline object
rootOutline = Quartz.PDFOutline.alloc().init()
# Add the outlines from the dict as children, 0...
for index, value in enumerate(allMyOutlines):
rootOutline.insertChild_atIndex_(value, index)
# Set the root Outline to the PDF and save the file.
myPDF.setOutlineRoot_(rootOutline)
myPDF.writeToFile_(outfile)
我只是从字典中获取每个大纲对象,并将其作为子对象添加到根大纲中。
因此,总而言之:我应该使用零索引添加一个孩子吗?如果没有,还怎么办?似乎没有添加方法。
Apple的斯巴达语documentation还提到了以下事实:PDFKit保留了孩子的索引,但是我不太清楚这是什么意思,或者它是否相关。