Переглянути джерело

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);