Convertir html a pdf usando Python Flask

Aquí está mi código en myclass.py

class Pdf(): def render_pdf(self,name,html): from xhtml2pdf import pisa from StringIO import StringIO pdf = StringIO() pisa.CreatePDF(StringIO(html), pdf) return pdf 

Y lo estoy llamando en api.py asi

 @app.route('/invoice//', methods=['GET']) def view_invoice(business_name,tin): #pdf = StringIO() html = render_template('certificate.html', business_name=business_name,tin=tin) file_class = Pdf() pdf = file_class.render_pdf(business_name,html) return pdf 

Pero arroja este error.

 AttributeError: StringIO instance has no __call__ method 

El siguiente guión funcionó bien para mí. Tenga en cuenta los cambios que hice:

  • Pdf.render_pdf() ahora devuelve pdf.getvalue() , un str .
  • view_invoice() ahora devuelve una tupla, de modo que se puede establecer el encabezado Content-Type.
 #!/usr/bin/env python from flask import Flask, render_template app = Flask(__name__) class Pdf(): def render_pdf(self, name, html): from xhtml2pdf import pisa from StringIO import StringIO pdf = StringIO() pisa.CreatePDF(StringIO(html), pdf) return pdf.getvalue() @app.route('/invoice//', methods=['GET']) def view_invoice(business_name, tin): #pdf = StringIO() html = render_template( 'certificate.html', business_name=business_name, tin=tin) file_class = Pdf() pdf = file_class.render_pdf(business_name, html) headers = { 'content-type': 'application.pdf', 'content-disposition': 'attachment; filename=certificate.pdf'} return pdf, 200, headers if __name__ == '__main__': app.run(debug=True)