Mostrando entradas con la etiqueta python-pptx. Mostrar todas las entradas
Mostrando entradas con la etiqueta python-pptx. Mostrar todas las entradas

sábado, 22 de marzo de 2025

Textos. Python

Ofimática con Python


Dentro de las muchas utilidades que nos ofrece Python, las más próximas a los objetivos nucleares de este blog son las que tienen que ver con la ofimática. Aunque existen diferentes enfoques, mi opción actual tiene que ver con la creación automatizada de los principales documentos ofimáticos en términos de uso por parte de los SEO: documentos de texto, hojas de cálculo y presentaciones.



Aunque LibreOffice (LO) presenta la opción de crear y trabajar con script Python "internos", esto es, script con igual funcionalidad que los creados en OOo Basic, hasta donde yo sé, Python no cuenta con bibliotecas que permitan crear documentos LO "externamente", esto es, sin que sea necesario trabajar desde un servicio de la suite. Microsoft Office (MSA) sí, lo que constituye una ventaja a su favor. No obstante es factible crear documentos MSA y seguir trabajando con la suite LO, ya que ésta accede sin dificultad a los documentos creados para la primera.

Dentro de los productos ofimáticos, los de mayor uso (y funcionalidad) para los SEO son los documentos de texto, seguidos a mucha distancia y escasa entre ellos, por las hojas de cálculo y las presentaciones (tipo Power Point). Python cuenta con bibliotecas específicamente desarrolladas para automatizar la creación de estos documentos en soporte MSA.

Podemos automatizar la creación de documentos de texto (Word - Writer) mediante las utilidades que ofrece la biblioteca python-docx, crear hojas de cálculo (Excell - Calc) mediante openpyxl y generar automáticamente presentaciones mediante python-pptx (Power Point - Impress)
 

jueves, 20 de marzo de 2025

mav. Python


Biblioteca python-pptx




Esta biblioteca forma parte de un conjunto de recursos Python pensados para facilitar el trabajo con la suite ofimática MSO; concretamente con python-pptx podemos automatizar la creación de presentaciones Power Point.


Dada la versatilidad y compatibilidad de LibreOffice, es posible trabajar desde esta suite con cualquier documento creado para MSO, por lo que resulta que el uso de python-pptx también es compatible con la gestión de las presentaciones mediante LO-Impress.  Dicho esto para tranquilidad de los amantes del software libre, vamos a tratar en esta entrada sobre python-pptx como biblioteca.

Lo primero que deberemos hacer es importarla desde Símbolo de sistema mediante la instrucción pip install python-pptx; esto es necesario por no ser esta un biblioteca standard de Python.

Además tiene la peculiaridad de que, normalmente, y al contrario que en otras librerías, los script Python que hacen uso de ella no la llaman mediante la instrucción genérica (import python-pptx), aunque también puede hacerse así, sino mediante la llamada a cada una de sus funcionalidades específicas. Por ejemplo, para todo lo referentes (y nuclear) a la creación de una presentación se llama a las funciones Presentation() (from pptx import Presentation) y para trabajar con instrucciones que requieren dimensionar las formas que contienen las diapositivas (cosa que se hace en pulgadas), se llama a Inches (from pptx.util import Inches)

Por otro lado, al menos la creación de un modelo básico de presentación resulta ser bastante sencillo, lo que permite automatizar la creación de presentaciones Power Point de estas características, que se ajustan perfectamente a lo que necesitamos como alternativa a la creación de informes escritos para la presentación a colectivos de los resultados de evaluación grupal (también podría ser individual, pero generalmente es innecesario y no sustituye a la creación del informe sobre documento) o del análisis de datos. Evidentemente nada impide utilizar este recurso también para crear presentaciones específicamente informativas sobre un determinado tema, pero es este caso, si la presentación es larga y compleja, posiblemente automatizarla requiere adentrarse en el conocimiento de esta interesante biblioteca y sus múltiples opciones.

