Estoy usando reportlab para generar un informe en PDF automáticamente a partir de datos dinámicos. Como el contenido a veces es demasiado grande para mostrarse en vertical, estoy intentando cambiar al paisaje por contenido grande.Reportlab: ¿Cómo cambiar entre vertical y horizontal?
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 manera de ser capaz de cambiar de vertical a horizontal en cada paso, como don No sé el número de páginas que se necesitarán para mostrarlo. Todavía soy nuevo en ReportLab e incluso un poco con Python, por lo que no veo cómo puedo utilizar las soluciones proporcionadas por ReportLab (PageTemplates, Flowables) correctamente, ya que estoy construyendo 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 voy a añadir otra plantilla de página o el marco, pero no veo cómo puedo cambiar de uno a otro durante los datos fase adjunta.
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.
'array' es la 'historia' – TNT