![](/img/trans.png)
[英]QPrinter output to pdf is not equivalent to the paper/page size (A4)
[英]QPrinter unable to style HTML page properly to render image in PDF document
我想創建一個具有正確樣式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有兩頁 - 第一頁有文字Hi ,下一頁和最后一頁有文字再見 。 第一個頁面樣式顯示在具有相同標記的HTML頁面中:
但是,PDF的第一頁出現的內容完全搞砸了:
如何讓它看起來像預期的那樣?
我正在HTML文檔中嘗試的圖像: http : //imgur.com/RnSghvV
平台 - Qt 5.3.1,32位。 OS X Yosemite。
這是QTextDocument
。 它呈現了豐富的文本(它不是HTML + CSS)。
您可以在http://doc.qt.io/qt-5/richtext-html-subset.html上查看可用的屬性和元素(例如, p
或div
沒有css屬性border
)。
如果你把你的html代碼放到QTextEdit
,你也可以看到它在Qt Designer中的外觀。
要呈現HTML,您可以使用QWebView
( http://doc.qt.io/qt-5/qwebframe.html#print )
webview->mainFrame()->print(printer);
QTextDocument
不是Web瀏覽器。 它不會為您獲取網絡URL。 您需要將QVariant QTextDocument::loadResource(int type, const QUrl & name)
方法添加到QObject
( QWidget
is-a QObject
!),並使QTextDocument
成為該對象的子級。 文檔實例將調用loadResource
的實現,您可以在其中利用QNetworkAccessManager
進行提取。
為了使用戶友好,您無法阻止網絡請求。 這是通過兩次處理來完成的。 首先,只需記下要加載的URL並啟動它們的提取,返回一個空的QVariant
。 一旦所有網絡請求成功完成並且您已將它們存儲在緩存中,您就可以重新運行相同的代碼,它將正確呈現頁面,並且不會阻止網絡訪問。
所有這一切都必須異步完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.