Para facilitarte esta tarea te dejo aquí enlaces a su fuente fundamental de información y a tres páginas con contenidos relevantes para la automatización de presentaciones:

MAV. Python


Python-pptx. Gráfico (3)




Gráfico estadístico

Tercer y último componente gráfico, el gráfico estadístico, al igual que la tabla, se puede presentar como imagen capturada creada con otro programa (una hoja de cálculo mismamente) o creada directamente. Esta es la opción que paso a explicar en esta última entrada sobre python-pptx.


Además, dada la diversidad de opciones disponibles, me limitaré a presentar tres de las opciones disponibles, quedando el resto a la decisión del usuario, que puede ampliar sus conocimientos sobre este particular desde este enlace.

Y por simplificar el contenido de la entrada omitiré la ya sabida (por ser la misma) explicación de la creación de la nueva diapositiva y todo lo que conlleva, para centrarme en lo que es específicamente crear el gráfico estadístico.

Este proceso implica añadir dos sentencias import al inicio del script...
  • from pptx.chart.data import CategoryChartData
  • from pptx.enum.chart import XL_CHART_TYPE
... cuyo significado resulta bastante explícito: la primera permite crear gráficos estadísticos y la segunda crear gráficos específicos según tipología.

Sobre esta base, en efecto, primero creamos el gráfico genérico (chart_data = CategoryChartData()), proceso que completamos asignando las categorías (chart_data.categories = ['Este', 'Oeste', 'Norte','Sur']) y las series de datos que va a tener nuestro gráfico (chart_data.add_series('Series  de datos', (0.40,0.35, 0.15, 0.10))), en este segundo caso mediante la función add_series() que requiere los siguientes parámetros: un título para la serie y la lista de datos de la serie (que debe ser acorde con el número de elementos de las categorías).

Después la añadimos el gráfico a la (teórica) colección de formas de la diapositiva mediante la función add.chart(). Esta función, cuya sintaxis completa incluye el identificador (variable) de la diapositiva y la referencia a la clase formas (Diapo6.shapes.add_chart()) requiere seis parámetros:
  • El primero, la clase de gráfico al que hace referencia la constante, en este caso, XL_CHART_TYPE.COLUMN_CLUSTERED, que hace referencia a un gráfico de barras.
  • Después cuatro variables numéricas, dos de posición y dos de dimensiones, que podemos introducir directamente o mediante referencia a variables declaradas previamente, como es el caso (x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5))
  • y finalmente la variable que remite al gráfico creado antes (en este caso, y como sabemos, chart_data)
La expresión final de esta instrucción es la siguiente: Diapo6.shapes.add_chart(
    XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data), aunque el cambio del tipo de gráfico podría hacer cambiar el primer parámetro (XL_CHART_TYPE.LINE para gráficos de línea o XL_CHART_TYPE.PIE para gráficos de tarta) o incluso la el conjunto del código explicado en esta entrada si así lo requiere el tipo de gráfico que deseamos emplear. No obstante, es posible que hacer gráficos más complejos mediante estos recursos no suponga una ventaja, siendo, en ese caso, más sencillo crear el gráfico mediante otro medio y simplemente cargarlo como imagen. Eso queda a la elección del usuario.

Documento. Accede desde este enlace al script con el que finaliza esta serie sobre automatización de presentaciones mediante python-pptx.

Gráficos. Python


Python-pptx. Gráfico
(2)





Tabla

Para las presentaciones que estamos pensando automatizar, las tablas son un componente gráfico interesante. Como gráfico podemos representarlas perfectamente mediante una captura de imagen, esto es, como una imagen simple, pero también es posible construirlas directamente basándonos en datos mediante python-pptx. Este será el tema de esta entrada.


