Индексные значения для Apple PDFOutline

У меня проблемы с пониманием индексации объектов PDFOutline в PDFKit от Apple.

Документация для .index Метод говорит:

Индекс объекта структуры является относительным к его родным элементам и с точки зрения родителя объекта структуры. Корневой объект контура и любой объект контура без родителя имеют значение индекса 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

По какой-то причине последний контур появляется дважды (последний также является первым в этом примере только с одним контуром). И контур указывает на отдельный пустой объект в качестве его родителя, а не на объект 2. (Ошибки Acrobat жалуются на то, что у объекта 59 нет заголовка или родительского элемента.) Каждый контур указывает на другого пустого родителя от своего фактического родителя, хотя они все еще появляются в ToC, потому что их значение "Next" указывает на другое. Я бы ожидал что-то вроде этого:

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 также упоминается кое-что о том факте, что PDFKit сохраняет индекс ребенка, но я не совсем знаю, что это значит или имеет ли это отношение.

0 ответов

Другие вопросы по тегам