【问题标题】:Django Reportlab generates empty pdfDjango Reportlab 生成空的pdf
【发布时间】:2017-07-13 15:12:37
【问题描述】:

我正在使用 reportlab 创建一个 pdf。我正在使用 Reportlab 段落。问题是每次我下载它时,它都会生成一个空的txt。 我在没有 django 的情况下对其进行了测试,它可以正常工作。如果我使用画布,它可以工作,但不适合我的需要。

views.py

from django.http import HttpResponse
from django.shortcuts import render
from reportlab.lib.enums import TA_JUSTIFY
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.pagesizes import letter


def genereaza_pdf(request):
    if request.method == 'POST':
        response = HttpResponse(content_type='application/pdf')
        response['Content-Disposition'] = 'attachment; filename="example.pdf"'
        doc = SimpleDocTemplate("example.pdf", pagesize=letter, rightMargin=70, leftMargin=70, topMargin=70,
                                bottomMargin=60)
        report = []

        styles = getSampleStyleSheet()
        styles.add(ParagraphStyle(name="Times", fontName='Times-Roman', fontSize=15, alignment=TA_JUSTIFY))

        p_text = "<u>ANEXA 1</u>"
        report.append(Paragraph(p_text, styles["Times"]))
        report.append(Spacer(1, 5))
        doc.build(report)
        return response
    return render(request, 'pdf_test.html')

pdf_test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Download pdf</title>
</head>
<body>
    <form method="POST">
        {% csrf_token %}
        <button type="submit">Download</button>
    </form>
</body>
</html>

似乎是什么问题?

【问题讨论】:

    标签: python django pdf reportlab


    【解决方案1】:

    您必须将文件写入流式传输。试试这个:

    from io import BytesIO
    def genereaza_pdf(request):
        if request.method == 'POST':
            response = HttpResponse(content_type='application/pdf')
            response['Content-Disposition'] = 'attachment; filename="example.pdf"'
            buff = BytesIO()
            doc = SimpleDocTemplate(buff, pagesize=letter, rightMargin=70, leftMargin=70, topMargin=70,
                                    bottomMargin=60)
            report = []
    
            styles = getSampleStyleSheet()
            styles.add(ParagraphStyle(name="Times", fontName='Times-Roman', fontSize=15, alignment=TA_JUSTIFY))
    
            p_text = "<u>ANEXA 1</u>"
            report.append(Paragraph(p_text, styles["Times"]))
            report.append(Spacer(1, 5))
            doc.build(report)
            response.write(buff.getvalue())
            buff.close()
            return response
        return render(request, 'pdf_test.html')
    

    【讨论】:

      【解决方案2】:

      该函数正在生成两个文件,一个默认在“下载”中,但它是一个空的 txt,另一个在项目目录中。我已经进行了更改。

      def genereaza_pdf(request):
          if request.method == 'POST':
              response = HttpResponse(content_type='application/pdf')
              response['Content-Disposition'] = 'attachment; filename="example.pdf"'
              doc = SimpleDocTemplate(response, pagesize=letter, rightMargin=70, leftMargin=70, topMargin=70,
                                      bottomMargin=60)
              report = []
      
              styles = getSampleStyleSheet()
              styles.add(ParagraphStyle(name="Times", fontName='Times-Roman', fontSize=15, alignment=TA_JUSTIFY))
      
              p_text = "<u>ANEXA 1</u>"
              report.append(Paragraph(p_text, styles["Times"]))
              report.append(Spacer(1, 5))
              doc.build(report)
              return response
          return render(request, 'pdf_test.html')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-11
        • 1970-01-01
        • 1970-01-01
        • 2011-05-21
        • 2016-03-14
        • 2013-03-07
        • 2023-04-07
        • 1970-01-01
        相关资源
        最近更新 更多