【问题标题】:IOError: invalid mode: wb + reportlab + app engineIOError:无效模式:wb + reportlab + app engine
【发布时间】:2012-08-24 15:01:50
【问题描述】:

这是我第一次使用 ReportLab,我尝试制作简单的 pdf,但是当我尝试运行脚本时出现以下错误。

class ReportLabTest (webapp.RequestHandler):

    def get(self):
        c = canvas.Canvas("hello.pdf")
        c.translate(inch,inch)
        c.setFont("Helvetica", 80)
        c.setStrokeColorRGB(0.2,0.5,0.3)
        c.setFillColorRGB(1,0,1)
        c.rect(inch,inch,6*inch,9*inch, fill=1)
        c.rotate(90)
        c.setFillColorRGB(0,0,0.77)
        c.drawString(3*inch, -3*inch, "Hello World")
        c.showPage()
        c.save()
        self.write_response(c)
        self.response.headers['Content-Type'] = 'application/pdf'
        self.response.headers['Content-Disposition'] = 'filename=testpdf.pdf'

        return 

我得到的错误是:

Traceback (most recent call last):
  File "/home/ducos/google_appengine/google/appengine/ext/webapp/_webapp25.py", line 710, in \__call__
        handler.get(*groups)

  File "/home/ducos/workspace/MedeticWS/www/tests.py", line 572, in get
        c.save()

  File "/home/ducos/workspace/MedeticWS/reportlab/pdfgen/canvas.py", line 1123, in save
        self._doc.SaveToFile(self._filename, self)

  File "/home/ducos/workspace/MedeticWS/reportlab/pdfbase/pdfdoc.py", line 234, in SaveToFile
        f = open(filename, "wb")

  File "/home/ducos/google_appengine/google/appengine/tools/dev_appserver_import_hook.py", line 589, in __init__
        raise IOError('invalid mode: %s' % mode)

IOError: invalid mode: wb

感谢您的帮助。

【问题讨论】:

    标签: python google-app-engine reportlab


    【解决方案1】:

    根据之前的答案,您无法写入文件系统。但是,您可以提供类似设备的文件作为参数而不是文件名。来自画布源You may pass a file-like object to filename as an alternative to a string.

    因此,您可以创建一个 StringIO 对象,将其传递给 Canvas,然后调用可能会关闭设备的 save()(我对此不确定 - 见下文)。如果您还没有,请执行 showpage(),并为您的 response.write() 对 StringIO 对象执行 getvalue()。例如

    from StringIO import StringIO
    x = StringIO()
    c = canvas.Canvas(x)
    ... dostuff
    c.save()
    output = x.getvalue()
    self.write_response(output)
    

    刚刚检查过,如果提供了像句柄这样的文件,那么它不会调用close,所以save() 就可以了。

    【讨论】:

      【解决方案2】:

      无法写入 AppEngine 中的文件。因此,save() 方法在尝试打开文件进行写入时会失败。

      您可以使用getpdfdata() 方法并将其保存到数据存储或blobstore。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-29
        • 2011-10-05
        • 1970-01-01
        • 2014-10-11
        • 1970-01-01
        • 2015-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多