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)