2010-12-12 4 views
8

Я создаю приложение iPad, которое отображает PDF-файлы, и я хотел бы иметь возможность отображать оглавление и позволить пользователю перейти к соответствующим страницам.Как получить PDF-содержимое (контур) данных в iOS (iPad)?

В этот момент я потратил несколько часов на исследования, и кажется, что, поскольку PDFKit не поддерживается в iOS, мой единственный вариант - разобрать метаданные PDF вручную.

Я рассмотрел несколько решений, но все они молчат в одной точке - как связать страницу в метаданных «контур» с реальным номером страницы элемента. Я изучил свой документ в формате PDF с помощью инструмента Voyeur, и я вижу схему в дереве.

[Это решение] помогло мне разобраться, как перемещаться по дереву Outline/A/S/D, чтобы найти объект «Dest», но он выполняет какое-то сравнение объектов, используя [self.pages indexOfObjectIdenticalTo: destPageDic] что я не понимаю.

Я прочитал [официальный PDF спецификации из самана] и раздел «12.3.2.3 Named Направления» описывает способ, что запись контур может указывать на страницу:

Вместо того, чтобы быть определен непосредственно явный синтаксис, показанный в таблице 151, назначение может быть отнесено к косвенно с помощью объекта имени (PDF 1.1) или байтовой строки (PDF 1.2).

И продолжается с этой линии, которая является совершенно непонятным для меня:

Значение этой записи должно быть словарь, в котором каждая клавиша является имя получателя и соответствующее значение либо массив, определяющий назначение , используя синтаксис, показанный в таблице , или словарь с записью D , значение которой является таким массивом.

Это относится к странице 366, «12.3.2.2 Явных Направления», где таблица описывает страницу: «В каждом случае страница является косвенной ссылкой на странице объект»

Так является результатом CGPDFDocumentGetPage или CGPDFPageGetDictionary - «косвенная ссылка на объект страницы»?

Я нашел [thread on lists.apple.com], который обсуждается. [Этот комментарий] означает, что вы можете сравнить адрес (в памяти?) Объекта CGPDFPageGetDictionary для данной страницы и сравнить его со страницами в дереве «Контур» метаданных PDF.

Однако, когда я смотрю на адрес объектов страницы в дереве контуров и сравниваю их с адресами, они никогда не совпадают. Линия, используемая в этом потоке «TTDPRINT (@«% d =>% p », k + 1, dict); печатает «dict» в качестве указателя в памяти. нет оснований полагать, что возвращаемый там объект будет таким же, как и в другом месте .. они будут в разных местах в памяти!

Моя последняя надежда состояла в том, чтобы взглянуть на исходный код из инструмента командной строки «контур» из яблочного инструмента [упомянутого в этой книге] (как [предложенный этой нитью]), но я не могу найти его нигде.

Подводная черта - есть ли у кого-нибудь представление о том, как работают PDF-контуры, или знаете какой-либо открытый исходный код (желательно объектив-с), который читает схемы PDF?

ARGG: Я все виды ссылок размещены здесь, но, видимо, новый пользователь может опубликовать только одну ссылку на время

ответ

3

Результат CGPDFDocumentGetPage такой же, как косвенной ссылке на страницу, вы получаете при разрешении пункт назначения в контурном элементе. Оба являются по существу словарями, и вы можете сравнить их с помощью ==. Если у вас есть CGPDFDictionaryRef, что вы хотите знать номер страницы, вы можете сделать что-то вроде этого:

CGPDFDocumentRef doc = ...; 
CGPDFDictionaryRef outlinePageRef = ...; 
for (int p=1; p<=CGPDFDocumentGetNumberOfPages(doc); p++) { 
    CGPDFPageRef page = CGPDFDocumentGetPage(doc, p); 
    if (page == outlinePageRef) { 
    printf("found the page number: %i", p); 
    break; 
    } 
} 

Явное назначения, однако это не страница, а массив с первым элементом является страница. Другими элементами являются положение прокрутки на странице и т. Д.

+0

Это отличный ответ. Ваша цель в конце должна состоять в создании nsdictionary, который содержит пары ключ/вал для title-> номер страницы. Это будет составлять ТОС. – shawnwall

+1

Собственно, вы не можете сравнивать outlinePageRef непосредственно с CGPDFPageRef, но вы можете сравнить его с 'CGPDFPageGetDictionary (page)'. – 0xced

Смежные вопросы