Después de crear la nueva diapositiva (diapo5 = mi_presenta.slide_layouts[5]), de añadirla a la colección (diapo5 = mi_presenta.slides.add_slide(diapo5)) y de acceder a la colección de formas que contiene (formas = diapo5.shapes), esto por ser un modelo de diapositiva con título, y para poner título a la diapositiva (formas.title.text = 'Datos grupales básicos'), pasamos a trabajar con la tabla.

Aunque no es necesario, si resulta conveniente establecer a priori los valores de posicionamiento (x - y) y de  dimensiones de la tabla (cx - cy) (x, y, cx, cy = Inches(2), Inches(2), Inches(4), Inches(1.5)); después pasamos a crear la tabla propiamente dicha mediante la función add_table(), que consta de seis parámetros: dos de estructura de la tabla (filas-columnas), dos de posicionamiento y dos de dimensionado (tabla = formas.add_table(4, 3, x, y, cx, cy).table)

Tampoco es obligatorio, pero sí puede ser conveniente redimensionar las columnas para ajustarlas al contenido. Para ello utilizamos esta expresión ajusta a cada una de las columnas (aquí sólo reproduzco una: tabla.columns[0].width = Inches(2.5))

Ahora ya sólo nos queda escribir en las celdas su contenido: primero el nombre de las columnas (es este caso) (tabla.cell(0, 0).text = 'Estadístico') y después los valores (tabla.cell(1, 0).text = 'Media'). Recuerda que aquí únicamente presento aquí una muestra de cada una de estas instrucciones. Existen otras opciones de trabajo con tablas que puedes consultar en la web de la biblioteca, pero lo que se presenta en esta entrada (y en el script que la acompaña. Ver a continuación) tienes la información fundamental para trabajar con tablas sencillas, las que usarás con más frecuencia en tus presentaciones. 

Documento. En este acceso tienes el script que se explica en la entrada.


martes, 18 de marzo de 2025

MAV. Python


Python-pptx. Gráfico (1)






Imagen


Tras los textos, las imágenes son el componente más frecuente en una presentación informativa. Se trata generalmente de gráficos estáticos que simplemente son añadidos a la diapositiva por su función informativa y/o estética.


Los gráficos, y más en las presentaciones que aquí pretendemos automatizar, pueden reducirse en cuanto a tipología a imágenes externas que se incluyen en la presentación, pero también pueden especiales, como las tablas de datos y los gráficos estadísticos. En esta entrada trataré sobre el caso genérico, que podría ser suficiente para la mayoría de los casos, ya que tablas y gráficos se pueden convertir fácilmente en imágenes mediante el simple uso de la función captura de pantalla.

