У нас была похожая проблема в WeasyPrint : cairo создает файлы PDF, но не поддерживает закладки / схемы или гиперссылки. В конце мы укусили пулю, прочитали PDF спецификацию и сделали это сами.
WeasyPrint's pdf.py имеет простой анализатор и средство записи PDF, которые могут добавлять / переопределять PDF-объекты к существующим документам. Он использует механизм «обновления» PDF и добавляется только в конец файла.
Этот модуль был создан только для внутреннего использования, но я открыт для его рефакторинга, чтобы его было проще использовать в других проектах.
Однако анализатор использует несколько ярлыков и не может проанализировать все действительные файлы PDF. Может потребоваться адаптация, если вывод PyPDF не так хорош, как вывод в Каире. Из строки документа модуля:
Вместо того, чтобы пытаться проанализировать любой действительный PDF, мы делаем некоторые предположения
для Каира, чтобы упростить код:
- Все переводы строк: '\ n', а не '\ r' или '\ r \ n'
- За исключением номера 0 (который всегда свободен), здесь нет "свободного" объекта.
- Большинство разделителей пробелов состоит из одного пробела 0x20.
- Объекты косвенного словаря не содержат '>>' в начале строки, кроме как для обозначения конца объекта, за которым следует 'endobj'. (В
другими словами, маркеры «>>» для под-словарей имеют отступ.)
- Дерево страниц плоское: все дочерние элементы корневого узла страницы являются объектами страницы, а не узлами дерева страниц.