2017-07-07 81 views
0

我使用reportlab创建pdf。我正在使用Reportlab段落。问题是我每次下载它时,都会产生一个空的txt。 我测试了它没有Django,它没有问题。如果我使用画布,但它不适合我需要的画布。Django Reportlab生成空的pdf

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> 

出了什么问题?

回答

0

功能是生成两个文件,一个在下载为默认,但它是一个空的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') 
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')