使用 Weasyprint 创建文件响应
Using Weasyprint to create file response
我正在使用 Django 制作一个与吉他和弦 sheets 相关的 Web 应用程序。其中一项功能是能够从和弦 sheet 生成 PDF 并下载。我正在使用 Weasyprint 生成 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")
我正在使用 Django 制作一个与吉他和弦 sheets 相关的 Web 应用程序。其中一项功能是能够从和弦 sheet 生成 PDF 并下载。我正在使用 Weasyprint 生成 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")