La inclusión de imágenes externas en una presentación es un proceso muy sencillo. Empieza accediendo a la imagen, bien mediante una dirección absoluta (img_path = 'D:/Aprendizaje.jpg' en el supuesto de la que imagen esté en el directorio raíz de la unidad D), bien relativa (img_path = 'Aprendizaje.jpg' cuando la imagen está en el mismo directorio que el script Python) y finaliza incluyendo la imagen en la diapositiva (pic = slide.shapes.add_picture(img_path, left, top)) mediante la función add_picture() que recibe tres parámetros:
  • el directorio donde se encuentra la imagen (variable asociada img_path)
  • y los posicionamientos cartesianos left y top bien como variables previamente asignadas (left = top = Inches(1)o bien mediante valores numéricos directos.
Recuerda que, al igual que con el text box, ese posicionamiento puede dar lugar a algunos problemas que habrá que solucionar probando los valores que mejor se ajusten a nuestras necesidades.

Entre ambos momentos, como es de esperar, está la creación de la diapositiva (también de tipo vacío, valor 6) (diapo4 = mi_presenta.slide_layouts[6])  y su añadido a la colección de diapositivas de la presentación (slide = mi_presenta.slides.add_slide(diapo4)).

Documento. Accede desde este enlace al nuevo script. También debes descargar esta imagen.


MAV. Python


Python-pptx (3)



Texto

Una vez creado el índice, entramos en la parte de la creación de la presentación en la que vamos dotando a ésta de contenido, y como ya dijimos, el contenido se va a concretar bien como contenido textual, bien como contenido gráfico. Vamos a tratar en esta entrada sobre cómo crear diapositivas con contenido textual.


Antes de empezar, deberemos importar dos utilidades de la biblioteca para que el script pueda acceder a las funciones necesarias (from pptx.util import Inches, Pt). Hecho esto, tenemos que crear una nueva diapositiva, que en este caso se ajusta al formato 6 (diapositiva vacía) (diapo3 =mi_presenta.slide_layouts[6]) y añadirla a la lista de diapositivas de la presentación (diapo3 = mi_presenta.slides.add_slide(diapo3)).

Viene a continuación un proceso no exento de cierta complicación: el dimensionado de lo que será el objeto text box (caja de texto), lo cual se realiza mediante una función (add_textbox()) que requiere cuatro parámetros numéricos, dos de posicionamiento (izquierda -left- y arriba -top- respecto a la diapositiva) y dos de dimensión (ancho -width- y alto -height- de la forma) todas ellas expresadas en pulgadas (1 pulgada = 2,54 cm), lo que hace que sea conveniente declarar previamente cuatro variables a las que asignar los valores respectivos (vg width = height = Inches(8)). Dado que ajuste del text box a la diapositiva es una cuestión de gustos, vas a tener que probar valores hasta que encuentres el que mejor se ajuste a tus necesidades, tarea esta que te puede llevar tiempo. Una vez que lo consigas puedes añadir la forma text box a la diapositiva (txBox = diapo3.shapes.add_textbox(left, top, width, height)) y definir la variable que te va  a permitir acceder a ella para escribir el contenido que desees (tf = txBox.text_frame)

Aunque no es prescriptivo, igual que te aconsejo trabajar con valores numéricos asociados a variables, también te aconsejo que utilices variables string para contener los textos que desees escribir; esto te facilitará la tarea siguiente (vg. titulo = "Los cuentos y los niños").

Y llega la hora de escribir el contenido en nuestro text box. Empezaremos por ponerle un título (tf.text = titulo), que no deja se ser un texto especial (por cómo es tratado y por la función que tiene) y paso seguido escribiremos el contenido, esto es, el párrafo o los párrafos que contendrá nuestro text box. Este proceso tiene dos fases:
  • Añadimos el párrafo al text box (p0 = tf.add_paragraph())
  • Y le damos contenido (p1.text = parrafo1)
  • Después podemos añadir formato al texto (p1.font.size = Pt(10)), aunque no siempre es necesario ni funciona como sería de esperar (eso también).
Cuando el texto (los párrafos) tiene una longitud que se ajusta al tamaño del text box y a la diapositiva como lienzo, no hace falta más ajustes; pero cuando la extensión del párrafo supera esas dimensiones se produce un efecto de desbordamiento que altera la visualización del contenido. En este caso es necesario llamar a una función que reajusta el texto al ancho del text box, generando automáticamente las líneas de texto necesarias, lo que evita que parte del texto que oculto. Esto es lo que hace la última línea de instrucciones de esta sección del script: tf.fit_text().

Documento: En este enlace puedes acceder al script que incluye el código explicado en esta entrada.


lunes, 17 de marzo de 2025

Gráficos. Python


Python-pptx. Índice.




Una vez que sabemos acceder a los objetos que componen una diapositiva, lo que nos ha servido para poner título a la presentación y añadir una breve explicación sobre el contenido, vamos a seguir aprendiendo a manejar otros componentes que normalmente forman parte de una presentación del tipo de las que nos interesa automatizar.


Para ello, siguiendo el listado de contenidos que expuse en la entrada precedente, vamos a tratar en ésta sobre el índice de la presentación. Este componente lo encontramos en el modelo 1 de diapositiva, el cual contiene un objeto título y un objeto de propósito general que nosotros, posteriormente utilizaremos para incluir nuestro índice. Para crear este modelo de diapositiva, primero la creamos del mismo modo que hicimos con la primera (diapo2 = mi_presenta.slide_layouts[1]), aunque especificando que será de tipo 1, y después a añadimos a la lista de objetos diapositivas del objeto presentación (diapo2 = mi_presenta.slides.add_slide(diapo2)). Como ves, se trata del mismo procedimiento que nos sirvió para crea la primera diapositiva y que nos servirá para crear las siguientes.

Una vez creada la diapositiva procedemos a poner el título, que será el mismo que pusimos en la primera diapositiva, aunque podría ser uno específico ("ÍNDICE", por ejemplo). En este caso el procedimiento que empleamos para poner el título en la diapositiva anterior lo vamos a desarrollar en dos fases, pero el resultado es el mismo, por lo que se trata simplemente de un procedimiento alternativo (bien podría ser como sigue: titulo2 = diapo2.shapes.title):
  • Primero accedemos a la clase formas de la clase diapositiva (formas = diapo2.shapes)
  • Y después a la forma title (título) presente en nuestra diapositiva en función del modelo (de diapositiva) que solicitamos crear en el paso anterior (titulo2 = formas.title)
  • Finalmente añadimos el texto (titulo2.text = "Presentación con python.")
Ahora estamos en disposición de entrar en materia, esto es, de escribir el índice que deseamos en la segunda forma, para lo que deberemos acceder a ella (esquema = formas.placeholders[1]) y después la conformamos como nos interesa (tesquema = esquema.text_frame), esto es, como un text_frame, ya que inicialmente se trata de un contenedor de tipo general (placeholders). Observa que hemos utilizado la variable formas que dotamos de contenido antes, dando ahora sentido al procedimiento explicado.

Aunque en nuestra presentación hemos optado por incluir contenido del nivel superior (tesquema.text = "Índice de contenidos."), podemos prescindir de ello, según el modo en que pensemos redactar el índice. Por ejemplo podemos hacer que el título principal de la diapositiva sea "ÍNDICE" y el índice propiamente dicho no tenga título, ocupando los epígrafes principales ese nivel. Te animo a que investigues esta opción.

Dejando pendiente esta cuestión, vamos a ver cómo incluimos los contenidos del esquema y cómo identificamos el nivel al que pertenece. Para ello tomaré como ejemplo el primer componente, ya que el resto se resuelve por repetición del procedimiento.
  1. Añadimos el parágrafo a la lista del conjunto de objetos parafraph (p1 = tesquema.add_paragraph())
  2. Dotamos de contenido textual a ese elemento (p1.text = "Título y subtítulo")
  3. Y finalmente indicamos el nivel al que pertenece (p1.level = 1), que en este caso es el primer nivel, pero que en otros, como el asignado a la variable p4a es el segundo (p4a.level = 2)
La repetición de este procedimiento nos permite crear, de forma sencilla, el índice de la presentación. Dado que se trata de una mera repetición de las mismas instrucciones, no es difícil simplificar el procedimiento mediante el uso de listas y bucles, pero de momento es incluso preferible que lo hagamos de forma repetitiva para asegurarnos el dominio de dicho procedimiento.

Documento. En este enlace puedes acceder al script que incluye el código explicado en esta entrada. Incluyo una modificación de la estructura del script para mejorar la diferenciación de sus partes.

domingo, 16 de marzo de 2025

MAV. Python


Python-pptx. Título y subtítulo.




Como dije en la entrada anterior, dedicaré una serie de entradas a explicar el uso de la librería python-pptx para automatizar la creación de diapositivas Power Point. Pero antes de exponer estos procedimientos, me parece de interés concretar los contenidos mínimos que podemos pedirle a una presentación automatizada, ya que, de no ser así no es de extrañar que nos podamos perder ante el inmenso abanico de posibilidades que están a nuestra disposición; muchas de las cuales no nos aportan gran cosa en lo que hace referencia a nuestros objetivos, que son bastante modestos, en realidad.


Definir adecuadamente nuestro propósito es un punto de partida necesario, así que no es redundancia repetir aquí lo que ya enunciamos en otro momento: las presentaciones que tratamos de automatizar se identifican como tales por partida doble: por el soporte en el que se desarrollan y por el objetivo que cumplen (se trata de soportes "presentación" para la presentación de información). Lo segundo delimita claramente qué sí y qué no vamos a hacer (ni ejercicios, ni cualquier tipo de animación gráfica, ni juegos) ; lo primero es obvio, pero también tiene ciertas implicaciones, como la de que para crear otro tipo de documentos de aprendizaje mediante python, deberemos recurrir a otros medios (python-pptx no nos sirve para esos otros fines).

Y una presentación que trata de informar sobre una evaluación grupal o del resultado del análisis de unos datos debe contar con un mínimo de recursos en términos de servicio-soporte:
  1. Un título informativo
  2. Un índice
  3. Un contenido textual
  4. Y un contenido gráfico.
Únicamente cabe la posibilidad de establecer diferentes tipos de elementos gráficos, en función de la disponibilidad que ofrece python-pptx, ya que sería suficiente con un tipo gráfico genérico (soporte imagen), pero ya que es posible, puede ser interesante diferenciar entre la imagen, la tabla de datos y el gráfico estadístico; resulta que, además, los tres son de especial utilidad para nuestros fines.

Es cierto que otros tipos de presentaciones informativas pueden requerir otros componentes, pero con los indicados en nuestra lista es posible crear ese tipo de documentos, siempre y cuando no aspiremos a un amplio despliegue de transiciones y transformaciones, claro está; aunque personalmente considero que, salvo que busquemos objetivos específicos (como una demostración, por ejemplo), esos "dinamismos" tienen más inconvenientes que ventajas, siendo el principal de ellos el convertirse en fines en si mismos.

Dicho esto, para empezar la senda que nos hemos marcado, bueno será que empecemos por el principio: cómo crear una diapositiva que contenga el título de la presentación y una breve información complementaria. Para ello partiré del script creado en la entrada anterior, procedimiento que seguiré en las sucesivas hasta completar el proceso que se describe anteriormente.

En primer lugar, el tipo o patrón de diapositiva que creamos (diapo1 = mi_presenta.slide_layouts[0]) (en negrita) responde al tipo deseado, ya que contiene dos objetos: el título y el subtítulo, así que pasamos a trabajar con cada uno de ellos:
  • Para el título, accedemos a la forma (titulo = diapo1.sahpes.title) y le añadimos el texto (titulo.text = "Presentación con Python")
  • Y para el subtítulo, poco más o menos lo mismos:
    • Accedemos al objeto (subtitulo = slide.placeholders[1])
    • Y añadimos su contenido textual (subtitulo.text = "Elementos básicos de una presentación informativa.")
Como has podido ver, resulta sumamente sencillo acceder a los objetos que componen una diapositiva, tanto como crear la presentación y la propia diapositiva, siendo esta la principal ventaja de trabajar con python-pptx (en relación a hacerlo con OOo Basic).

Documento. En este enlace puedes acceder al script Python completo y actualizado, en realidad el segundo de esta serie.

Nota. Observa que en ambos script he establecido como dirección para guardar la presentación el directorio raíz de la unidad D. Si prefieres otra ubicación, deberás modificar esta línea de código.

Evaluación. Soportes.

Presentaciones con python-pptx


Sin salirme del ámbito tipológico de la presentación de información, cuando el objetivo es exponer resultados a un colectivo, sea esta actividad una sesión de formación o de devolución de información a familiar, alumnado o profesorado,  es una práctica habitual y generalizada en distintos ámbito profesionales hacerlo mediante una presentación tipo ppt.


En realidad este icono no resulta apropiado para la entrada actual, aunque es pertinente como marca de ubicación de la entrada en la sección Aprendizaje, si bien tampoco esta decisión está exenta de controversia: perfectamente podría incluirla como parte de la sección Evaluación, e incluso de la sección Datos, ya que su uso resulta coincidente, en lo fundamental, con la elaboración de informes de evaluación (sólo que colectiva y dirigida a un colectivo) o con la elaboración de documentos informativos de síntesis del análisis de datos). Pero no deja de ser una genuina expresión del uso expositivo del servicio ofimático de presentación y no es desdeñable el uso de que éste se realiza precisamente en actividades de formación, así que su tratamiento dentro de esta sección Aprendizaje está justificado.

