Создание контуров / оглавления для существующего PDF в Python - PullRequest
7 голосов
/ 28 мая 2011

Я использую pyPdf для объединения нескольких файлов PDF в один.Это прекрасно работает, но мне также нужно добавить оглавление / схемы / закладки в создаваемый файл PDF.

pyPdf, похоже, поддерживает только чтение контуров.Reportlab позволил бы мне создавать их, но версия с открытым исходным кодом не поддерживает загрузку файлов PDF, поэтому не удается добавить контуры в существующий файл.

Есть ли способ добавить контуры в существующийPDF с использованием Python или любой другой библиотеки, которая позволила бы это?

Ответы [ 2 ]

2 голосов
/ 27 июля 2012

У нас была похожая проблема в WeasyPrint : cairo создает файлы PDF, но не поддерживает закладки / схемы или гиперссылки. В конце мы укусили пулю, прочитали PDF спецификацию и сделали это сами.

WeasyPrint's pdf.py имеет простой анализатор и средство записи PDF, которые могут добавлять / переопределять PDF-объекты к существующим документам. Он использует механизм «обновления» PDF и добавляется только в конец файла.

Этот модуль был создан только для внутреннего использования, но я открыт для его рефакторинга, чтобы его было проще использовать в других проектах.

Однако анализатор использует несколько ярлыков и не может проанализировать все действительные файлы PDF. Может потребоваться адаптация, если вывод PyPDF не так хорош, как вывод в Каире. Из строки документа модуля:

Вместо того, чтобы пытаться проанализировать любой действительный PDF, мы делаем некоторые предположения для Каира, чтобы упростить код:

  • Все переводы строк: '\ n', а не '\ r' или '\ r \ n'
  • За исключением номера 0 (который всегда свободен), здесь нет "свободного" объекта.
  • Большинство разделителей пробелов состоит из одного пробела 0x20.
  • Объекты косвенного словаря не содержат '>>' в начале строки, кроме как для обозначения конца объекта, за которым следует 'endobj'. (В другими словами, маркеры «>>» для под-словарей имеют отступ.)
  • Дерево страниц плоское: все дочерние элементы корневого узла страницы являются объектами страницы, а не узлами дерева страниц.
0 голосов
/ 24 января 2019

Похоже, что PyPDF2 может сделать эту работу.См. Метод addBookmark в документации: https://pythonhosted.org/PyPDF2/PdfFileMerger.html

...