febrero 13, 2014

ReportLab: Platypus - Entendiendo la relación con pdfgen.canvas (09)

Platypus (Page Layout and Typography Using Scripts), es una librería para disponer las páginas en un alto nivel, permitiendonos crear documentos complejos con poco esfuerzo.

Platypus busca separar el diseño del contenido de los documentos. Así por ejemplo, los párrafos son construidos usando estilo de párrafos, y las páginas usando plantillas. De esta forma, si se crea un millar de páginas, bastará con modificar las especificaciones de estilo para que resulte efecto en todo el documento.

Platypus usa un diseño de capas:

DocTemplates: Es la plantilla del documento.
PageTemplates: Es la plantilla para las páginas.
Frames: Son las regiones en las páginas que contienen texto o gráficos
Flowables: Elementos de texto ó gráficos que están incrustados en el documento (párrafos, tablas, imágenes, pero no pies de página)
pdfgen.Canvas: El que se encarga de pintar el documento, a partir de las órdenes de las otras capas superiores.

El gráfico siguiente lo explica mejor ( Los de color púrpura son los Frames):


Veamos un ejemplo:

# -*- coding:utf-8 -*-
import os

#Importamos algunas librerias: SimpleDocTemplate, es una plantilla de documento
#predefinida; getSampleStyleSheet, contiene una hoja de estilos de ejemplo;
#inch es una pulgada
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import inch

PAGE_WIDTH = A4[0]
PAGE_HEIGHT = A4[1]

styles = getSampleStyleSheet()

#Definimos las caracteristicas fijas de la primera página
def myFirstPage(canvas, doc):
    canvas.saveState()
    canvas.setFont('Times-Bold', 16)
    canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT - 108, Title)
    canvas.setFont('Times-Roman', 9)
    canvas.drawString(inch, 0.75 * inch, "Primera pagina / %s" %pageinfo)
    canvas.restoreState()

#Definimos disposiciones alternas para las caracteristicas de las otras páginas
def myLaterPages(canvas, doc):
    canvas.saveState()
    canvas.setFont('Times-Roman', 9)
    canvas.drawString(inch, 0.75 * inch, "Página %d / %s" %(doc.page, pageinfo))
    canvas.restoreState()


Title = "Hola mundo"
pageinfo = "Ejemplo Platypus"
#Creamos un documento basándonos en una plantilla
doc = SimpleDocTemplate("test.pdf")
#Iniciamos el story para los registros
story = [Spacer(0, 80)]
#Definimos un estilo
estilo = styles['Normal']
#Creamos 100 párrafos
for i in range (100):
    texto = ("Este es el párrafo número %s. " %(i+1) ) *20
    #Definimos un párrafo usando un estilo
    p = Paragraph(texto, estilo)
    #Registramos en el story
    story.append(p)
    #También registramos el espacio que tendrá entre párrafos
    story.append(Spacer(0, 20))
#Construimos el documento a partir de los argumentos definidos
doc.build(story, onFirstPage = myFirstPage, onLaterPages = myLaterPages)

os.system("test.pdf")

No hay comentarios:

Publicar un comentario