De hecho podemos considerar secundaria esta discusión, ya que lo que caracteriza esta forma de uso del servicio es que lo que se pretende automatizar es la propia elaboración de la presentación. Al hacerlo también contribuimos a automatizar la elaboración de estos informes, lo que forma parte del proceso de automatización de la evaluación (sección Evaluación) y del análisis de datos (sección Datos).

No es que no sea posible realizar este procedimiento mediante OOo Basic, pero esta es una opción disponible que resulta mucho más sencilla de implementar mediante el lenguaje Python.

Para finalizar esta entrada, presentaré el código necesario para crear una presentación simple empleando ambos lenguajes (OOo Basic y Python).

Sub CrearPresenta

Dim sRuta As String, sRutaGuardar As String
Dim mArg()
Dim oPresenta As Object
Dim mOpciones(0) As New "com.sun.star.beans.PropertyValue"

'Crear presentación
sRuta = "private:factory/simpress"
oPresenta = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg() )
 
'Añadir nuevas diapositivas
Dim NuevaDiapo As Object
Dim i As Integer

'Creamos un bucle para añadir x número de diapositivas en blanco
For i = 1 To 4 
NuevaDiapo = oPresenta.DrawPages.InsertNewByIndex(i)
Next

'Guardar la presentación
sRutaGuardar = ConvertToUrl ("C:/Users/XXXXX/Desktop/MiPresenta.odp")
oPresenta.storeAsUrl(sRutaGuardar, mOpciones())

