3

こんにちはすべてのreportlabマスター、

私はウェブを検索しましたが、ここでもstackoverflowで検索しましたが、この休暇中に解決しようとしている問題について、同様の状況を見つけることができません。

django adminで、データベースを特定の形式で表示するアクションを作成しようとしています。1つのレコードを選択すると、レポートを1ページのPDFで表示できます。どちらでも構いません。ユーザーがより多くの記録を試みた場合、問題はそこから始まります。たとえば、複数のレコードを選択すると、レポートを表示できますが、すべてのコンテンツが1ページの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
4

1 に答える 1

5

queryset変数に必要なすべてのレコードが含まれていると仮定すると、オブジェクトを挿入できますPageBreakfrom reportlab.platypus import PageBreakファイルの先頭に追加してPageBreakから、ドキュメントの要素にオブジェクトを追加するだけです。

各ページのテンプレートを変更する場合は、を追加して、のNextPageTemplateを渡すこともできidますPageTemplatefrom 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取得できます。idPageTemplateaddPageTemplates

于 2013-01-03T19:14:20.013 に答える