febrero 19, 2014

ReportLab: Gráficos (16)

Está es la última parte de ReportLab, y pueden usarlo, como muchos, con Django. Yo lo uso más en aplicaciones de escritorio, pero donde este Python, ReportLab es una manera fácil de trabajar con pdf.


Por si necesitan alguna función bastante rebuscada, pueden acceder al REFERENCE de ReportLab.

Bien, en cuanto a gráficos, podemos decir que es un subpaquete de ReportLab integrado a este,  veamos como se trabaja con ellos:

  

febrero 18, 2014

ReportLab: Platypus - Sobre las tablas (15)

Las tablas trabajan con un mecanismo de grilla, se ajustan al contenido. Entre sus argumentos principales tenemos:

Table(data, colWidths=None, rowHeights=None, style=None)

La data debe ser texto, instancias de Flowables, una lista o una tupla. colWidths es el ancho de las columnas, asi como el alto sería rowHeights. Para poner los estilos se puede usar el método setStyle. Además tenemos TableSyle, como veremos su uso en el ejemplo, pero sea cuál sea el método que usemos, los argumentos disponibles son:

febrero 17, 2014

ReportLab: Platypus - Sobre los párrafos (14)

Paragraph(text, style, bulletText=None)

Evidentemente text es el texto a escribir. Algo importante y a destacar es que permite el uso de texto Python entre las triples comillas simples (''' y '''). bulletText provee al texto un punto y aparte por defecto para el párrafo. El tipo de letra y otras propiedades del texto se configuran en el argumento style, que es una instancia de la clase ParagraphStyle, y que pueden obtenerse y usarse de la siguiente forma:

from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
estilo=getSampleStyleSheet()
estilo.add(ParagraphStyle(name = "ejemplo",  alignment=TA_CENTER, fontSize=20,
           fontName="Helvetica-BoldOblique"))

Los argumentos principales de la clase ParagraphStyle son:

class ParagraphStyle(PropertySet):
defaults = {
'fontName':'Times-Roman',  # Nombre de la fuente
'fontSize':10,  # Tamaño de fuente
'leading':12,  # Espaciado entre lineas
'leftIndent':0,  # Identación a la izquierda
'rightIndent':0,  # Identación a la derecha
'firstLineIndent':0,  # Primera linea identada
'alignment':TA_LEFT,  # Alineación
'spaceBefore':0,  # Espacio antes del párrafo (excepto en el top de un frame)
'spaceAfter':0,  # Espacio después del párrafo (excepto en botton de un frame)
'textColor': black,  # Color de Texto
'backColor':None,  # Color de fondo
'borderWidth': 0,  # Ancho de borde
'borderPadding': 0,  # Padding desde el borde
'borderColor': None,  # Color de Borde
'borderRadius': None,  # Radio de las intersecciones del borde
'bulletFontName':'Symbol',  # Nombre de la Fuente de la viñeta
'bulletFontSize':10,  # Tamaño de la viñeta
'bulletIndent':0,  # Identación de la viñeta
 }

ReportLab: Platypus - Canvas como Flowable, ejemplo resumen (13)

En la entrada anterior, vimos como trabajan los niveles de platypus, sin embargo no se vio el paso directo entre el nivel 1 (canvas) y el nivel 2 (flowables), ya que los dibujos creados en el nivel 1 fueron del tipo No-Flowables, usados como pie de página y encabezado.

En este ejemplo veremos el uso de la clase Flowable, en la que heredaremos sus atributos y crear nosotros nuestros propios dibujos con canvas:


 

febrero 15, 2014

ReportLab: Platypus - PageTemplate y DocTemplate (12)

Los niveles más altos en platypus son los PageTemplates y DocTemplates. Los DocTemplates están formados por un conjunto de PageTemplates.

Los DocTemplates son expresado a trávez de BaseDocTemplate, que es una clase que implementa la maquinaria básica para el formateo del documento. Posee un método build que procesa una lista de Flowables (obviamente, estos almacenados en los frames, y los frames en los pagetemplates) y un método addPageTemplates que agrega los pagetemplates. De esta forma se llega a producir el documento PDF a alto nivel.

Los argumentos principales del BaseDocTemplate son los siguientes:

BaseDocTemplate( nombreArchivo,  # Nombre de nuestro pdf
                    pagesize=defaultPageSize,  # Tamaño de página
                    pageTemplates=[],  # Lista de pagetemplates
                    showBoundary=0,  # Para mostrar el borde
                    leftMargin=inch,  # Magen izquierdo
                    rightMargin=inch,  # Margen derecho
                    topMargin=inch,  # Margen superior
                    bottomMargin=inch,  # Margen inferior
                    title=None,  # Titulo del pdf
                    author=None,  # Autor del pdf
                    )