End Sub

Desde un servicio LO (Calc, por ejemplo), y mediante OOo Basic, lo primero que hacemos, tras declarar las variables necesarias, es crear la presentación desde cero. Para ello, y por medio de la variable sRuta, llamamos primero al servicio impress (sRuta = "private:factory/simpress"), el cual empleamos después como uno de los tres parámetros necesarios para la función de creación propiamente dicha (oPresenta = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg() )). De este modo la presentación pasa a estar asociada a la variable oPresenta, o que facilita el desarrollo posterior del script.

La presentación así creada cuenta con una primera diapositiva de tipo Título - Subtítulo, ambos vacíos, por lo que el paso lógico que sigue sería dotar de contenido a ambos, cosa que no resulta tan sencillo de hacer, por lo que he podido comprobar. 


Como este contenido es evidentemente insuficiente, necesitamos aumentar el número de diapositivas, cosa que podemos hacer sin demasiada dificultad, automatizando incluso el procedimiento mediante un bucle. 
Para ello, y sobre la variable pertinente (Dim NuevaDiapo As Object), mediante un bucle For (For i = 1 To 4 ) creamos un total de cuatro nuevas diapositivas en blanco (sin componente alguno) mediante la función InsertNewByIndex() del objeto DrawPages (NuevaDiapo = oPresenta.DrawPages.InsertNewByIndex(i)). Este procedimiento (que no es el único) permite automatizar la creación del número de diapositivas que se necesiten, siendo suficiente con incrementar el valor final de la variable  (contador), si bien su valor inicial tiene que ser necesariamente 1, y no 0, ya que el procedimiento de creación de la presentación incluye crear la diapositiva 0.

