Как получить данные оглавления (схемы) в формате PDF в iOS (iPad)? - PullRequest
8 голосов
/ 12 декабря 2010

Я создаю приложение для 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: здесь были размещены все виды ссылок, но, очевидно, новый пользователь может публиковать только одну ссылку за раз

1 Ответ

3 голосов
/ 13 января 2011

Результат 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;
  }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...