Комментарии 16
в Sailfish Qt 5.6, QPdf для более поздних версий, если я правильно помню)

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

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

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

а я в надеждах найти что-то, что еще и писать умеет

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


Мне для виртуального принтера надо преобразовывать 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, или что там использует Ваш рендер. Скорость +-аналогична. Зато полный контроль над рендерингом. Вывод гораздо быстрей, поскольку можно гнать сразу в опенгль текстуру.
Если не секрет, то что используете для аналитики, рекламы и главное краш репортинга?
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Информация

Дата основания
Местоположение
Россия
Сайт
digdes.ru
Численность
201–500 человек
Дата регистрации

Блог на Хабре