Para finalizar, y aunque no es imprescindible, he añadido el código necesario para guardar la presentación creada (que no para guardarla y cerrarla). Este procedimiento se realiza en dos fases:

Primero identificamos dónde se va a guardar la presentación (sRutaGuardar = ConvertToUrl ("C:/Users/XXXXX/Desktop/MiPresenta.odp")) mediante la función ConvertToUrl() que incluye el string con la ruta completa (observa que debes adaptarla a tu caso concreto)

 Y después la guardamos (oPresenta.storeAsUrl(sRutaGuardar, mOpciones())) mediante la función storeAsUrl()

No voy a insistir en lo obvio, pero es evidente que con esto poco tenemos avanzado en la automatización de presentaciones; y no resulta sencillo ir mucho más allá. De hecho existe una página web sostenida por personas con amplios conocimientos técnicos (wiki.open-office.es) en la que no he encontrado las soluciones a los problemas que deberíamos resolver para automatizar la creación de una presentación. En realidad es posible encontrar en la web algún ejemplo de que se puede hacer, pero no ha sabido adaptar estos ejemplos a necesidades reales, por lo que se quedan en meros atisbos de posibles soluciones.

Donde la búsqueda resulta mucho más satisfactoria es en el mundo Python. Podemos trabajar con una librería que deberemos tener instalada previamente (pip install python-pptx) y con la que es posible crear presentaciones Power Point (las cuales podemos visualizar también desde Impress, como ya sabemos). A explicar cómo trabajar con esta librería dedicaré algunas entradas, aunque hora me limitaré a exponer cómo crear una presentación.

