…Или как мы писали пилот приложения для ОС Sailfish с использованием poppler.
Год начался с занятной задачи — нашей команде нужно было за короткий срок собрать пилот приложения «Мобильное рабочее место руководителя» на ОС Sailfish. По сути, это мобильный клиент СЭД, т.е. он предназначен для работы с документами. Ну и конечно же, для работы с документами необходим pdf-reader. Но оказалось, что заставить его работать гладко не так-то просто. Но мы, можно сказать, справились (для прототипа, конечно). Как? Читайте под катом.
Из хорошего могу сказать, что pdf-reader, встроенный в операционную систему, — это просто замечательно, не нужно отдельно собирать. И «Аврора» (вроде как, это будущее «русское» название для труднопроизносимой «Sailfish Mobile OS Rus») этим похвастаться может, за что ей большое спасибо. Но всё-таки написать быстрое решение оказалось не так просто.
Poppler — библиотека для рендеринга pdf, встроенная в Sailfish, собственно, потому она и была выбрана для наших тёмных целей. Но только для написания прототипа, ибо лицензия GPL не позволит в будущем выпускать на нём коммерческий продукт. Да и, немного потрогав её, прихожу к выводу, что наверняка есть более удобные решения, но об этом чуть позже.
Рассказать хочется главным образом о двух основных проблемах, с которыми я столкнулась, пытаясь хоть что-то выжать из poppler в сжатые сроки. Предлагаю посмотреть видео, демонстрирующее работу приложения, которое получилось, прежде чем читать моё нытье.
Видите красивую карусель? Это такой способ отображения документов по папкам — интуитивно понятный и простой для пользователя, позволяет быстро просматривать документы, детали по нему, прежде чем переходить непосредственно к чтению документа и согласованию. Нужен он для того, чтобы важные министры, подписывая свои очень важные документы, могли взор свой услаждать PathView.
PathView — замечательный инструмент, можно кучу всякой красоты понаделать. Но наша проблема заключается в делегате.
Рисовать первую страницу документа (превью документа на главном экране) в онлайн режиме, используя poppler, — идея так себе, ибо папки не кэшируются, и переход между ними начинает невероятно висеть, poppler рисует медленно. Точнее рендерит, рисует, конечно, QPainter.
Проблема решается просто, но совсем не изящно: рендерим превью при запуске приложения, сохраняем на устройство картинку и в итоге рисуем через QImage в делегате. И, честно говоря, как переписать это в более изящный вид, я пока не придумала.
Если пытаться нарисовать документ большого размера весь разом (страница, отображающая контент документа), он мало того, что делает это очень долго, так ещё и смазывает картинку. Думала, напутала с размерами, что документ рендерится в картинку маленького размера, а потом растягивает его на заданную величину, но нет, проверила всё по 100 раз. Пыталась делать картинку большего размера — всё то же самое. Да и мажет не как с потерей качества, а скорее, как будто провели рукой по свежим чернилам.
Это, конечно, решается все одним махом, нужно рисовать не целиком документ, а только текущую страницу и соседние, но не успела ещё этого сделать.
Poppler медленный и странный, но спасибо, что он есть. Сейчас хотим в рамках пилота реализовать графические и текстовые аннотации pdf, поэтому собираюсь переписать все это дело на другой библиотеке, это что-то невероятно мощное на первый взгляд, надеюсь, что заявленная функциональность действительности соответствует.
Если кто пробовал или знает решение более подходящее, буду максимально признательна за совет.
Год начался с занятной задачи — нашей команде нужно было за короткий срок собрать пилот приложения «Мобильное рабочее место руководителя» на ОС Sailfish. По сути, это мобильный клиент СЭД, т.е. он предназначен для работы с документами. Ну и конечно же, для работы с документами необходим pdf-reader. Но оказалось, что заставить его работать гладко не так-то просто. Но мы, можно сказать, справились (для прототипа, конечно). Как? Читайте под катом.
Из хорошего могу сказать, что pdf-reader, встроенный в операционную систему, — это просто замечательно, не нужно отдельно собирать. И «Аврора» (вроде как, это будущее «русское» название для труднопроизносимой «Sailfish Mobile OS Rus») этим похвастаться может, за что ей большое спасибо. Но всё-таки написать быстрое решение оказалось не так просто.
Poppler — библиотека для рендеринга pdf, встроенная в Sailfish, собственно, потому она и была выбрана для наших тёмных целей. Но только для написания прототипа, ибо лицензия GPL не позволит в будущем выпускать на нём коммерческий продукт. Да и, немного потрогав её, прихожу к выводу, что наверняка есть более удобные решения, но об этом чуть позже.
Рассказать хочется главным образом о двух основных проблемах, с которыми я столкнулась, пытаясь хоть что-то выжать из poppler в сжатые сроки. Предлагаю посмотреть видео, демонстрирующее работу приложения, которое получилось, прежде чем читать моё нытье.
Проблема номер раз
Видите красивую карусель? Это такой способ отображения документов по папкам — интуитивно понятный и простой для пользователя, позволяет быстро просматривать документы, детали по нему, прежде чем переходить непосредственно к чтению документа и согласованию. Нужен он для того, чтобы важные министры, подписывая свои очень важные документы, могли взор свой услаждать PathView.
PathView — замечательный инструмент, можно кучу всякой красоты понаделать. Но наша проблема заключается в делегате.
Рисовать первую страницу документа (превью документа на главном экране) в онлайн режиме, используя poppler, — идея так себе, ибо папки не кэшируются, и переход между ними начинает невероятно висеть, poppler рисует медленно. Точнее рендерит, рисует, конечно, QPainter.
Проблема решается просто, но совсем не изящно: рендерим превью при запуске приложения, сохраняем на устройство картинку и в итоге рисуем через QImage в делегате. И, честно говоря, как переписать это в более изящный вид, я пока не придумала.
Проблема номер два
Если пытаться нарисовать документ большого размера весь разом (страница, отображающая контент документа), он мало того, что делает это очень долго, так ещё и смазывает картинку. Думала, напутала с размерами, что документ рендерится в картинку маленького размера, а потом растягивает его на заданную величину, но нет, проверила всё по 100 раз. Пыталась делать картинку большего размера — всё то же самое. Да и мажет не как с потерей качества, а скорее, как будто провели рукой по свежим чернилам.
Это, конечно, решается все одним махом, нужно рисовать не целиком документ, а только текущую страницу и соседние, но не успела ещё этого сделать.
Итог
Poppler медленный и странный, но спасибо, что он есть. Сейчас хотим в рамках пилота реализовать графические и текстовые аннотации pdf, поэтому собираюсь переписать все это дело на другой библиотеке, это что-то невероятно мощное на первый взгляд, надеюсь, что заявленная функциональность действительности соответствует.
Если кто пробовал или знает решение более подходящее, буду максимально признательна за совет.