Reportlab: ¿Cómo cambiar entre retrato y paisaje?

Estoy usando reportlab para generar un informe pdf automáticamente a partir de datos dynamics. Como el contenido a veces es demasiado grande para mostrarlo en vertical, estoy intentando cambiar a horizontal para contenido grande.

Aquí es cómo funciona mi generación de informes:

Función principal :

doc = DocTemplate(...) //Doctemplate is a customed BaseDocTemplate class array = [] some_data= "Here is some data displayed in portrait" array.append(Paragraph(some_data)) large_data = "this data is too large to be displayed in portrait" array.append(Paragraph(large_data)) ... // Some more data is added after this doc.build(array, canvasmaker=NumberedCanvas) 

Lo que estoy buscando es una forma de poder cambiar de vertical a horizontal en cada paso, ya que no sé la cantidad de páginas que se necesitarán para mostrarlo. Todavía soy nuevo en reportlab e incluso un poco con python, así que no veo cómo puedo usar las soluciones provistas por reportlab (PageTemplates, flowables) correctamente ya que estoy creando todo el documento al final.

Aquí están mis otras clases útiles para este caso:

 class DocTemplate(BaseDocTemplate, ): def __init__(self, filename, **kw): apply(BaseDocTemplate.__init__, (self, filename), kw) f = Frame(2.6*cm, 2.8*cm, 16*cm, 22.7*cm, id='f') pt = PageTemplate('RectPage', [f], onPage=beforeDrawPage, onPageEnd=afterDrawPage) //beforeDrawPage and afterDrawPage fill the headers of the page (that also need to be in landscape) self.addPageTemplates(pt) 

Creo que agregaré otra plantilla de página o marco, pero no veo cómo puedo cambiar de una a otra durante la fase de adición de datos.

 class NumberedCanvas(canvas.Canvas): def __init__(self, *args, **kwargs): canvas.Canvas.__init__(self, *args, **kwargs) self._saved_page_states = [] def showPage(self): self._saved_page_states.append(dict(self.__dict__)) self._startPage() def save(self): """add page info to each page (page x of y)""" num_pages = len(self._saved_page_states) for state in self._saved_page_states: self.__dict__.update(state) self.draw_page_number(num_pages) canvas.Canvas.showPage(self) self.setTitle("Title") canvas.Canvas.save(self) self._doc.SaveToFile(self._filename, self) def draw_page_number(self, page_count): self.setFont("Helvetica", 11) self.drawRightString(18.5*cm, 26.8*cm, "PAGE %d / %d" % (self._pageNumber, page_count)) 

Espero no haber olvidado nada para ser claro.

Muchas gracias de antemano.

Utilice las funciones de paisaje y retrato que ya están en el módulo de tamaño de página.

 from reportlab.lib.pagesizes import letter, landscape c = canvas.Canvas(file, pagesize=landscape(letter)) 

Finalmente descubrí la mejor manera de hacerlo por mí mismo:

Agregué una nueva PageTemplate en mi DocTemplate con configuraciones horizontales, y luego simplemente utilicé NextPageTemplate del paquete reportlab.platypus:

array.append(NextPageTemplate('landscape'))

Para volver al retrato, uso:

array.append(NextPageTemplate('portrait'))

Esto permite una flexibilidad bastante agradable.

Así es como cambio entre los modos de retrato y paisaje, pero antes determino qué orientación:

 from reportlab.lib.pagesizes import letter, A4 lWidth, lHeight = letter if orientation == 'landscape': canvas.setPageSize((lHeight, lWidth)) else: canvas.setPageSize((lWidth, lHeight)) 

Además, si alguien estaba buscando otra forma de cambiar entre horizontal y vertical, también puede pasar la rotación como argumento de palabra clave a BaseDocTemplate.

 self._document = BaseDocTemplate(self._filename, pageSize=self._page_size, topMargin=1.5*cm, bottomMargin=1.5*cm, leftMargin=1*cm, rightMargin=1*cm, rotation=90, showBoundary=False )