Как сохранить сгенерированный PDF с Reportlab в хранилище данных в App Engine Python - PullRequest
7 голосов
/ 04 марта 2012

У меня есть метод, который генерирует файл PDF с использованием библиотеки Reportlab:

def obtenerPDFNuevoPedido(self, handler,rsUsuarioPedido, rsPedido):
    handler.response.headers['Content-Type'] = 'application/pdf'
    handler.response.headers['Content-Disposition'] = 'attachment; filename=output.pdf'
    story = []
    story.append(Paragraph('CHIPAS', ParagraphStyle(name="centeredStyle", alignment=TA_CENTER, fontSize=20)))
    story.append(Paragraph('____________ENLANUBE', ParagraphStyle(name="centeredStyle", alignment=TA_CENTER, fontSize=20)))
    story.append(Spacer(6, 22))
    story.append(Table([[Paragraph(str(strftime("%Y-%m-%d", gmtime())), ParagraphStyle(name="centeredStyle", alignment=TA_LEFT, fontSize=7)), 
    Paragraph(str(strftime("%H:%M:%S", gmtime())), ParagraphStyle(name="centeredStyle", alignment=TA_RIGHT, fontSize=7))]],colWidths=[5.05 * cm, 3.1 * cm]))
    story.append(Paragraph("DEVELOPED AT ROSHKA-LABS", ParagraphStyle(name="centeredStyle", alignment=TA_CENTER, fontSize=6)))
    story.append(Paragraph('-'*50, styleCentered))
    #...
    #...
    doc = SimpleDocTemplate(handler.response.out, pagesize=letter)
    doc.build(story) 

, когда я вызываю этот метод, он открывает диалоговое окно сохранения, где я могу указать, где файл должен быть сохранен.

Как мне сделать, чтобы сохранить сгенерированный файл PDF в хранилище данных?

Заранее спасибо!

1 Ответ

8 голосов
/ 04 марта 2012

1) Вы можете указать только желаемое имя файла (не место назначения)

2) Попробуйте это (не проверено)

#define your database structure
from google.appengine.ext import db

class PdfStorage(db.Model): 
   timeAdded = db.DateTimeProperty(auto_now_add=True)
   pdfContent = db.BlobProperty()

Замените

doc = SimpleDocTemplate(handler.response.out, pagesize=letter)
doc.build(story) 

с

pdf = StringIO()


doc = SimpleDocTemplate(pdf, pagesize=letter)
doc.build(story) 

#get content of generated pdf
content = pdf.getvalue()

#save to db
pdfStorage = PdfStorage(pdfContent = content);
pdfStorage.put()

#output to browser 
handler.response.write(content)
...