PDF响应在Python3中已损坏,但在Python2中可用

PDF响应在Python3中已损坏,但在Python2中可用,python,python-3.x,flask,fpdf,Python,Python 3.x,Flask,Fpdf,我用python2.7和Flask编写了一个工作应用程序。它所做的一件事就是下载PDF发票。很好用 现在我正在做一个新的应用程序,它也允许下载PDF发票,但这次我使用的是Python3。我可以将文件保存到服务器并获得一个完美工作的PDF,但如果我尝试将其发送到浏览器,则生成的文件已损坏 以下是下载功能: @mod.route('/get_invoice/<invoice_id>') def get_invoice(invoice_id): invoice = Invoices

我用python2.7和Flask编写了一个工作应用程序。它所做的一件事就是下载PDF发票。很好用

现在我正在做一个新的应用程序,它也允许下载PDF发票,但这次我使用的是Python3。我可以将文件保存到服务器并获得一个完美工作的PDF,但如果我尝试将其发送到浏览器,则生成的文件已损坏

以下是下载功能:

@mod.route('/get_invoice/<invoice_id>')
def get_invoice(invoice_id):
    invoice = Invoices.query.filter_by(id=invoice_id).all()

    pdf_generator = PDFInvoice(invoice)
    pdf = pdf_generator.new()

    response = make_response(pdf.output(dest='S'))
    response.headers['Content-Disposition'] = 'attachment; filename="invoice.pdf"'
    response.headers['Content-Type'] = 'application/pdf'

    return response
此文件(已损坏的PDF):


pdf的其余数据是文本字符串,它们看起来没有变化。因此,这似乎是某个地方的编码问题。

FPDF输出一个
str
,在Python2中基本上相当于
字节,但在Python3中是unicode,而不是字节

如果您使用的是Python3.x,则必须使用
pdf.output(dest='S').encode('latin-1')
才能获得输出,否则生成的pdf将无效


胡乱猜测:如果这是由于响应的编码造成的呢。您是否需要在内容类型中指定它?我查阅了Flask文档,它说默认情况下使用UTF-8…我已经用更多信息更新了我的问题。它似乎在正确的轨道上。了解
pdf.output(dest='S')
生成的内容将非常有用。可能应该是
字节
,但如果是
str
,则会解释编码问题
x�3R��2�35W(�r
Q�w3T��30P^HISp^M^A�^X^[�^YZ*�^[^Z�^Y�*��(h�e^Vg�(�^V+$�(����e����奖h*�d��^@^@�v^T�
x^Ü3Rðâ2Ð35W(çr
QÐw3T°Ô30P^HISp^M^A^É^X^[è^YZ*^Ø^[^Zê^Y^Û*^Ĥ(h^Äe^Vg^Ö(^Ô^V+$^Ö(^Ô^×^×ëe§æ^Õèå¥^Öh*^Äd^Áô^@^@øv^TÂ