martes, 25 de marzo de 2025

Ofimática. Python.

python-docx

Formatos

No soy yo muy partidario de dedicar tiempo a estas cuestiones, teniendo por delante tantas cosas aun por resolver, pero no queda otro remedio que incluir algunas cosas referidas al formato cuando se trata de generar documentos de forma automática. Por ello dedicaré esta entrada a estas cuestiones; las mínimas.

Por empezar por algún lado, y por eso de la frecuencia de uso (y la utilidad), se me ocurre que nos puede interesar aprender a formatear los párrafos centrándolos, justificándolos, o alineándolos a derecha o izquierda. Para ello lo primero que tenemos que hacer es añadir el acceso a un conjunto de funciones mediante la instrucción pertinente (from docx.enum.text import WD_ALIGN_PARAGRAPH) y tomaré un texto suficientemente largo para que se puedan observar los diferentes ajustes. Este texto queda asociado a la función add_paragraph() como parámetro (parrafo1 = documento.add_paragraph(texto1)) y se escribe en el texto sin formato de ningún tipo; pero si a continuación añadimos la instrucción parrafo1.alignment = WD_ALIGN_PARAGRAPH.RIGHT, el párrafo pasa a estar alineado a la derecha, así que sólo tenemos que sustituir la palabra RIGHT por sus alternativas (.LEFT - .RIGHT - .CENTER - .JUSTIFY), para que se justifique de acuerdo a lo ellas.

Esta es, posiblemente, la forma más sencilla de trabajar con formatos en python-docx, ya que otras opciones de formateo del texto exigen mayor complejidad en su codificación. Por ejemplo, algo tan sencillo como escribir en negrita , cursiva o subrayado requieren otro tipo de estrategias basadas en el uso de la función add_run(). Supongamos, por ejemplo, que queremos destacar una palabra dentro de un párrafo escribiéndola en negrita. El procedimiento sería el siguiente:

  • Primero escribimos el texto que precede a la palabra a resaltar como párrafo sin formato

parrafo=documento.add_paragraph('En este segundo párrafo vamos a poner palabras en ')

  • Y después, para escribir la palabra (o las palabras) en negrita asociamos a la variable parrafo la función ad_run() incluyendo como parámetro dicha palabra, seguida del atributo booleano .bold con su valor en True

parrafo.add_run('negrita').bold = True

  • Para cursiva .italic = True y para subrayado .inderline = True, actuaríamos igual; incluso para añadir más texto sin ninguno de estos tres formatos deberemos emplear la función add_run() asociada a la variable parrafo

parrafo.add_run(' y palabras en '

Un ejemplo de complejidad de formateo que yo considero extremo en cuanto a complejidad (por comparación con lo simple que resulta "manualmente") es definir el tamaño y el tipo de fuente, siendo como es una funcionalidad que podemos considerar básica en el uso de un procesador de texto. En este caso...

  • Primero debemos importar un conjunto de funciones específicas .docx

from docx.enum.style import WD_STYLE_TYPE

  • ...requiriendo haber importado previamente el manejo de valores de tamaño de fuente

from docx.shared import Pt

  • Después debemos asociar a la variable styles el manejo de las funciones de estilo asociadas al documento que referenciamos mediante documento, a la que previamente se asoció el objeto creado con Document()

styles = documento.styles

  • Sobre la variable styles llamamos a la función add_style() que recibe dos parámetros: el primero un string con la denominación que vamos a emplear (vg. 'Calibri_12') y un segundo parámetro con referencia al atributo WD_STYLE_TYPE.CHARACTER (todo ello queda asociado a la variable charstyle

charstyle = styles.add_style('Calibri_12', WD_STYLE_TYPE.CHARACTER)

  • Después accedemos al objeto charstyle.font, que a su vez asignamos a la variable obj_font
  • Y sobre ella al atributo de tamaño obj_font.size = Pt(12) y nombre de la fuente obj_font.name = 'Calibri'

Una vez que ya tenemos creado este conjunto de características puedes usarlo para añadirlo como segundo parámetro de la función add_run() asociada a la variable parrafoX para que el texto que se escriba quede formateado según la fuente y el tamaño que definiste antes. Esto se realiza en dos pasos:

  • Se asocia el añadido de la párrafo al documento a una variable parrafo1 = documento.add_paragraph()
  • Y sobre ella se aplica la función add-run() con dos parámetros: el texto a escribir y el atributo style al que se asigna el identificador del formato que se estableció según el procedimiento anterior

parrafo1.add_run(texto1, style = 'Calibri_12'

Este procedimiento es especialmente interesante cuando se va a trabajar con varios estilos de letra (fuente y tamaño), aunque se puede simplificar cuando el modo de proceder va a ser más sencillo, accediendo al atributo fuente del objeto run

run = parrafo1.runs[0] ->font = run.font->font.name = 'Calibri' + font.size = Pt(12)

Todo este código queda en el script que acompaña esta entrada comentado para que no interfiera en el funcionamiento del algoritmo de base.

Documento. No sé si larga pero algo liosa sí que ha sido esta entrada; así que va siendo hora de finalizarla con el enlace al script asociado.

No hay comentarios:

Publicar un comentario

Comenta esta entrada