PDF 响应在 Python 3 中损坏但在 Python 2 中有效

PDF response is corrupted in Python 3 but works in Python 2

我在 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

这与旧版 Python2.7 应用程序中的工作功能几乎相同。

为了扩展,它正在转换这个(工作 PDF):

x�3R��2�35W(�r
Q�w3T��30P^HISp^M^A�^X^[�^YZ*�^[^Z�^Y�*��(h�e^Vg�(�^V+$�(����e����奖h*�d��^@^@�v^T�

进入此(损坏的 PDF):

x^Ü3Rðâ2Ð35W(çr
QÐw3T°Ô30P^HISp^M^A^É^X^[è^YZ*^Ø^[^Zê^Y^Û*^Ĥ(h^Äe^Vg^Ö(^Ô^V+$^Ö(^Ô^×^×ëe§æ^Õèå¥^Öh*^Äd^Áô^@^@øv^TÂ

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

FPDF 输出一个 str,在 Python 2 中基本上等同于 bytes,但在 Python 3 中是 unicode,而不是字节。 Straight from the docs:

If you are using Python 3.x you have to use pdf.output(dest='S').encode('latin-1') in order to get the output, if you don't do so the generated PDF will be invalid