python - Django View 使用 PyQt 将 URL 转换为 PDF

标签 python django qt django-views pyqt4

我正在尝试编写一个 Django View ,它将返回 URL 的 PDF。

我正在使用 PyQt webview.print 创建 PDF,但我不确定如何将 pdf 传递给 Django 响应,我尝试过 QBuffer 但我似乎无法正确执行。

到目前为止,这是我的观点:

def pdf(request):
    app = QApplication(sys.argv)

    bufferPdf = QBuffer()
    bufferPdf.open(QBuffer.ReadWrite)

    web = QWebView()
    web.load(QUrl("http://www.google.com")) #the desired url. 

    printer = QPrinter()
    printer.setPageSize(QPrinter.Letter)
    printer.setOrientation(QPrinter.Landscape);
    printer.setOutputFormat(QPrinter.PdfFormat)
    printer.setOutputFileName("file.pdf")

    def convertIt():
        web.print_(printer)
        print "Pdf generated"
        QApplication.exit()

    QObject.connect(web, SIGNAL("loadFinished(bool)"), convertIt)

    bufferPdf.seek(0)
    result = bufferPdf.readData(0)
    bufferPdf.close()

    sys.exit(app.exec_())

    response =  HttpResponse(result, mimetype='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=coupon.pdf'
    return response

提前致谢。

最佳答案

ekhumoro 接受的解决方案不正确。他为您提供了可以从命令行运行的代码,但永远无法在 Django View 中运行。

许多人已经注意到,将 Django 与 QT 线程应用程序结合起来并不容易,甚至可能完全不可能。您看到的错误是您尝试执行此操作时将看到的典型示例。

在我自己的项目中,我尝试了许多不同的组织和分组代码的排列,但从未找到解决方案。问题似乎是(我不是 QT 专家,所以如果有人有更多信息,请纠正我)事件驱动的 QT 应用程序(任何 WebKit 使用 QT 事件模型的应用程序)都是围绕有效的单例“QApplication”构建的。您无法控制该子应用程序何时退出以及何时收获其各种资源。因此,任何使用该库的多线程应用程序都需要非常仔细地管理其资源 - 在处理各种 Web 应用程序的过程中,您对这些资源的控制权为零。

一种可能的(困惑且不专业的)解决方案是创建一个接受命令行参数的脚本,然后从 Django 中作为官方子进程调用该脚本。您将使用临时文件进行输出,然后将其加载到您的应用程序中。无论发生什么读取事件,您只需清除磁盘上的文件即可。凌乱,但有效。

我个人很乐意听到任何人明确知道为什么这如此困难,或者知道正确的解决方案 - Stackoverflow 上实际上有几十个线程,其中关于如何解决这个问题的解释不正确或不完整......

关于python - Django View 使用 PyQt 将 URL 转换为 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22273033/

相关文章:

python - 如何通过python脚本获取 "Google Dictionary"的内容

Python/WebApp Google App Engine - 测试用户/通过 header

python - 使用用户输入来设置属性

python - django-taggit 自定义 'tag' 模型和 request.user

c++ - 使用 QML ListView 和 C++ QList<QObject*> 时如何实现过渡动画?

python - Pandas 系列中重复出现的子系列摘要

django - PyCharm:如何运行 syncdb 和 sql 命令?

python - Django SessionWizardView 在 Ajax 请求后 form_list 中缺少当前步骤

c++ - 将 QList<T> 存储在 QVariant 中并流式传输到 QDataStream?

c++ - 如何在不使用任何数据库的情况下制作动态注册表单?