0

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

助けてくれてありがとう。

4

2 に答える 2

2

以前の回答によると、ファイルシステムに書き込むことはできません。ただし、ファイル名の代わりにデバイスのようなファイルを引数として指定できます。キャンバスのソースから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()

于 2012-08-25T00:45:06.823 に答える
1

AppEngine でファイルに書き込むことはできません。したがって、save()書き込み用にファイルを開こうとすると、メソッドは失敗します。

メソッドを使用して、getpdfdata()それをデータストアまたはブロブストアに保存できます。

于 2012-08-24T16:54:25.287 に答える