Создавайте места назначения для всех закладок в файле PDF с помощью iText API - PullRequest
7 голосов
/ 06 октября 2008

Я хотел бы написать некоторый (java) код, который принимает документ PDF и создает именованные места назначения из всех закладок. Я думаю, что iText API - это самый простой способ сделать это, но я никогда раньше не использовал API.

Как бы вы написали такой код с помощью iText API? Может ли iText выполнить синтаксический анализ, необходимый для самостоятельного управления существующими PDF-файлами? Виды манипуляций, о которых я думаю:

  • Открыто,
  • Поиск закладок,
  • Создание направлений,
  • Сохранить,
  • Закрыть.

Или есть другой API, который был бы лучше?

Ответы [ 2 ]

5 голосов
/ 07 октября 2008

Продолжение: несколько месяцев назад я отправил в iText патч (теперь он принят и является частью HEAD), который добавляет в iText возможности синтаксического анализа текста. У PdfBox (упомянутого ниже) есть (были?) Проблемы с чтением более новых PDF-файлов, которые используют потоки внешних ссылок вместо старого формата таблицы внешних ссылок.


Другая библиотека, которая является , очень хорошо разбирает существующие PDF-файлы: PdfBox Она также может использоваться для изменения существующего PDF. К вашему сведению - это анализатор текста, который использует Lucene.

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

Спецификация PDF большая, но по большей части удобочитаемая, и вам не нужно беспокоиться о ее объеме (который ориентирован на фактическое содержимое страницы и рендеринг), если все вы пытается сделать, это извлечь закладки.

3 голосов
/ 06 октября 2008

Я просто предупрежу вас заранее, что вы можете быть разочарованы этим. iText на самом деле не предназначен для использования в качестве парсера. Это действительно больше для создания совершенно новых документов PDF, но вы можете попробовать его.

Для начала, используя iText, вы не сможете изменить существующий документ PDF. Что вы можете сделать, тем не менее, это сделать копию с дополнительными функциями, которые вы хотите. (Если кто-то знает лучше, , пожалуйста, , дайте мне знать, это сводит меня с ума.)

Что вы захотите сделать, это создать объект PdfReader из входного потока в вашем исходном файле. Затем создайте объект PdfCopy (который является просто расширенным PdfWriter, который делает получение данных из существующего источника более удобным) для вашего пункта назначения.

Насколько я могу судить, закладки из iText вообще нельзя получить. Может понадобиться другая библиотека. Я думаю, что jpedal может иметь возможность извлекать их (он может получить их в виде XML-документа, который вам, возможно, придется проанализировать, чтобы получить то, что вы хотите.) Однако, если вы получите их, вы можете добавить их в java.util.List, и установите этот список как контур на PDFCopy. Сами закладки - это просто HashMaps с определенным набором ключей. Я не уверен, что все значения, но они включают в себя «Заголовок», «Действие» (который, кажется, где вы могли бы указать, что это именованный пункт назначения, хотя я не знаю, что это будет за значение ) и «URI» (который используется, если это внешняя ссылка - я подозреваю, что это будет указывать имя именованного места назначения, на которое вы ссылаетесь). Опять же, конкретику найти сложно.

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

Извините, я вам больше не помог. Удачи.

P.S. Если кто-нибудь еще знает о лучшем инструменте, лицензированном по лицензии (L) GPL или BSD, я бы хотел услышать об этом.

...