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];
}
Другие вопросы по тегам