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

Mik*_*ike 4 python fpdf flask python-3.x

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

\n\n

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

\n\n

这是下载功能:

\n\n
@mod.route(\'/get_invoice/<invoice_id>\')\ndef get_invoice(invoice_id):\n    invoice = Invoices.query.filter_by(id=invoice_id).all()\n\n    pdf_generator = PDFInvoice(invoice)\n    pdf = pdf_generator.new()\n\n    response = make_response(pdf.output(dest=\'S\'))\n    response.headers[\'Content-Disposition\'] = \'attachment; filename="invoice.pdf"\'\n    response.headers[\'Content-Type\'] = \'application/pdf\'\n\n    return response\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
x\xef\xbf\xbd3R\xef\xbf\xbd\xef\xbf\xbd2\xef\xbf\xbd35W(\xef\xbf\xbdr\nQ\xef\xbf\xbdw3T\xef\xbf\xbd\xef\xbf\xbd30P^HISp^M^A\xef\xbf\xbd^X^[\xef\xbf\xbd^YZ*\xef\xbf\xbd^[^Z\xef\xbf\xbd^Y\xef\xbf\xbd*\xef\xbf\xbd\xef\xbf\xbd(h\xef\xbf\xbde^Vg\xef\xbf\xbd(\xef\xbf\xbd^V+$\xef\xbf\xbd(\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbde\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xe5\xa5\x96h*\xef\xbf\xbdd\xef\xbf\xbd\xef\xbf\xbd^@^@\xef\xbf\xbdv^T\xef\xbf\xbd\n
Run Code Online (Sandbox Code Playgroud)\n\n

进入这个(损坏的PDF):

\n\n
x^\xc3\x9c3R\xc3\xb0\xc3\xa22\xc3\x9035W(\xc3\xa7r\nQ\xc3\x90w3T\xc2\xb0\xc3\x9430P^HISp^M^A^\xc3\x89^X^[\xc3\xa8^YZ*^\xc3\x98^[^Z\xc3\xaa^Y^\xc3\x9b*^\xc3\x84\xc2\xa4(h^\xc3\x84e^Vg^\xc3\x96(^\xc3\x94^V+$^\xc3\x96(^\xc3\x94^\xc3\x97^\xc3\x97\xc3\xabe\xc2\xa7\xc3\xa6^\xc3\x95\xc3\xa8\xc3\xa5\xc2\xa5^\xc3\x96h*^\xc3\x84d^\xc3\x81\xc3\xb4^@^@\xc3\xb8v^T\xc3\x82\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

dav*_*ism 5

FPDF 输出 a str,在 Python 2 中基本上相当于bytes,但在 Python 3 中是 unicode,而不是字节。 直接来自文档:

如果您使用的是 Python 3.x,则必须使用 Python 3.xpdf.output(dest='S').encode('latin-1')才能获得输出,如果不这样做,生成的 PDF 将无效