Russian Qt Forum

Qt => Печать => Тема начата: elite05 от Декабрь 05, 2007, 13:43



Название: Как напечатать такое в PDF
Отправлено: elite05 от Декабрь 05, 2007, 13:43
При печати средствами QT с выводом в PDF возникла проблема,
как сделать перевод страницы (новую страницу) при печати в PDF?

Метод QTextDocument::print(&printer) печатает весь документ, содержащий параграфы, таблицы, рисунки и т.д, а вставку принудительного разрыва страницы не поддерживает

Метод QPrinter::newPage() работает только при отрисовке страниц через QPainter,
можно ли как нибудь напечатать QTextDocument с разрывами страниц,
не связываясь с QPainter

Создаю QPrinter и прочее

           QPrinter printer(QPrinter::HighResolution);
           printer.setOutputFileName("print.pdf");
           QTextDocument doc;
           QTextCursor cursor(&doc);

пытаюсь печатать

       for(int cnt=0;cnt<2;cnt++)
        {  cursor.insertText(tr("Новая страница %1").arg(cnt));
            cursor.insertBlock();
            doc.print(&printer);
            printer.newPage();
        }

В документ попадает только "Новая страница 1", а "Новая страница 0" затирается

Понятно, что при печати на живом принтере таких проблем можно избежать


Название: Re: Как напечатать такое в PDF
Отправлено: pastor от Декабрь 05, 2007, 14:48
А чем не устраивает QPainter?

Советую посмотреть в демке demos\textedit файлик printpreview.cpp, а именно методы PreviewView::paintEvent и PreviewView::paintPage. имхо, все понятно. Немножко остаеться доделать под свои нужды


Название: Re: Как напечатать такое в PDF
Отправлено: elite05 от Декабрь 06, 2007, 14:42
А чем не устраивает QPainter?

Советую посмотреть в демке demos\textedit файлик printpreview.cpp, а именно методы PreviewView::paintEvent и PreviewView::paintPage. имхо, все понятно. Немножко остаеться доделать под свои нужды

Так понятно чем не устраивает. У класса QTextDocument есть метод print, а простого способа вставить разрыв страницы в нужном месте нет. Есть разница написать QTextDocument::print(&printer) или переделывать printpreview.cpp под свои нужды


Название: Re: Как напечатать такое в PDF
Отправлено: elite05 от Декабрь 06, 2007, 14:51
А кто может, что-нибудь сказать про следующее:

в разделе  "Поддерживаемые комманды HTML" ("Supported HTML Subset") среди атрибутов CSS есть два "page-break-before" и "page-break-after"

Кто-нибудь их использовал? Или где можно посмотреть примеры использования атрибутов CSS при формировании документов Rich Text в Qt



Название: Re: Как напечатать такое в PDF
Отправлено: pastor от Декабрь 06, 2007, 15:10
Так понятно чем не устраивает. У класса QTextDocument есть метод print, а простого способа вставить разрыв страницы в нужном месте нет. Есть разница написать QTextDocument::print(&printer) или переделывать printpreview.cpp под свои нужды

Немножко разъясните... Если печатать вот так:

Код:
QPrinter printer(QPrinter::HighResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("print.pdf");

QTextDocument doc;
.....
doc->print(&printer);

Оно печатает только одну страницу или все сплошной страницей?


Название: Re: Как напечатать такое в PDF
Отправлено: elite05 от Декабрь 06, 2007, 15:40
Все, спасибо, уже сам разобрался.

Должно быть вот так:

           QPrinter printer(QPrinter::HighResolution);
           printer.setOutputFileName("print.pdf");
           QTextDocument doc;
           QTextCursor cursor(&doc);

и далее:

         QTextBlockFormat textFormat;

         for(int cnt=0;cnt<2;cnt++)
           {  // Печатаем страницу

               ...

               textFormat.setPageBreakPolicy(QTextFormat::PageBreak_AlwaysBefore);
               cursor.setBlockFormat(textFormat);
               
               cursor.insertText(tr("Новая страница %1").arg(cnt+1));
               cursor.insertBlock();

               textFormat.setPageBreakPolicy(QTextFormat::PageBreak_Auto);
               cursor.setBlockFormat(textFormat);
          }

        // Печатаем последнюю страницу

        ...

        doc.print(&printer);



Название: Re: Как напечатать такое в PDF
Отправлено: Krow от Сентябрь 30, 2008, 18:08
Тока не называть некропостером:
попытался сделать так..
cursor.insertText(text);
всё работает.
е асли как у меня методом insertHtml то insertBlock() не срабатывает в штмл.
Код:
		QTextCursor cursor(&textDocument);
QTextBlockFormat textFormat;
textFormat.setPageBreakPolicy(QTextFormat::PageBreak_AlwaysAfter);
cursor.setBlockFormat(textFormat);
cursor.insertHtml(html[0]);
if (html.count() > 0)
for (int cnt = 1; cnt < html.count(); cnt++)
{
cursor.insertBlock();
cursor.insertHtml(html[cnt]);
}
textDocument.print(&printer);
Как можно такое же реализовать используя html теги? просто нужны таблицы..