from pptx import Presentation

#Crear la presentación

mi_presenta = Presentation()

#Añadir una diapositiva

diapo1 = mi_presenta.slide_layouts[0]

diapo1 = mi_presenta.slides.add_slide(diapo1)

#Guardar presentación

mi_presenta.save("C:/Users/xxxx/Desktop/presenta_uno.pptx")

A primera vista este script parece más sencillo que el anterior, empezando por ser más breve y también más simple, al menos en algunas de sus partes. Dejando al margen la instrucción con la que se inicia el script (from pptx import Presentation), obligada al tratarse de una librería no standard que hemos tenido que instalar previamente, la creación de la presentación resulta más sencilla en python que en OOo Basicmi_presenta = Presentation() instanciando la clase mediante la función Presentation() en python frente la complejo procedimiento que se requiere en OOo Basic, en el que son necesarios dos pasos (sRuta = "private:factory/simpress" y oPresenta = StarDesktop.loadComponentFromURL( sRuta, "_default", 0, mArg())).

Algo similar podemos observar en el procedimiento de guardado de la presentación que hemos creado: también en este caso en python es suficiente con una sencilla instrucción (mi_presenta.save("C:/Users/xxxx/Desktop/presenta_uno.pptx")) basada en la función save(), mientras que en OOo Basic necesitamos dos instrucciones y de mayor complejidad, como pudimos ver antes. 

Cierto que mediante OOo Basic, cuando creamos una presentación, creamos directamente una primera diapositiva, mientras que el python necesitamos crearla ex-profeso también en dos pasos:
  • Mediante el primero creamos el objeto diapositiva, un tipo concreto de modelo de diapositiva, para ser más precisos (diapo1 = mi_presenta.slide_layouts[0])
  • Y en el segundo añadimos ese objeto recién creado a la colección de dispositivas de la presentación (diapo1 = mi_presenta.slides.add_slide(diapo1)).
Teóricamente deberemos repetir estas dos operaciones cada vez que queramos crear una nueva diapositiva; por lo que en esto, OOo Basic parece ser más sencillo, aunque en realidad no lo es tanto, ya que también podemos hacer uso de bucles para agilizar la creación de diapositivas en python. Pero en realidad, donde está la ventaja de python es en la posibilidad de acceder a los objetos de que consta la diapositiva o que se pueden implementar en ella. A demostrar esto dedicaremos las entradas que siguen.