Я создаю приложение 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: Я все виды ссылок размещены здесь, но, видимо, новый пользователь может опубликовать только одну ссылку на время
Это отличный ответ. Ваша цель в конце должна состоять в создании nsdictionary, который содержит пары ключ/вал для title-> номер страницы. Это будет составлять ТОС. – shawnwall
Собственно, вы не можете сравнивать outlinePageRef непосредственно с CGPDFPageRef, но вы можете сравнить его с 'CGPDFPageGetDictionary (page)'. – 0xced