瀏覽代碼

fix crash when --header-html is specified

This was introduced in 80cbcc5, where the createPrinter() method
created the printer with an empty filename as output filename is
initialised in pagesLoaded() but it gets called prior to that.
This would result in a crash after the errors such as
    QWin32PrintEngine::initialize: OpenPrinter failed

Additionally, QPainter::begin() was not called for the printer
resulting in additional errors being printed.
Ashish Kulkarni 11 年之前
父節點
當前提交
974eedccd5
共有 2 個文件被更改,包括 13 次插入5 次删除
  1. 12 4
      src/lib/pdfconverter.cc
  2. 1 1
      src/lib/pdfconverter_p.hh

+ 12 - 4
src/lib/pdfconverter.cc

@@ -231,9 +231,17 @@ void PdfConverterPrivate::beginConvert() {
 // returns millimeters
 qreal PdfConverterPrivate::calculateHeaderHeight(PageObject & object, QWebPage & header) {
     typedef QPair<QWebElement, QString> p_t;
-    //settings::PdfObject & s = object.settings;
+
+    TempFile   tempObj;
+    QString    tempFile = tempObj.create(settings.outputFormat == "ps"?".ps":".pdf");
+
     QPainter * testPainter = new QPainter();
-    QPrinter * testPrinter = createPrinter();
+    QPrinter * testPrinter = createPrinter(tempFile);
+
+    if (!testPainter->begin(testPrinter)) {
+        emit out.error("Unable to write to temp location");
+        return 0.0;
+    }
 
     QWebPrinter wp(header.mainFrame(), testPrinter, *testPainter);
     qreal height = wp.elementLocation(header.mainFrame()->findFirstElement("body")).second.height();
@@ -244,7 +252,7 @@ qreal PdfConverterPrivate::calculateHeaderHeight(PageObject & object, QWebPage &
     return (height / PdfConverter::millimeterToPointMultiplier);
 }
 
-QPrinter * PdfConverterPrivate::createPrinter() {
+QPrinter * PdfConverterPrivate::createPrinter(const QString & tempFile) {
     QPrinter * printer = new QPrinter(settings.resolution);
     if (settings.dpi != -1) printer->setResolution(settings.dpi);
     //Tell the printer object to print the file <out>
@@ -253,7 +261,7 @@ QPrinter * PdfConverterPrivate::createPrinter() {
         (settings.outputFormat == "ps" || (settings.outputFormat == "" && settings.out.endsWith(".ps", Qt::CaseInsensitive)))?
         QPrinter::PostScriptFormat : QPrinter::PdfFormat
         );
-    printer->setOutputFileName(lout);
+    printer->setOutputFileName(tempFile);
 
     if ((settings.size.height.first != -1) && (settings.size.width.first != -1)) {
         printer->setPaperSize(QSizeF(settings.size.width.first,settings.size.height.first + 100), settings.size.height.second);

+ 1 - 1
src/lib/pdfconverter_p.hh

@@ -169,7 +169,7 @@ private:
 	QWebPage * currentHeader;
 	QWebPage * currentFooter;
     qreal calculateHeaderHeight(PageObject & object, QWebPage & header);
-    QPrinter * createPrinter();
+    QPrinter * createPrinter(const QString & tempFile);
 
 	void handleTocPage(PageObject & obj);
 	void preprocessPage(PageObject & obj);