2013-09-25 3 views
1

Я новичок в ReportLab и пытаюсь создать PDF с Platypus, где каждый раздел имеет другой шаблон страницы (и другой верхний и нижний колонтитул). Как это сделать с помощью BaseDocTemplate без использования SimpleDocTemplate?Как сделать несколько страниц с помощью BaseDocTemplate в утконосе ReportLab?

Я пытаюсь использовать код ниже, но я не могу получить содержимое отображаемых фреймов, кроме первой страницы, на которой я рисую непосредственно на холсте. Для краткости я удаляю дополнительное форматирование и код верхних и нижних колонтитулов для каждого PageTemplate.

from reportlab.platypus import (BaseDocTemplate, Paragraph, Spacer, 
          PageBreak, Frame, PageTemplate, NextPageTemplate) 
from reportlab.pdfgen import canvas 
from reportlab.lib import pagesizes, units, styles, enums 

class Report(object): 
    def __init__(self, stream, sections): 
     self.stream = stream 
     self.sections = sections 
     w, h = pagesizes.A4 
     self._width = w 
     self._height = h 
     self._story = [] 
     self._doc = None 
     self._canvas = canvas.Canvas(self.stream) 
     self._stylesheet = styles.getSampleStyleSheet() 

    def generate(self): 
     '''Generate the report''' 
     self._doc = BaseDocTemplate(self.stream, 
            pagesize=(self._width, self._height), 
            showBoundary=True 
            ) 
     # Start with the coverpage, then create a new page for each section. 
     self.coverpage() 
     for i, p in enumerate(self.sections): 
      self.render_section(i, p) 
     self._doc.build(self._story) 
     self._canvas.save() 

    def coverpage(self): 
     '''Draw the cover page''' 
     frame = Frame(0, 0, self._width, self._height) 
     self._doc.addPageTemplates(PageTemplate(id='cover', frames=[frame])) 
     self._story.append(PageBreak()) 
     # The cover page just has some drawing on the canvas. 
     self._canvas.saveState() 
     self._canvas.setFont('Helvetica', 16) 
     self._canvas.drawCentredString(self._width/2.0, self._height - 108, 
             "This is the first page") 
     self._canvas.restoreState() 

    def render_section(self, num, text): 
     '''Put stuff on the canvas that belong to this section.''' 
     frame = Frame(0, 0, self._width, self._height, showBoundary=1) 
     self._doc.addPageTemplates(PageTemplate(id='section-%d' % num, 
               frames=[frame])) 
     h1 = self._stylesheet['Heading1'] 
     h1.alignment = enums.TA_CENTER 
     frames = [NextPageTemplate('section-%d' % num), 
        Paragraph(self.sections[num], h1), 
        Spacer(1, units.inch * 0.2), 
        PageBreak()] 
     self._story.extend(frames) 


if __name__ == '__main__': 
    Report('report.pdf', "Why is this not showing?".split(" ")).generate() 

ответ

3

Ваш ответ here. Пример кода на данной ссылке довольно четко показывает, как показывать несколько кадров с помощью BaseDocTemplate.

+0

+1. Я чувствовал, что документы Reportlab не уточняют, как Frames взаимодействуют с шаблонами страниц и как шаблоны страниц работают с документами. – Max

Смежные вопросы