2016-02-01 7 views
4

Я хочу создать PDF-документ с правильно оформленным HTML. Это то, что я пытаюсь:QPrinter не умеет правильно оформлять HTML-страницу для рендеринга изображения в PDF-документе

QTextDocument *doc = new QTextDocument(); 
const char* s1 = "<html><head><style>body { font-family: sans-serif;}.note-atomic { background: rgb(242,242,242); width: 1000px; margin: 5px auto; border: 1px solid grey; border-radius: 8px;padding: 5px;}</style></head><body><div class = 'note-atomic'>Hi</div><img src = '/Users/attitude/Desktop/RnSghvV.png' width='400' height='300' /></body></html>"; 
doc->setHtml(QString::fromStdString(s1)); 

QPrinter *printer = new QPrinter(); 
printer->setOutputFileName("/Users/attitude/Desktop/fool.pdf"); 
printer->setOutputFormat(QPrinter::PdfFormat); 

QPainter *painter = new QPainter(); 
painter->begin(printer); 
doc->drawContents(painter, printer->pageRect().translated(-printer->pageRect().x(), - printer->pageRect().y())); 
doc->print(printer); 

const char* s2 = "<html><body><div>Bye</div></body></html>"; 
doc->setHtml(QString::fromStdString(s2)); 

printer->newPage(); 
doc->drawContents(painter, printer->pageRect().translated(-printer->pageRect().x(), - printer->pageRect().y())); 

doc->print(printer); 
painter->end(); 

Я ожидаю, PDF, чтобы иметь 2 страницы - первый с текстом Hi, и следующий, и последний с текстом Bye. И первая страница в стиле, как он появляется в HTML-страницы с той же разметкой:

enter image description here

Однако первая страница PDF приходит с содержанием полностью перепутались:

enter image description here

Как мне выглядеть так, как ожидалось?

Изображение Я пытаюсь в HTML документ: http://imgur.com/RnSghvV

Platform - Qt 5.3.1, 32 бит. OS X Yosemite.

ответ

3

Это QTextDocument. Он предоставил богатый текст (это не HTML + CSS).

Доступные свойства и элементы, которые вы можете проверить на http://doc.qt.io/qt-5/richtext-html-subset.html (например, нет CSS свойство border для p или div).

Также вы можете увидеть, как это выглядит в Qt Designer, если вы поместили свой html-код в QTextEdit.

Для рендеринга HTML вы можете использовать QWebView (http://doc.qt.io/qt-5/qwebframe.html#print)

webview->mainFrame()->print(printer);

+0

Я попробовал, как вы сказали. Я получаю пустой pdf. Кстати, это должно быть 'webview-> page() -> mainFrame() -> print (printer);' ... – SexyBeast

+0

Хм это работает, контент асинхронно, поэтому мне нужно ждать сигнала 'loadFinished' и выполните печать в слот. У меня есть еще одна небольшая проблема, независимо от того, что я пытаюсь, 'Qprinter' разбивает страницы. Как я могу гарантировать, что существует только одна длинная страница, где все содержимое сбрасывается, а не страницы, разбивающиеся после каждого интервала A4? – SexyBeast

+0

Ничего, я исправился. Извинения, этот ответ должен был получить щедрость. Я сейчас сломался, поэтому не могу предложить больше щедрости. Когда я снова буду богат, я предлагаю этот ответ щедрую щедрость ... :) – SexyBeast

1

QTextDocument не является веб-браузером. Он не будет получать сетевые URL-адреса для вас. Вам необходимо добавить метод QVariant QTextDocument::loadResource(int type, const QUrl & name) к вашему QObject (QWidget is-a QObject!) И сделать QTextDocument дочерним элементом этого объекта. Экземпляр документа вызовет вашу реализацию loadResource, где вы можете использовать QNetworkAccessManager, чтобы сделать выборку.

Для этого, чтобы иметь возможность быть удобным, вы не можете блокировать сетевые запросы. Это достигается путем выполнения обработки дважды. Сначала просто обратите внимание на то, какие URL-адреса нужно загрузить и инициировать их выборку, возвращая пустой QVariant. Как только все сетевые запросы будут успешно завершены, и вы сохранили их в кеше, вы можете повторно запустить тот же код, и он будет правильно отображать страницу и не будет блокировать доступ к сети.

Все это должно выполняться асинхронно.

+0

Умм, нет, нет. В коде я делал это, загружая изображение только с диска. Я дал его только для того, чтобы каждый мог сразу увидеть URL. Изменение кода. Текущий код - это то, что я на самом деле пытался и получил указанный результат. Благодарю. – SexyBeast

+0

@AttitudeMonger Ваш html не использует действительные URL-адреса сейчас. Кроме того, как только вы исправите его для использования правильных URL-адресов файлов, убедитесь, что они являются абсолютными путями. –

+0

О, ладно. Они были там, в том же месте, что и исполняемый файл. Я даже пытался дать абсолютный путь, как недавно отредактированный вопрос. Тот же результат. – SexyBeast

 Смежные вопросы

  • Нет связанных вопросов^_^