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