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

标签 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.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

关于python - PDF 响应在 Python 3 中损坏但在 Python 2 中有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35368352/

相关文章:

python - 将行放入带有 pandas 的列中的条件

Python 占用过多内存

python - 使用子模块 [discord.py] 中的命令与后台任务交互

python - 使用 fork 的 Flask github 存储库为 python 应用程序构建 Docker 镜像的问题

java - 自动与闭源 Windows XP 基于 GUI 的程序进行交互

javascript - 如何点击没有固定类别值的按钮?但它有一个固定的 'data-testid'

python-3.x - 经理和员工ID之间的python pandas递归查找

python - 在 Linux 上使用 discord.py 我得到错误 'Bot' object has no attribute 'join_voice_channel'

python - 在 before_app_request 中重定向

JavaScript 使用 Jinja 模板中呈现的数据引发 SyntaxError