Создайте пункты назначения для всех закладок в PDF-файле с помощью API iText

#pdf #pdf-generation #itext #bookmarks #tagged-pdf

Вопрос:

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

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

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

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

Ответ №1:

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


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

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

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

Ответ №2:

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

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

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

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

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

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

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

Комментарии:

1. Спасибо, этого мне достаточно, чтобы двигаться дальше.