苹果PDFOutline的索引值

时间:2019-03-30 10:22:22

标签: python macos apple-pdfkit

我在理解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保留了孩子的索引,但是我不太清楚这是什么意思,或者它是否相关。

0 个答案:

没有答案