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

Using Weasyprint to create file response

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

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 位数字的空白网页。

对于它的价值,我有一个类似的视图函数,除了没有 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")