2014-03-12 52 views
3

嗨,我试图完成的是,我有一个QWidget与显示特定网站的自定义QtWebKit.QWebView。我想使用python和PyQt将该网页保存为pdf。从QtWebKit.webView打印网页到pdf PyQt4

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_()) 

这是我现有的代码,它允许我将网页保存为图像。我需要以这种方式保存网页,以便将其打印到A4纸上。

现在网页的屏幕截图很长(高度),所以它必须在多个页面上显示。

回答

4

如果你想保存网页为PDF格式,请使用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) 

编辑

如果您使用的是Windows,你也许能够提高质量:

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

谢谢。 顺便说一下,当我打开由代码生成的report.pdf,它是一种模糊,它需要我近200%的缩放,使文本更清晰一点。任何想法如何解决这个问题。 – TheCreator232

+0

@ thecreator232。我尝试了几个随机页面,没有得到任何明显的模糊。如果您使用的是Windows,我的答案中增加了一个可能的解决方案。 – ekhumoro

+1

@TheCreator232:我已经尝试了两种方法,保存为PNG并保存为PDF格式。在我看来,最好使用保存到PNG结果,然后 - 以某种方式 - 将长PNG分割成PNG,然后将它们组合起来以创建多页PDF。这将创建一个像素完美的屏幕捕捉结果(这实际上是我的意图) 感谢这篇文章! – swdev