Как стать автором
Обновить

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

Qt вроде с pdfium дружит, через QPdfDocument
в Sailfish Qt 5.6, QPdf для более поздних версий, если я правильно помню)

mupdf вроде самая быстрая из opensource библиотек, смотрели в ее сторону?

Смотрела мельком, кажется, она только читает, а я в надеждах найти что-то, что еще и писать умеет)
вполне себе пишет

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

Попробуйте посмотреть в сторону html. Потом уже генерировать pdf документ.
а я в надеждах найти что-то, что еще и писать умеет

Возможно мой опыт будет полезен.


Мне для виртуального принтера надо преобразовывать PDF-ы — сливать несколько страниц в одну, масштабировать, поворачивать страницы и.т.д.


Вначале я использовал poppler как для рендеринга, так и для чтения/преобразования PDF-ов. И если с рендерингом все более-менее хорошо, то с обработкой я натерпелся. Poppler имеет 2 API. Один публичный высокоуровневый, но он очень ограничен, по сути только отрисовать страницу и все. И второй низкоуровневый и полузакрытый, на сайте про него не написано, но во всех дистрибутивах есть пакеты с нужными заголовочными файлами. Вот этот API позволяет преобразовывать PDF-ы на уровне объектов. Публичного API мне не хватало, и я решил использовать низкоуровневый, ох и натерпелся я. Этот API очень запутанный и недокументированный. А главное он нестабильный, и может внезапно поменяться в минорной версии библиотеки. Добило меня когда KDE-шники взяли и добавили аргументы в функцию вообще без изменения версии. А т.к. проект опенсорсный, то мне надо поддерживать совместимость с несколькими версиями библиотек (от винтажной в Debian Stable, до модной в ArchLinux)


Тогда я плюнул, и написал свой велосипед, который позволяет читать менять и сохранять PDF-ы. Рендерю пока через poppler. Смотрел в сторону PDFium — выглядит обещающе, но ее нет в стандартный пакетах, а для вас, для закрытого проекта можно и собрать самому.

с pdfium все аналогично. В public только минимально рисующий функционал, все остальное спрятано. Зато можно делать почти все что угодно. Я пдф, через pdfium в набор QPainterPath складываю, а затем отрисовываю по мере необходимости. т.е. по существу и SVG и PDF и шрифты внутренне лежат в одном формате, миксуются, а затем сохраняются в результирующий PDF или SVG. Пришлось, правда, помучиться с многофокусными градиентами, но на 98% удалось получить однозначное соответствие. Да, и собирать pdfium из сырцов та еще песня. В Qt в стоке стоит сильно порезанный вариант
Я пдф, через pdfium в набор QPainterPath складываю, а затем отрисовываю по мере необходимости.

Не совсем понял, отдельные страницы складываете в QPainterPath, или куски одной страницы?
Если страницы целиком, то у меня немного другой подход. У меня минимальный квант, это отдельный PDF-ный объект. Я работаю с PDF на уровне исходного текстового документа. Т.е. перенумеровываю объекты в PDF-е, меняю тип пдфной страницы на пдфный Form и дописываю потом страницу, которая включает в себя эти Form-ы. Мне кажется это быстрее.


Если куски, то это круто! Я до таких высот еще не опускался. Мне вроде как и не надо, но было бы интересно.

Квантом является кривая(4точки) + fill + stroke(способы обводки и заливки) + матрица. Кроме того, шрифты описываются аналогично. Т.е. всю страницу, кроме растра можно описать списком этих структур QPainterPath + QBrush/QPen + QMatrix/QTransform. Аналогично c SVG и TTF/OTF. Т.е вы оперируете этим списком безотносительно источника (двигать, удалять, добавлять, крутить), а затем этот список сериализуете либо pdf либо в svg либо еще во что.
А как со скоростью? Это для подчеркиваний и выделений? Может быстрее будет накладывать поверх объекта страницы второй объект с выделениями?
Нет не для подчеркиваний и выделений. Для всего. Практически все в пдф представлено, в виде кривых (буквы в тексте, изображения(кроме растра), контуры, короче вообще всЁ). Соответсвенно, практически все можно представить в виде 4(3) точек и способа обводки/заливки получившегося контура. Глиф в шрифте, кстати имеет аналогичную структуру. В mupdf или pdfium все работает аналогично, просто за отрисовку полученных кривых отвечает, если мне память не изменяет — skia. т.е. в качестве системы отрисовки я использую нативный кьютовый QPainter, а не skia, или что там использует Ваш рендер. Скорость +-аналогична. Зато полный контроль над рендерингом. Вывод гораздо быстрей, поскольку можно гнать сразу в опенгль текстуру.
Если не секрет, то что используете для аналитики, рекламы и главное краш репортинга?
Если документы существуют только на сервере, можно серверный рендеринг использовать как здесь: elibsystem.ru/node/186, но от него текстовые pdf распухают и есть проблема при ресайзе (пользователь решил увеличить).

Если в pdf много изображений, рендеринг может подтормаживать, так что рендерить лениво — правильное решение.

А так если нужно с удобной корпоративной лицензией, то здесь стоит смотреть pdfium или apache pdfbox. Ну или покупать. Купить можно mupdf (или более старый ghostscript), но есть также коммерческие библиотеки на java.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий