Search code examples
pythonpyqtqtwebkitpdf.jsqtwebengine

How to render PDF using pdf.js viewer in PyQt?


I have tried adding the pdf.js viewer files in my project and it works in browsers like Chrome, Mozilla, Safari, etc, but it's not loading some pages in node-webkit and PyQt webkit.

I am trying to load the file using an iframe, like this:

<iframe src="/test/?file=/assets/pdf/example.pdf#page=3"> </iframe>

Solution

  • I've found this thread over at the Qt Forums, where thebeast44 posted a snippet of Qt code answering your question. My translation to python is below.

    You'll also need to unpack the res folder from the author's original code, I think he just modified the viewer... I've also attached said code here.

    from PyQt4 import QtCore
    from PyQt4 import QtGui
    from PyQt4 import QtNetwork
    from PyQt4 import QtWebKit
    
    
    class PDFViewer(QtWebKit.QWebView):
        pdf_viewer_page = 'res/pdf-viewer.html'
    
        def __init__(self, parent=None):
            super().__init__(parent)
            self.settings = QtWebKit.QWebSettings.globalSettings()
            self.settings.setAttribute(QtWebKit.QWebSettings.LocalContentCanAccessFileUrls, True )
            self.settings.setAttribute(QtWebKit.QWebSettings.LocalContentCanAccessRemoteUrls, True )
            self.settings.setAttribute(QtWebKit.QWebSettings.DeveloperExtrasEnabled, True )
            nam = QtNetwork.QNetworkAccessManager()
            page = QtWebKit.QWebPage(self)
            page.setNetworkAccessManager(nam)
            self.setPage(page)
            self.loadFinished.connect(self.onLoadFinish)
            self.setUrl(QtCore.QUrl(self.pdf_viewer_page))
    
        def onLoadFinish(self, success):
            if success:
                self.page().mainFrame().evaluateJavaScript("init();")
    
    
    if __name__ == '__main__':
        import sys
        app = QtGui.QApplication(sys.argv)
        viewer = PDFViewer(parent=None)
        viewer.show()
        sys.exit(app.exec_())