2012-08-24 28 views
0

這是我第一次使用ReportLab,我試圖製作簡單的pdf,但遇到以下錯誤,當我嘗試運行腳本時。IO錯誤:無效模式:wb + reportlab +應用程序引擎

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 

感謝你的幫助。

回答

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()就可以了。

1

無法寫入AppEngine中的文件。因此,save()方法在嘗試打開文件進行寫入時失敗。

您可以使用getpdfdata()方法並將其保存到數據存儲區或Blob存儲區。

相關問題