febrero 13, 2014

ReportLab: Platypus - Frames (11)

Los Frames son contenedores activos, quienes a su vez son contenidos en un PageTemplates. Tienen una localización y tamañon, manteniendo el concepto de espacio dibujable restante.

Frame (x1, y1, ancho, alto, leftPadding=6, bottomPadding=6, rightPadding=6, topPadding=6, id=None, showBoundary=0)

El comando anterior, crear una instancia del Frame con cordenadas x,y que son relativas a la página en uso. Los Padding reducen espacio para dibujar. El id, sirve como un identificador (ej: 'ColumnaDerecha'). Si el showBoundary es distinto de cero, se mostrará las fronteras del frame en tiempo de ejecución.

- Frame.addFromList(drawList, canvas) Añade la lista de flowables
- Frame.split(flowable, canvas) Devuelve una lista de flowables
- Frame.drawBoundary(canvas) Dibuja el marco del Frame


ReportLab. Platypus - Flowables (10)

Ya vimos en temas anteriores el nivel más bajo de todos, el pdfgen.canvas. Ahora veremos las capas superiores, que en su conjunto serán usadas por Platypus.

El Flowables es una clase abstracta para cosas que pueden ser dibujadas; por ejemplo: los párrafos y las tablas. Usa métodos como:

- Flowable.drawOn(canvas, x, y) Envía el flowable a un canvas en particular. Maneja el traslado de las coordenadas del canvas (x,y) , de manera que dicho canvas pueda dibujar el flowable en un frame de coordenadas absolutas.

- Flowable.wrap(width, height) Calcula el espacio que usará el flowable.

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):


febrero 06, 2014

Python: Convertir variable a cadena

Una de las cosas particulares que encontré en la red, fue el de convertir una variable en una cadena.
Claro, algunos no le verán el sentido, ya que se podría usar diccionarios, pero sé que en algún momento podría ser útil.


febrero 04, 2014

Mostrar Folder con python en multiplataforma

Al crear una aplicación quería lanzar un Folder, para que el usuario lo viera. Me encontré con varias soluciones, pero no las he probado todas en multiplataforma.


Supongo que la desición radica en cúan multiplataforma es la solución, como en el caso de Linux, si la solución se aplica a la mayoría de distros.

Solución 01
import os
import platform

def open_file(path):
    if platform.system() == "Windows":
        os.startfile(path)
    elif platform.system() == "Darwin":
        subprocess.Popen(["open", path])
    else:
        subprocess.Popen(["xdg-open", path])

open_file(path)

febrero 03, 2014

ReportLab: Insertando Fuentes TTF (08)

Insertar fuentes TrueType, se puede realizar no solo con pdfgen.canvas, sino también con platypus (que lo veremos más adelante).

ReportLab: Encoding UTF8 - Solución UnicodeDecodeError: 'utf8' (07)

El error siguiente: UnicodeDecodeError: 'utf8' codec can't decode bytes in position... 


por lo general aparece cuando leemos datos de otra fuente el cuál contiene datos en bytes, como latin-1, ANSI, estos se necesitan convertir a Unicode. Python provee tal conversión, por lo tanto la solución es inmediata.

ReportLab: pdfgen - Objeto de trayectoria y Tipo de líneas (06)

Ya vimos sobre los objetos de texto, que permiten dibujar de forma más comoda los textos. Para los gráficos, contamos con path object. La ventaja de usarlo, reside en la comparativa de dibujar a mano alzada, en la que el cierre de los puntos de unión se da automáticamente.

ReportLab: pdfgen - La librería lib.colors y transparencia (05)

Por lo general, al rellenar dibujos usamos colores rgb, cmyk, escala de grises, insertando valores para que en combinación nos de un determinado color. Si uno quiere insertar de forma grosa; por ejemplo el color azul, lo puede hacer directamente desde lib.colors. Además que da la opción de insertar colores transparentes:
Veamos el ejemplo:

febrero 01, 2014

ReportLab: pdfgen - Objeto de texto (04)

Al usar canvas.drawstring, nos vemos limitados a dibujar de forma lineal el texto, y si el texto es demasiado largo, no se mostrará en todo la página. Además, hay oportunidades en que nuestro texto lo tenemos en un archivo, talvez un txt. En esos casos se puede usar objectText.

Veamos el siguiente código que lo explica (se usa un archivo llamado lorem.txt, que contiene un párrafo de Lorem Ipsum: