gpt4 book ai didi

django - 如何使用一个 PageTemplate 从 reportlab 创建 2 个页面?

转载 作者:行者123 更新时间:2023-12-01 11:48:02 24 4
gpt4 key购买 nike

大家好,reportlab 大师,

我已经在网上和 stackoverflow 中进行了搜索,但找不到与我在这个假期期间试图解决的问题类似的情况。

在 django admin 中,我正在尝试创建一个操作来以特定格式查看我的数据库。如果我选择一条记录,我可以在一页 pdf 中查看报告。这很好。如果用户尝试更多记录,那就是问题开始的地方。例如,我选择了多条记录,我可以查看报告,但所有内容仍然在一页 pdf 中。

有没有办法在pdf中每页显示一条记录?所有报告实验室的绝地大师,请帮助我如何以正确的方式做到这一点。

这是我所做的代码。

from django.contrib import admin
from models import LatestRsl
from io import BytesIO
from reportlab.pdfgen import canvas
from django.http import HttpResponse


try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO

from reportlab.lib.units import inch
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import BaseDocTemplate, PageTemplate, Paragraph, Frame
from reportlab.lib.pagesizes import letter

def go(modeladmin, request, queryset):
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'filename = testframe.pdf'

buffer = StringIO()
c = canvas.Canvas(buffer)
doc = BaseDocTemplate(buffer, showBoundary=1, leftMargin= 0.1*inch, rightMargin= 0.1*inch,
topMargin= 0.1*inch, bottomMargin= 0.1*inch)

signfr = Frame(5.1*inch, 1.2*inch, 2.8*inch, 0.44*inch, showBoundary=1)
modelfr = Frame(3.6*inch, 4.6*inch, 2.8*inch, 0.44*inch, showBoundary=1)
doc.addPageTemplates([PageTemplate(id= 'rsl_frame', frames=[signfr, modelfr]),
PageTemplate(id= 'rsl_frame2', frames=[signfr, modelfr])])

story = []

styles=getSampleStyleSheet()
styles.add(ParagraphStyle(name='Verdana9', fontName= 'Verdana', fontSize= 9))
styles.add(ParagraphStyle(name='VerdanaB10', fontName= 'VerdanaB', fontSize= 10))

for obj in queryset:
#1st frame
model = Paragraph(obj.make,styles["Verdana9"])
story.append(model)
modelfr.addFromList(story,c)

#2nd frame
signatory = Paragraph(obj.signatory,styles["VerdanaB10"])
story.append(signatory)
signfr.addFromList(story,c)

doc.build(story)
c.showPage()
c.save()
pdf = buffer.getvalue()
buffer.close()
response.write(pdf)
return response

最佳答案

假设您的 queryset 变量包含您需要的所有记录,您可以插入一个 PageBreak 对象。只需将 from reportlab.platypus import PageBreak 添加到文件的顶部,然后将 PageBreak 对象附加到文档的元素。

如果您想更改每个页面的模板,您还可以附加一个 NextPageTemplate 并传递您的 PageTemplateid。您还需要将 from reportlab.platypus import NextPageTemplate 添加到文件顶部。

for obj in queryset:
#1st frame
model = Paragraph(obj.make,styles["Verdana9"])
story.append(model)
modelfr.addFromList(story,c)

#2nd frame
signatory = Paragraph(obj.signatory,styles["VerdanaB10"])
story.append(signatory)
signfr.addFromList(story,c)

# Force the report to use a different PageTemplate on the next page
story.append(NextPageTemplate('rsl_frame2'))
# Start a new page for the next object in the query
story.append(PageBreak())

您可以将 PageBreak 移动到任何您需要的地方,但它是一个简单的可流动的“函数”。 NextPageTemplate 可以采用您通过 addPageTemplates 添加的任何有效 PageTemplate 对象的 id

关于django - 如何使用一个 PageTemplate 从 reportlab 创建 2 个页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14124408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com