1. Libros y videos
  2. Python 3
  3. Generación de contenido
Extrait - Python 3 Tratamiento de datos y técnicas de programación (2ª edición)
Extractos del libro
Python 3 Tratamiento de datos y técnicas de programación (2ª edición) Volver a la página de compra del libro

Generación de contenido

PDF

1. Presentación

a. Formato PDF

PDF son las siglas de Portable Document Format, un formato de documento que utiliza un lenguaje de descripción de página que es el PDL (siglas de Page Document Language) y un protocolo de impresión independiente del fabricante, que es una evolución de Postscript. Se ha convertido, progresivamente, en el estándar de impresión de documentos y en una norma ISO.

A día de hoy existen muchos formatos de datos (texto, dibujos, imágenes...) que incluyen funcionalidades para su exportación a PDF.

b. Ventajas

Sus principales ventajas son:

  1. concordancia entre la representación en pantalla y lo que realmente se imprimirá; 

  2. independencia respecto al sistema operativo;

  3. independencia respecto al hardware;

  4. la existencia de aplicaciones y librerías libres para este formato;

  5. la gran difusión de lectores de documentos PDF, la mayoría de ellos libres y gratuitos. 

c. Inconvenientes

Los principales inconvenientes son de varios tipos:

  1. Los permisos vinculados a cada documento dependen, a la vez, de los propios del formato, además de aquellos ligados a todo lo que está contenido en un documento, es decir, permisos de los autores sobre los textos, las imágenes incrustadas, o incluso los tipos de letras utilizados.

  2. La evolución del formato está vinculada, principalmente, a la política de un único fabricante.

d. Presentación de la librería libre

ReportLab es una librería externa escrita en Python que ofrece herramientas sencillas y con buen rendimiento para generar documentos PDF. Esta librería es mantenida por un fabricante que proporciona dos ramas, una de ellas destinada a la comunidad, que es la que nos interesa utilizar.

Está migrada a Python 3, en particular a partir de Python 3.3, y el código puede encontrarse en: https://github.com/nakagami/reportlab

2. Bajo nivel

a. Librería de datos

Lo primero que hay que tener en cuenta para crear un documento es disponer de los datos prefabricados. En efecto, es conveniente disponer de los formatos listos correspondientes a un A4, A3 o cualquier otro formato habitual, con colores predefinidos listos para ser empleados, y un sistema que permita convertir las medidas que manejamos en aquellas utilizadas por ReportLab, a saber, un point, la unidad de medida de las pantallas...

Generar un documento PDF a partir de una página HTML

1. Presentación

Desde hace algunos años, una de las técnicas preferidas para generar documentos PDF con un estilo determinado consiste en generar una página PHML en el formato correcto y, a continuación, utilizar una herramienta para convertir esta página HTML en un archivo PDF.

Existen varias alternativas para realizar esta operación; y aquí presentaremos Weasyprint.

2. Instalación

Para instalar Weasyprint, existen varios requisitos previos, la mayoría de los cuales consiste en la instalación previa de otras bibliotecas Python y Pango.

En el caso de Debian, es necesario hacer lo siguiente:

$ apt install python3-pip python3-cffi python3-brotli libpango-1.0-0 
libpangoft2-1.0-0  
$ pip install weasyprint 

Para comprobar que la instalación se ha realizado correctamente:

$ weasyprint -info 

Para más información, en particular sobre la instalación en otras plataformas: https://doc.courtbouillon.org/weasyprint/stable/index.html

3. Uso

Esta herramienta puede utilizarse directamente desde la consola:

$ weasyprint https://mi-sitio.es/mi-pag?data=test /path/a_mi/archivo.pdf 

O desde una consola Python o código Python:

