QPrinter 无法正确设置 HTML 页面样式以在 PDF 文档中呈现图像
QPrinter unable to style HTML page properly to render image in PDF document
我想创建一个样式正确的 PDF 文档 HTML。这就是我正在尝试的:
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 页面中一样:
但是,PDF 的第一页内容完全乱七八糟:
如何让它看起来像预期的那样?
我在 HTML 文档中尝试的图像:http://imgur.com/RnSghvV
平台 - Qt 5.3.1,32 位。 OS X Yosemite.
QTextDocument
不是网络浏览器。它不会为您获取网络 URL。您需要向 QObject
添加一个 QVariant QTextDocument::loadResource(int type, const QUrl & name)
方法(QWidget
是一个 QObject
!),并使 QTextDocument
成为该对象的子对象。文档实例将调用您的 loadResource
实现,您可以在其中利用 QNetworkAccessManager
进行提取。
为了让这有任何用户友好的机会,您不能阻止网络请求。这是通过执行两次处理来完成的。首先简单地记下要加载的 URL 并启动它们的提取,返回一个空的 QVariant
。成功完成所有网络请求并将它们存储在缓存中后,您可以重新运行相同的代码,它将正确呈现页面并且不会阻止网络访问。
所有这些都必须异步完成。
这是QTextDocument
。它呈现富文本(它不是 HTML + CSS)。
您可以检查 http://doc.qt.io/qt-5/richtext-html-subset.html 的可用属性和元素(例如,p
或 [=13= 没有 css 属性 border
]).
如果将 html 代码放入 QTextEdit
,您还可以在 Qt Designer 中看到它的外观。
渲染 HTML 你可以使用 QWebView
(http://doc.qt.io/qt-5/qwebframe.html#print)
webview->mainFrame()->print(printer);
我想创建一个样式正确的 PDF 文档 HTML。这就是我正在尝试的:
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 页面中一样:
但是,PDF 的第一页内容完全乱七八糟:
如何让它看起来像预期的那样?
我在 HTML 文档中尝试的图像:http://imgur.com/RnSghvV
平台 - Qt 5.3.1,32 位。 OS X Yosemite.
QTextDocument
不是网络浏览器。它不会为您获取网络 URL。您需要向 QObject
添加一个 QVariant QTextDocument::loadResource(int type, const QUrl & name)
方法(QWidget
是一个 QObject
!),并使 QTextDocument
成为该对象的子对象。文档实例将调用您的 loadResource
实现,您可以在其中利用 QNetworkAccessManager
进行提取。
为了让这有任何用户友好的机会,您不能阻止网络请求。这是通过执行两次处理来完成的。首先简单地记下要加载的 URL 并启动它们的提取,返回一个空的 QVariant
。成功完成所有网络请求并将它们存储在缓存中后,您可以重新运行相同的代码,它将正确呈现页面并且不会阻止网络访问。
所有这些都必须异步完成。
这是QTextDocument
。它呈现富文本(它不是 HTML + CSS)。
您可以检查 http://doc.qt.io/qt-5/richtext-html-subset.html 的可用属性和元素(例如,p
或 [=13= 没有 css 属性 border
]).
如果将 html 代码放入 QTextEdit
,您还可以在 Qt Designer 中看到它的外观。
渲染 HTML 你可以使用 QWebView
(http://doc.qt.io/qt-5/qwebframe.html#print)
webview->mainFrame()->print(printer);