0
Рейтинг

Трагичная история знакомства с poppler

Блог компании Digital DesignC++QtPDFРазработка под Sailfish OS
…Или как мы писали пилот приложения для ОС Sailfish с использованием poppler.

Год начался с занятной задачи — нашей команде нужно было за короткий срок собрать пилот приложения «Мобильное рабочее место руководителя» на ОС Sailfish. По сути, это мобильный клиент СЭД, т.е. он предназначен для работы с документами. Ну и конечно же, для работы с документами необходим pdf-reader. Но оказалось, что заставить его работать гладко не так-то просто. Но мы, можно сказать, справились (для прототипа, конечно). Как? Читайте под катом.

image

Из хорошего могу сказать, что pdf-reader, встроенный в операционную систему, — это просто замечательно, не нужно отдельно собирать. И «Аврора» (вроде как, это будущее «русское» название для труднопроизносимой «Sailfish Mobile OS Rus») этим похвастаться может, за что ей большое спасибо. Но всё-таки написать быстрое решение оказалось не так просто.

Poppler — библиотека для рендеринга pdf, встроенная в Sailfish, собственно, потому она и была выбрана для наших тёмных целей. Но только для написания прототипа, ибо лицензия GPL не позволит в будущем выпускать на нём коммерческий продукт. Да и, немного потрогав её, прихожу к выводу, что наверняка есть более удобные решения, но об этом чуть позже.

Рассказать хочется главным образом о двух основных проблемах, с которыми я столкнулась, пытаясь хоть что-то выжать из poppler в сжатые сроки. Предлагаю посмотреть видео, демонстрирующее работу приложения, которое получилось, прежде чем читать моё нытье.


Проблема номер раз


Видите красивую карусель? Это такой способ отображения документов по папкам — интуитивно понятный и простой для пользователя, позволяет быстро просматривать документы, детали по нему, прежде чем переходить непосредственно к чтению документа и согласованию. Нужен он для того, чтобы важные министры, подписывая свои очень важные документы, могли взор свой услаждать PathView.

PathView — замечательный инструмент, можно кучу всякой красоты понаделать. Но наша проблема заключается в делегате.

Рисовать первую страницу документа (превью документа на главном экране) в онлайн режиме, используя poppler, — идея так себе, ибо папки не кэшируются, и переход между ними начинает невероятно висеть, poppler рисует медленно. Точнее рендерит, рисует, конечно, QPainter.

Проблема решается просто, но совсем не изящно: рендерим превью при запуске приложения, сохраняем на устройство картинку и в итоге рисуем через QImage в делегате. И, честно говоря, как переписать это в более изящный вид, я пока не придумала.

Проблема номер два


Если пытаться нарисовать документ большого размера весь разом (страница, отображающая контент документа), он мало того, что делает это очень долго, так ещё и смазывает картинку. Думала, напутала с размерами, что документ рендерится в картинку маленького размера, а потом растягивает его на заданную величину, но нет, проверила всё по 100 раз. Пыталась делать картинку большего размера — всё то же самое. Да и мажет не как с потерей качества, а скорее, как будто провели рукой по свежим чернилам.

Это, конечно, решается все одним махом, нужно рисовать не целиком документ, а только текущую страницу и соседние, но не успела ещё этого сделать.

Итог


Poppler медленный и странный, но спасибо, что он есть. Сейчас хотим в рамках пилота реализовать графические и текстовые аннотации pdf, поэтому собираюсь переписать все это дело на другой библиотеке, это что-то невероятно мощное на первый взгляд, надеюсь, что заявленная функциональность действительности соответствует.

Если кто пробовал или знает решение более подходящее, буду максимально признательна за совет.
Теги:qtqmlc++sailfish ospopplerpdf
Хабы: Блог компании Digital Design C++ Qt PDF Разработка под Sailfish OS
+11
4,3k 12
Комментарии 16

Похожие публикации

Лучшие публикации за сутки

Информация

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

Блог на Хабре