【问题标题】:How to create 2 pages from reportlab using one PageTemplate?如何使用一个 PageTemplate 从 reportlab 创建 2 个页面?
【发布时间】:2013-01-04 03:14:20
【问题描述】:

大家好,reportlab 大师,

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

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

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

这是我所做的代码。

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

【问题讨论】:

  • 您可以在故事的段落之间插入页面制动对象以获得多页文档。

标签: django django-admin reportlab


【解决方案1】:

假设您的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-10
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2017-10-19
    相关资源
    最近更新 更多