python - 使用 Wea​​syprint 创建文件响应

标签 python django pdf weasyprint

我正在使用 Django 制作一个与吉他和弦表相关的 Web 应用程序。其中一项功能是能够从和弦表生成 PDF 并下载。我正在使用 Wea​​syprint 生成 PDF,但遇到一个问题,该 View 没有下载文件,而是显示了非常长的数字序列。这是我的 View 函数:

def download_pdf(request, song_id):
    song = get_object_or_404(Song, pk=song_id)
    song.chordsheet.open("r")
    chordsheet_html = HTML(string=chopro2html(song.chordsheet.read())) # Generates HTML from a text file, not relevant here
    chordsheet_css = CSS(string="div.chords-lyrics-line {\n"
    "   display: flex;\n"
    "   font-family: Roboto Mono, monospace;\n"
    "}\n")
    song.chordsheet.close()
    return FileResponse(chordsheet_html.write_pdf(stylesheets=[chordsheet_css]), as_attachment=True, filename=song.title + "_" + song.artist + ".pdf")

当我运行代码时,我得到的只是一个显示 53,635 位数字的空网页。

就其值(value)而言,我有一个类似的 View 函数,除了没有 PDF 生成(下载原始文件)之外,它可以执行相同的操作,并且工作正常。我该如何解决这个问题?

最佳答案

我找到了一个解决方案 - 我需要在响应之前将 PDF 写入缓冲区。

import io

def download_pdf(request, song_id):
    buffer = io.BytesIO()
    
    # ...

    chordsheet_html.write_pdf(buffer, stylesheets=[chordsheet_css])
    buffer.seek(0)
    return FileResponse(buffer, as_attachment=True, filename=song.title + "_" + song.artist + ".pdf")

关于python - 使用 Wea​​syprint 创建文件响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68385270/

相关文章:

c# - 使用 ItextSharp 复制没有松散表单字段结构的 PDF

Python Makefile 库

python - 如何在 OpenCV 中将轮廓分割为开放弧

python:我可以将基于部分名称的文件移动到具有该名称的文件夹中吗

python - 我如何在 Django 中编写此查询?

C# PKCS7 智能卡数字签名 - 文档自签名以来已被更改或损坏

python - 如何从 Django View 函数中读取文本文件?

python - Django Heroku 错误 "Your models have changes that are not yet reflected in a migration"

python - 为什么 Django 的 HTTPResponseRedirect 对 PUT 使用相同的 HTTP 方法而不是 POST?

pdf - 如何在没有 X11 的情况下从 Octave 音程绘制到 pdf