domingo, 16 de marzo de 2025

Aprendizaje. Python-pptx

Presentaciones con en 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.

No hay comentarios:

Publicar un comentario

Comenta esta entrada