macOS/iOS PDFKit: создать корень схемы документа
Следующий пример кода позволяет добавить схему (или "закладку" в терминологии Acrobat) к существующему PDFDocument pdfDoc
с меткой Page n, указывающей на номер страницы n, где n - переданный аргумент pageNum
,
void insertOutline( PDFDocument *pdfDoc, NSUInteger pageNum )
{
PDFOutline *otl,
*root;
NSString *label = [NSString stringWithFormat:@"Page %lu", (unsigned long)pageNum + 1];
PDFDestination *destination;
PDFAction *action;
NSPoint point = {FLT_MAX, FLT_MAX};
PDFPage *page;
// Build the outline
page = [pdfDoc pageAtIndex: pageNum];
destination = [[PDFDestination alloc] initWithPage:page atPoint:point];
action = [[PDFActionGoTo alloc] initWithDestination: destination];
root = [pdfDoc outlineRoot];
otl = [[PDFOutline alloc] init];
[otl setLabel: label];
[otl setAction: action];
// Insert the outline
[root insertChild: otl atIndex: pageNum];
// Release resources
[otl release];
[action release];
[destination release];
}
Созданный контур добавляется в качестве дочернего к корневому плану вверху иерархической структуры документа.
Возникает проблема при попытке добавить схему в PDF, который еще не содержит схемы.
В таком случае root = [pdfDoc outlineRoot];
приведет к root
установлен в NULL
и код, который следует, очевидно, терпит неудачу.
Если я открываю исходный документ с помощью Acrobat Pro и добавляю вручную одну схему / закладку, то код работает.
Вопрос в том, как добавить в PDFDocument корневой контур, если он отсутствует?
1 ответ
Глядя на ссылку Apple здесь PDFDocument
Класс предоставляет метод для установки корня структуры.
Итак, исправление:
root = [pdfDoc outlineRoot];
if( ! root )
{
root = [[PDFOutline alloc] init];
[pdfDoc setOutlineRoot: root];
}