python python-2.7 pyqt pdf-generation qtwebkit

python - Imprimir página web de QtWebKit.webView a pdf PyQt4



python-2.7 pdf-generation (1)

Hola, lo que intento lograr es que tengo un QWidget con un QtWebKit.QWebView personalizado que muestra un sitio web en particular. Quiero guardar esa página web como un PDF usando Python y 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_())

Este es mi código actual, esto me permite guardar la página web como una imagen. Necesito guardar la página web de tal manera que pueda imprimirla en una hoja A4.

En este momento, la captura de pantalla de la página web es bastante larga (en altura) por lo que debe estar representada en más de una página.


Si desea guardar una página web como 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)

EDITAR :

Si está en Windows, es posible que pueda mejorar la calidad con:

printer = QtGui.QPrinter(QtGui.QPrinter.HighResolution)