You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用fpdf2生成PDF后通过Django接口下载显示空白的问题求助

使用fpdf2生成PDF后通过Django接口下载显示空白的问题求助

大家好,我现在碰到个特别头疼的问题:用fpdf2在Python里生成的PDF,本地保存打开完全正常,但通过Django接口传给前端后,下载下来的PDF却是空白的——不过奇怪的是,我给PDF加几页,下载的文件就对应有几页空白页,说明页数是对的,但内容就是不显示。试了好几种办法都没搞定,想请大家帮我排查下问题出在哪。

问题详情

直接在Python脚本里调用fpdf2生成PDF,保存到本地打开能正常看到内容;但通过Django接口返回给前端后,设置application/pdf类型下载的PDF就是空白。我把响应类型改成text/plain后,能拿到完整的PDF源码(如下方的内容片段),但切回PDF类型还是不行。

相关代码片段

1. PDF生成核心逻辑(taskGeneratePDF.py)

from fpdf import FPDF
from api.packages.utils.jsonLogger import LogFormat, get_or_create_json_logger

logger = get_or_create_json_logger(__name__, log_format=LogFormat.DEFAULT)

def generate_task_pdf(task_data: dict, output_path: str) -> bytearray:
    pdf = FPDF()
    pdf.add_page()
    pdf.set_font("helvetica", style="B", size=16)
    pdf.cell(40, 10, "Hello World!")
    logger.info(f"PDF generated and saved to {output_path}")
    result = pdf.output()
    return result

2. Django接口路由处理(TaskRoutesId.py)

class RouteTaskGeneratePDF(customAuthCheckClass):
    def get(
        self, request: HttpRequest, *args,
    ) -> HttpResponse:
        try:
            pdf_response = generate_task_pdf({"test": "test"}, "test.pdf")
            headers = {"Content-Disposition": "attachment; filename=myfilename.pdf"}
            response = HttpResponse(bytes(pdf_response), content_type="application/pdf", headers=headers)
            return response
        except Exception as e:
            return HttpResponse({"error": f"Failed to generate PDF: {str(e)}"}, status=404)

3. 前端请求与下载逻辑

TaskClient.ts
export async function getTaskPDF(taskId: string, payload: TaskPDFPayload) {
  try {
    const response = await httpGet<Uint8Array>(`/task/${taskId}/pdf/`)
    return response
  } catch (error) {
    return await Promise.reject(error)
  }
}
TaskMainDetails.vue
function generate_pdf() {
  const payload = {}
  const taskId = props.task?.vertexID || ""
  let pdf_response = TaskClient.getTaskPDF(taskId, payload)
  pdf_response.then((message) => {
    const blob = new Blob([message.data], { type: "application/pdf" })
    let link = document.createElement("a")
    link.href = window.URL.createObjectURL(blob)
    link.download = "test_pdf_name"
    link.click()
  })
}

文本类型返回时拿到的PDF内容片段

"%PDF-1.3 1 0 obj << /Count 1 /Kids [3 0 R] /MediaBox [0 0 595.28 841.89] /Type /Pages >> endobj 2 0 obj << /OpenAction [3 0 R /FitH null] /PageLayout /OneColumn /Pages 1 0 R /Type /Catalog >> endobj 3 0 obj << /Contents 4 0 R /Parent 1 0 R /Resources 6 0 R /Type /Page >> endobj 4 0 obj << /Filter /FlateDecode /Length 72 >> stream x�3R��2�35W(�r Q�w3T04�30PISp �Z(�[����(hx����+���(j*�d��V endstream endobj 5 0 obj << /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> endobj 6 0 obj << /Font << /F1 5 0 R>> /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >> endobj 7 0 obj << /CreationDate (D:20250708064952Z) >> endobj xref 0 8 0000000000 65535 f 0000000009 00000 n 0000000096 00000 n 0000000199 00000 n 0000000279 00000 n 0000000422 00000 n 0000000524 00000 n 0000000611 00000 n trailer << /Size 8 /Root 2 0 R /Info 7 0 R /ID [<119889D12E2230568C66D2CFBCFCE0FB><119889D12E2230568C66D2CFBCFCE0FB>] >> startxref 666 %%EOF "

已尝试的排查方法

  • 转换字节类型:把pdf.output()的结果转成bytes再返回给响应
  • 调整前端下载逻辑:分别用Blob()和File()创建下载对象
  • 修改响应头:切换Content-Disposition为inline或attachment,补充其他PDF相关头字段
  • 检查前端请求配置:确保请求是按二进制数据解析响应

但这些操作都没解决问题,现在实在没思路了,有没有朋友遇到过类似情况,或者能帮我指出哪里可能出了问题?

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:13:08