Значения индекса для Apple PDFOutline - PullRequest
0 голосов
/ 30 марта 2019

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

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

Индекс объекта структуры относительно его братьев и сестер и с точки зрения родителяконтурный объект.Корневой объект контура и любой объект контура без родителя имеют индексное значение 0.

Единственный способ добавить дочерний контур в корень (или любой другойOutline) должен использовать .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 сохраняет индекс ребенка, но я не совсем знаю, что этоозначает или, если это уместно.

...