Я создаю приложение для iPad, которое отображает PDF-файлы, и я хотел бы иметь возможность отображать оглавление и позволить пользователю переходить на соответствующие страницы.
В этот момент я потратил несколько часов на исследования, и, похоже, поскольку PDFKit [не поддерживается в iOS], я могу только вручную проанализировать метаданные PDF.
Я рассмотрел несколько решений, но все они молчат об одном: как связать страницу в «метаданных» метаданных с реальным номером страницы элемента. Я проверил свой документ PDF с помощью [инструмента Voyeur], и я вижу контур в дереве.
[Это решение] помогло мне выяснить, как перемещаться по дереву Outline / A / S / D, чтобы найти объект «Dest», но он выполняет какое-то сравнение объектов, используя [self.pages indexOfObjectIdenticalTo: destPageDic], который Я не понимаю.
Я прочитал [официальную спецификацию PDF от Adobe], а раздел «12.3.2.3 Именованные места назначения» описывает способ, которым элемент схемы может указывать на страницу:
Вместо того, чтобы быть определенным непосредственно с
явный синтаксис, показанный в таблице
151, пункт назначения может упоминаться
косвенно с помощью имени объекта
(PDF 1.1) или строка байтов (PDF 1.2).
И продолжает эту строчку, которая для меня совершенно непонятна:
Значение этой записи должно быть
словарь, в котором каждый ключ является
название пункта назначения и соответствующий
значение является либо массивом, определяющим
пункт назначения, используя синтаксис, показанный в
Таблица 151, или словарь с D
запись, значением которой является такой массив.
Это относится к странице 366, «12.3.2.2 Явные места назначения», где таблица описывает страницу: «В каждом случае страница является косвенной ссылкой на объект страницы»
Так является ли результат CGPDFDocumentGetPage или CGPDFPageGetDictionary «косвенной ссылкой на объект страницы»?
Я нашел [ветку на lists.apple.com], в которой обсуждается. [Этот комментарий] подразумевает, что вы можете сравнить адрес (в памяти?) Объекта CGPDFPageGetDictionary для данной страницы и сравнить его со страницами в дереве «Схема» метаданных PDF.
Однако, когда я смотрю на адрес объектов страницы в дереве структуры и сравниваю их с адресами, они никогда не совпадают. Строка, используемая в этом потоке "TTDPRINT (@"% d =>% p ", k + 1, dict);" печатает «dict» как указатель в памяти ... нет никаких оснований полагать, что возвращаемый объект будет таким же, как возвращенный куда-то еще .. они будут в разных местах в памяти!
Моя последняя надежда состояла в том, чтобы взглянуть на исходный код из инструмента "схемы" командной строки яблока [упомянутого в этой книге] (как [предложено в этой теме]), но я нигде не могу его найти.
Итог - кто-нибудь знает, как работает контуры PDF, или знает какой-то открытый исходный код (предпочтительно, target-c), который читает контуры PDF?
ARGG: здесь были размещены все виды ссылок, но, очевидно, новый пользователь может публиковать только одну ссылку за раз