>>> from weasyprint import HTML  
>>> HTML("https://mi-sitio.es/mi-pag?data=test").write_pdf("test  
/path/a_mi/archivo.pdf")...

OpenDocument

1. Presentación

Seamos claros desde el principio. OpenDocument es un formato de documento, compartido por todos los programas ofimáticos dignos de este nombre. Este formato se ha elaborado minuciosamente y ha sido negociado por los fabricantes que han formado parte de este proceso. OpenDocument es, por tanto, un formato que se ha consensuado y compartido entre todos los programas ofimáticos. No hablamos en esta sección de LibreOffice (la suite ofimática de referencia), sino más bien de un formato de documento universal.

A este nivel, el formato es bastante sencillo de comprender. Se trata, en particular, de un simple archivo comprimido en formato ZIP que contiene grandes archivos XML entre los que se encuentra content.xml, que incluye todo el contenido del documento y el formato utilizado (incluido el estilo). Otro archivo, style.xml, detalla cada uno de los estilos personalizados del documento.

Podemos acceder al contenido de un archivo OpenDocument simplemente descomprimiéndolo y utilizando XPath para recorrerlo.

Vamos a presentar aquí los métodos de alto nivel para generar documentos de tipo OpenDocument, y para ello, la referencia es este sitio: https://www.opendocumentformat.org/developers/

2. ezodf2

a. Instalación

La librería ideal para generar un documento con formato OpenDocument es ezodf2 (https://pypi.python.org/pypi/ezodf2). Se instala de la siguiente manera (deberá instalar...

Trabajar con imágenes

1. Representación informática de una imagen

Cuando pensamos en una imagen, pensamos en una fotografía y, por lo tanto, en una imagen de mapa de bits que, como su nombre indica, es una organización de bytes. La imagen tiene un tamaño fijo y una resolución dada, lo que significa que una imagen puede considerarse como tres tablas estáticas superpuestas de bytes, una para el rojo, otra para el verde y la última para el azul. Por lo tanto, cada casilla de la tabla o punto de la imagen tiene como valor una tupla de 3 bytes.

Esto corresponde a lo que se llama una imagen de trama y es el tipo de imagen más común. Este es el tipo de imagen que toma una cámara, por ejemplo. Parafraseando el párrafo anterior, podemos ver una imagen como tres matrices superpuestas, siendo cada valor un byte o como una matriz única de 3 tuplas de bytes.

Si a primera vista la diferencia no es necesariamente obvia, estas diferentes formas de ver son importantes porque determinan el contenido de los algoritmos.

Estas imágenes son perfectamente adecuadas para el uso en ordenadores y para renderizar en una pantalla de ordenador, ya que los tres componentes, rojo, verde y azul, son los de la síntesis aditiva. Es decir, la adición de colores da el color blanco y la ausencia combinada de los mismos tres colores corresponde al negro.

Por el contrario, la reprografía requiere el uso de síntesis sustractiva, lo que funciona cuando se mezclan pigmentos (o pintura) y que es un poco más conocido por el público en general. La mezcla de magenta y cian da púrpura, magenta y amarillo da como resultado naranja, amarillo y cian da verde y la mezcla de los tres da marrón. En la síntesis sustractiva, es muy difícil obtener niveles de negro y gris, por lo que se requieren pigmentos adicionales. Esta es la razón por la cual se diseñó la representación CMYK (cian, magenta, amarillo y negro).

Por lo tanto, la representación de una imagen de este tipo destinada a la reprografía ya no requiere una tupla de 3, sino una de 4 para cada píxel o 4 matrices en lugar de 3 para la imagen completa. Es obvio que el paso de tuplas de 4 a tuplas de 3 es único, pero del paso de tuplas de 3 a tuplas de 4, puede tener varias soluciones. Por lo tanto, los diseñadores gráficos...

Archivos de configuración

Aquí veremos los formatos de archivos textuales utilizados para configurar aplicaciones, como YAML o TOML. El primero se utiliza con docker, por ejemplo, con los archivos docker-compose.yaml. El segundo se utiliza con poetry, por ejemplo, con el archivo pyproject.toml.

1. Formato YAML

El formato YAML está diseñado para que sea bastante fácil de leer para el ojo humano. Utiliza sangría y dos puntos para marcar los bloques de datos. He aquí un ejemplo:

database: "postgres://user:pwd@localhost:5432/db_name"  
max_retries: 3  
data:  
  - key_1: 34  
  - key_2: 24 

Las dos primeras líneas son datos simples, la tercera son datos estructurados y las dos últimas líneas forman parte de la estructura. Se interpretarán como diccionarios. También es posible describir una lista:

list: [1, 2, 3] 

O simples diccionarios:

dict:  
  key: "llave"  
  value: 42 

Se pueden combinar estos elementos.

He aquí cómo leer un archivo de este tipo:

import yaml  
>>> with open("test.yaml") as f:  
...     content = yaml.safe_load(f)  
>>> print(content)  
{'database': 'postgres://user:pwd@localhost:5432/db_name', 
'max_retries': 3, 'dict':...