Russian Qt Forum

Qt => Печать => Тема начата: kostya2vntu от Июнь 18, 2012, 14:50



Название: Препроводительная ведомость, вывод на печать
Отправлено: kostya2vntu от Июнь 18, 2012, 14:50
Здравствуйте.

Возникла задача печатать из программы на Qt4 довольно сложный документ (в аттаче).
Сам документ в формате xlsx. Некоторые поля должны заполняться из программы.

Вопросы:
1. Можно ли програмно модифицировать файл и сразу выводить на печать (на компьютере клиента ексель может и не стоять).
2. Если делать всё "руками" - например, сверстать html и скормить QTextDocument, потом отдать на печать - как проще сделать?

Пробовал верстать html - слишком медленно. К тому же в Qt поддерживается не всё подмножество свойств CSS. И не ясно как оно будет на клиентских ПК - шрифты разные и т.п. (программа для Windows/Linux).


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: Patrin Andrey от Июнь 18, 2012, 15:53
Можно формировать html, грузить в QWebView и печатать.

Пробовал верстать html - слишком медленно.

Что значит медлено? Настолько медлено что этот процес занимает больше 1% времени от всей операции распечатать?



Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: kostya2vntu от Июнь 18, 2012, 15:57
Можно формировать html, грузить в QWebView и печатать.

Пробовал верстать html - слишком медленно.

Что значит медлено? Настолько медлено что этот процес занимает больше 1% времени от всей операции распечатать?



Медленно - в плане верстка занимает слишком много моего времени - много "мелочей" (центрирование текста, границы разной толщины, подчеркивания и т.д.) с которыми надо разбираться.


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: kostya2vntu от Июнь 18, 2012, 16:03
Можно формировать html, грузить в QWebView и печатать.

Код:
A QWebView can be printed onto a QPrinter using the print() function. This function is marked as a slot and can be conveniently connected to QPrintPreviewDialog's paintRequested() signal.

Как раз то что надо, спасибо. И с версткой проще будет чем при использовании обычного QTextDocument.


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: Patrin Andrey от Июнь 18, 2012, 17:28
По поводу вёрстки. Можно сделать готовый html а в местах, где надо что-то вставить, оставлять маркеры вида %@SomeFieldname@%, а при формировании просто читать весь шаблон, загонять его в QString и тупо replace ( "%@SomeFieldname@%", "Somevalue")


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: kostya2vntu от Июнь 18, 2012, 22:51
По поводу вёрстки. Можно сделать готовый html а в местах, где надо что-то вставить, оставлять маркеры вида %@SomeFieldname@%, а при формировании просто читать весь шаблон, загонять его в QString и тупо replace ( "%@SomeFieldname@%", "Somevalue")
Так и делаю.


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: kostya2vntu от Июнь 26, 2012, 12:59
Решил делать несколько другим способом.

1. Сформировать из шаблонов в экселе PDF-ки.
2. Преобразовать их в "формы" - добавить поля в которые можно будет програмно подставлять текст.
3. С помощью poppler заполнять поля, рендерить всё в изображение и выводить на печать.

плюсы: нет проблем с масштабированием на лист, не нужно тратить несколько дней на верстку, полное соответствие оригинальному "шаблону", проще поддерживать.
минусы: риск что вылезет какой-то "косяк", на что уйдет много времени; чтобы сделать "формы" - использую жутко платный Adobe Reader X (цена около $500) - триал версию, если всё получится - нужно будет найти что-то другое взамен ему.

Если всё получится - опишу решение здесь.


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: kostya2vntu от Июнь 26, 2012, 22:56
Собрал poppler под WindowsXP x32 и Qt 4.7 по этой инструкции - http://laconsigna.wordpress.com/2011/07/14/compiling-poppler-on-windows/
Правда убил на это около 5-ти часов - что-то не компилилось, чего-то не хватало, в двух местах код пришлось править. Свою инструкцию писать не буду - много было хаков, всего не вспомню.

Всё завелось, проблем с шрифтами нет, формы в пдф-ке отображаются корректно.


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: Patrin Andrey от Июнь 27, 2012, 08:14
А что вы будете делать, если придётся заполнять документ, в котором есть таблица, и в эту таблицу надо вставлять дополнительные строчки?


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: kostya2vntu от Июль 01, 2012, 16:30
А что вы будете делать, если придётся заполнять документ, в котором есть таблица, и в эту таблицу надо вставлять дополнительные строчки?
Тогда бы использовал QWebView и т.д. Но для текущей задачи быстрее будет имплементировать то решение, которое я выбрал.


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: CuteBunny от Июль 03, 2012, 16:17
ncreport?


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: kostya2vntu от Июль 03, 2012, 16:36
ncreport?
Уже смотрел на него, немного другая задача стоит, он плохо подходит - мне ведь нужно не создавать отчет, а заполнять уже готовую ведомость, при чем её внешний вид должен почти строго соответствовать образцу.


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: panAlexey от Июль 03, 2012, 16:47
http://code.google.com/p/unnstudioreport/
?


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: CuteBunny от Июль 03, 2012, 16:51
ncreport?
Уже смотрел на него, немного другая задача стоит, он плохо подходит - мне ведь нужно не создавать отчет, а заполнять уже готовую ведомость, при чем её внешний вид должен почти строго соответствовать образцу.


Так ncreport так и работает, создаете шаблон-ведомости в NCReport Designer, формат xml, подаете на него данные в виде параметров в runtime либо из базы данных.

Хотя дело, конечно, Ваше, я просто советую:)


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: kostya2vntu от Июль 03, 2012, 17:25
ncreport?
Уже смотрел на него, немного другая задача стоит, он плохо подходит - мне ведь нужно не создавать отчет, а заполнять уже готовую ведомость, при чем её внешний вид должен почти строго соответствовать образцу.


Так ncreport так и работает, создаете шаблон-ведомости в NCReport Designer, формат xml, подаете на него данные в виде параметров в runtime либо из базы данных.

Хотя дело, конечно, Ваше, я просто советую:)

Не хочу создавать с нуля шаблон ведомости в NCReport Designer. В данном случае с pdf проще - с экселя распечатал в пдф, потом вручную добавил поля для заполнения из программы (на что вчера потратил менее часа), и всё почти готово. И минимум проблем с оформлением и пропорциями.
+ Как бонус - если текст не помещается в поле, размер шрифта автоматически уменьшается.


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: kostya2vntu от Июль 05, 2012, 00:30
Б***, уже почти всё сделал, и грабли.
В "формах" не отображаются русские символы, какая-то трабла с poppler-qt4 и кодировками, либо шрифтами... два часа уже убил, решения пока нет.


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: kostya2vntu от Июль 05, 2012, 03:03
Скачал poppler-data, сделал так чтобы оно подхватилось (час искал с отладчиком куда-же его положить). Как результат - пропали предупреждения с лога, но текста всеравно нет :(


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: kostya2vntu от Июль 05, 2012, 03:05
Пока буду выводить вручную текст поверх QImage... хотя бы надежно. Осталось разобраться как подбирать размер шрифта чтобы текст помещался в заданное поле.


Название: Re: Препроводительная ведомость, вывод на печать
Отправлено: kostya2vntu от Июль 05, 2012, 03:06
Где то тут на форуме уже видел... повторю:
poppler - геморой еще тот.