Russian Qt Forum
Сентябрь 21, 2024, 13:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как напечатать такое в PDF  (Прочитано 14087 раз)
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" затирается

Понятно, что при печати на живом принтере таких проблем можно избежать
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Декабрь 05, 2007, 14:48 »

А чем не устраивает QPainter?

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
elite05
Гость
« Ответ #2 : Декабрь 06, 2007, 14:42 »

А чем не устраивает QPainter?

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

Так понятно чем не устраивает. У класса QTextDocument есть метод print, а простого способа вставить разрыв страницы в нужном месте нет. Есть разница написать QTextDocument::print(&printer) или переделывать printpreview.cpp под свои нужды
Записан
elite05
Гость
« Ответ #3 : Декабрь 06, 2007, 14:51 »

А кто может, что-нибудь сказать про следующее:

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

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

Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Декабрь 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);

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
elite05
Гость
« Ответ #5 : Декабрь 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);

Записан
Krow
Гость
« Ответ #6 : Сентябрь 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 теги? просто нужны таблицы..
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 23.