浏览代码

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
 // returns millimeters
 qreal PdfConverterPrivate::calculateHeaderHeight(PageObject & object, QWebPage & header) {
 qreal PdfConverterPrivate::calculateHeaderHeight(PageObject & object, QWebPage & header) {
     typedef QPair<QWebElement, QString> p_t;
     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();
     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);
     QWebPrinter wp(header.mainFrame(), testPrinter, *testPainter);
     qreal height = wp.elementLocation(header.mainFrame()->findFirstElement("body")).second.height();
     qreal height = wp.elementLocation(header.mainFrame()->findFirstElement("body")).second.height();
@@ -244,7 +252,7 @@ qreal PdfConverterPrivate::calculateHeaderHeight(PageObject & object, QWebPage &
     return (height / PdfConverter::millimeterToPointMultiplier);
     return (height / PdfConverter::millimeterToPointMultiplier);
 }
 }
 
 
-QPrinter * PdfConverterPrivate::createPrinter() {
+QPrinter * PdfConverterPrivate::createPrinter(const QString & tempFile) {
     QPrinter * printer = new QPrinter(settings.resolution);
     QPrinter * printer = new QPrinter(settings.resolution);
     if (settings.dpi != -1) printer->setResolution(settings.dpi);
     if (settings.dpi != -1) printer->setResolution(settings.dpi);
     //Tell the printer object to print the file <out>
     //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)))?
         (settings.outputFormat == "ps" || (settings.outputFormat == "" && settings.out.endsWith(".ps", Qt::CaseInsensitive)))?
         QPrinter::PostScriptFormat : QPrinter::PdfFormat
         QPrinter::PostScriptFormat : QPrinter::PdfFormat
         );
         );
-    printer->setOutputFileName(lout);
+    printer->setOutputFileName(tempFile);
 
 
     if ((settings.size.height.first != -1) && (settings.size.width.first != -1)) {
     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);
         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 * currentHeader;
 	QWebPage * currentFooter;
 	QWebPage * currentFooter;
     qreal calculateHeaderHeight(PageObject & object, QWebPage & header);
     qreal calculateHeaderHeight(PageObject & object, QWebPage & header);
-    QPrinter * createPrinter();
+    QPrinter * createPrinter(const QString & tempFile);
 
 
 	void handleTocPage(PageObject & obj);
 	void handleTocPage(PageObject & obj);
 	void preprocessPage(PageObject & obj);
 	void preprocessPage(PageObject & obj);