2013-01-02 2 views
2

안녕하세요 모든 reportlab 마스터하나의 PageTemplate을 사용하여 reportlab에서 2 페이지를 작성하는 방법은 무엇입니까?

나는 웹을 검색했으며 여기 stackoverflow에서이 휴가를 해결하기 위해 노력하고 있습니다. 내 문제에 대해 비슷한 상황을 찾을 수 없습니다.

django 관리자에서 내 데이터베이스를 특정 형식으로 볼 작업을 만들려고합니다. 하나의 레코드를 선택하면 보고서를 한 페이지 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 
+0

스토리의 단락 사이에 페이지 브레이크 개체를 삽입하여 여러 페이지 문서를 얻을 수 있습니다. –

답변

4

당신의 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을 움직일 수 있지만, 단순한 "기능"유동성이다. NextPageTemplateaddPageTemplates을 통해 추가 한 유효한 PageTemplate 개체 중 id 개를 사용할 수 있습니다.