2011-05-06 192 views
17

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.

Respuesta

13

finalmente me di cuenta de la mejor manera de hacerlo por mi mismo:

que añade un nuevo PageTemplate en mi DocTemplate con la configuración de paisaje, y luego simplemente utilizados NextPageTemplate del paquete reportlab.platypus:

array.append(NextPageTemplate('landscape'))

para volver en el retrato, yo uso:

array.append(NextPageTemplate('portrait'))

Esto permite una flexibilidad bastante agradable.

+1

'array' es la 'historia' – TNT

6

Así es como cambiar entre los modos vertical y horizontal, pero a determinar qué orientación de antemano:

from reportlab.lib.pagesizes import letter, A4 

lWidth, lHeight = letter 

if orientation == 'landscape': 
    canvas.setPageSize((lHeight, lWidth)) 
else: 
    canvas.setPageSize((lWidth, lHeight)) 
29

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

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