如何以编程方式创建PDFOutline

时间:2018-02-17 13:03:17

标签: python pdf quartz

我在尝试在PDF文件中创建目录对象时遇到问题。我不确定我是否从Apple的有限文档中了解了该过程。

我使用的是python,但欢迎使用任何语言的有说服力的例子来解释它应该如何工作。代码创建一个新的PDF文档,但预览中没有可见的大纲项。我尝试过只使用myOutline作为根对象,但这也不起作用。

pdfURL = NSURL.fileURLWithPath_(infile)
myPDF = Quartz.PDFDocument.alloc().initWithURL_(pdfURL)
if myPDF:
    # Create Destination
    myPage = myPDF.pageAtIndex_(1)
    pagePoint = Quartz.CGPointMake(0,0)
    myDestination = Quartz.PDFDestination.alloc().initWithPage_atPoint_(myPage, pagePoint)

    # Create Outline
    myOutline = Quartz.PDFOutline.alloc().init()
    myOutline.setLabel_("Interesting")
    myOutline.setDestination_(myDestination)

    # Create a root Outline and add the first outline as a child
    rootOutline = Quartz.PDFOutline.alloc().init()
    rootOutline.insertChild_atIndex_(myOutline, 0)

    # Add the root outline to the document and save
    myPDF.setOutlineRoot_(rootOutline)
    myPDF.writeToFile_(outfile)

编辑:实际上,大纲被保存到新文件中:我可以通过编程方式阅读它,它在Acrobat中显示为书签;然而,它并没有出现在预览的目录中(是的,我检查了"隐藏"事物)。如果我在Acrobat中添加另一个书签,则两者都会显示在预览中。

所以我想我要么仍然做错了,而且还没有完成。正确的PDFOutline数据,Acrobat是善良的;或者PDFKit中存在一个巨大的错误,这意味着您无法正确编写PDFOutlines。我对Mountain Lion,FWIW也有同样的行为。

1 个答案:

答案 0 :(得分:1)

这似乎是预览中的错误。如果它只包含一个子条目,它将不会列出目录。

如果我使用上面的代码添加更多轮廓,那么所有会出现在预览中。如果使用其他软件删除目录中的除一个条目以外的所有条目,则预览不会显示任何