español - reportlab python examples
Reportlab: ¿Cómo cambiar entre retrato y paisaje? (4)
Además, si alguien estaba buscando otra forma de cambiar entre horizontal y vertical, también puede pasar la rotación como un 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
)
Estoy usando reportlab para generar un informe pdf automáticamente a partir de datos dinámicos. 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, por lo 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.
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))
Finalmente descubrí la mejor manera de hacerlo por mi cuenta:
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.
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))