Frage

Hi what i'am trying to accomplish is that, i have a QWidget with a custom QtWebKit.QWebView which displays a particular website. I want to save that web page as a pdf using python and PyQt.

from PyQt4 import QtCore, QtGui
from PyQt4 import QtWebKit
from Save_Evidence import *
import sys

##### Custom WebView #############
class Browser(QtWebKit.QWebView):

    def __init__(self,parent =None):
        QtWebKit.QWebView.__init__(self,parent)
        self.loadFinished.connect(self._result_available)

    def _result_available(self, ok):
    frame = self.page().mainFrame()
    self.html = unicode(frame.toHtml()).encode('utf-8')

#################################



try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Form(QtGui.QWidget):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(640, 480)
        self.gridLayout = QtGui.QGridLayout(Form)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.verticalLayout = QtGui.QVBoxLayout()
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.webView = Browser(Form)
        self.webView.setUrl(QtCore.QUrl(_fromUtf8("https://malwr.com/submission/")))
        self.webView.setObjectName(_fromUtf8("webView"))
        self.verticalLayout.addWidget(self.webView)
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.pushButton = QtGui.QPushButton(Form)
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.pushButton.setDisabled(True)
        self.horizontalLayout.addWidget(self.pushButton)
        self.buttonBox = QtGui.QDialogButtonBox(Form)
        self.buttonBox.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel)
        self.buttonBox.setCenterButtons(False)
        self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
        self.horizontalLayout.addWidget(self.buttonBox)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)

        self.retranslateUi(Form)
        QtCore.QObject.connect(self.pushButton , QtCore.SIGNAL("clicked()") , self.saveReport)
        QtCore.QObject.connect(self.webView , QtCore.SIGNAL(" loadFinished (bool)") , self.printIt)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Malwr.com", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("Form", "Save Report", None, QtGui.QApplication.UnicodeUTF8))



    def printIt(self, val):   
        if str(self.webView.url().toString()).find("https://malwr.com/analysis/") == 0:
            xpage = self.webView.page()
            self.HTML = unicode(xpage. currentFrame().toHtml()).encode('utf-8')
            f =xpage. currentFrame().contentsSize()
            self.pushButton.setEnabled(True)

    def saveReport(self):
        self.webView.page().setViewportSize(xpage. currentFrame().contentsSize())
        image = QtGui.QImage(self.webView.page().viewportSize(),QtGui.QImage.Format_ARGB32)
        painter = QtGui.QPainter(image)
        self.webView.page().mainFrame().render(painter)
        painter.end()
        image.save(QtCore.QString("output-report"),"png")
        output = QtCore.QFile()
        output.open(1, QtCore.QIODevice.WriteOnly)
        image.save(output, 'PNG')




class MyForm(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
            self.ui = Ui_Form()
            self.ui.setupUi(self)


if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyForm()
    myapp.show()
    sys.exit(app.exec_())

This is my existing code this allows me to save the web page as an image. i need to save the web page in such a manner, that i can print it onto a A4 sheet.

Right now the screenshot of the web page is quite long (in height) so it must be represented on more than one page.

War es hilfreich?

Lösung

If you want to save a web-page as pdf, use QPrinter:

    printer = QtGui.QPrinter()
    printer.setPageSize(QtGui.QPrinter.A4)
    printer.setColorMode(QtGui.QPrinter.Color)
    printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
    printer.setOutputFileName('report.pdf')
    self.page().mainFrame().print_(printer)

EDIT:

If you're on Windows, you might be able to improve the quality with:

    printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top