El paquete Office de Microsoft desgraciadamente es omnipresente en casi todas las empresas de España. Y digo desgraciadamente porque, por experiencia, muchos usuarios lo usan para tareas «ridículas».

A ver tío... no te flipes tanto. Es una suite ofimática con programas serios que permiten crear y analizar muchísimos datos, crear documentos complejos y...

Que sí, que sí, Usuario Anónimo. No voy a discutir en absoluto que es un conjunto de programas que son muy útiles y pueden abarcar muchas tareas. Sin embargo hay dos tipos de usuarios que suelen traer de cabeza a muchos administradores de sistemas:

Por un lado es frecuente ver el usuario que hace cosas tremendamente simples: tablas de Excel cortitas y normalitas, documentos de Word con poco más que algo de texto y alguna imagen, pero como les digas de usar Libreoffice para esas tareas te ponen el grito en el cielo diciéndote que «Libreoffice es una porquería». Sin embargo Libreoffice es una suite ofimática más que capaz para pequeñas tareas (y no tan pequeñas) y el coste de usarlo es cero, por lo que eso es lo que deberían estar usando. Usar Microsoft Office para pequeños documentos es como comprarse un Mac Pro de 15.000 euros sólo para navegar por internet. Se puede hacer, pero estás tirando el dinero y no es una opción lógica cuando existe mucho software libre y gratuíto para ello.

Y por otro lado está el usuario «pro» pero que al final se mete él sólo en problemas por obsesionarse en hacer cosas que no se deben hacer. El típico usuario que mete mil fórmulas en un documento de Excel que acaba colgándose estrepitosamente por circularidad o errores en ellas, o que mete tropecientas fotos en sus documentos de Word, Excel o Powerpoint sin haberlas redimensionado antes, poniendo como excusa que esos programas pueden manejarlas perfectamente.

¿Cómo que sin haberlas redimensionado? Yo para poner una foto en una presentación de Powerpoint la arrastro al Powerpoint y ahí que se me queda. Así de fácil. ¿Por qué quieres que redimensione nada?

Pues por un motivo muy simple: al igual que en otras facetas de la vida, en un Powerpoint el tamaño sí que importa.

Ehhhh... acabas de despertar mi intriga. Sigue, sigue.

Las fotos que podemos sacar en la actualidad con nuestros teléfonos móviles tienen una calidad estupenda, pero también tienen dos problemas muy gordos:

Por un lado, los dispositivos digitales al almacenar las fotos normalmente las comprimen. Comprimir una foto significa siempre hacer que la foto pierda calidad. Salvo que tengas una cámara profesional y saques las fotos en formato «RAW», lo normal es que la cámara te las ofrezca en un formato estandar como el «jpg». Y eso significa que la imagen tiene compresión y no es todo lo buena que podría ser.

Por otro lado hay gente que se cree que por tener el iPhone de generación más alta va a sacar fotos como si tuviera una cámara Reflex. Sin embargo la óptica de un teléfono y el sensor del teléfono están en un espacio diminuto que impide sacar fotos con la calidad que podríamos tener con una cámara normal, y al final eso se traduce sobre todo en ruido en la imagen.

¿Ruido en la imagen? ¿Eso no es como hablar de brillos en el sonido? ¿u olores en el tacto?

No Usuario anónimo. Si quieres saber con profundidad qué es el ruido en una imagen y cómo combatirlo al tomar una fotografía hay páginas que te lo pueden explicar de maravilla, pero quedaos con que simplemente son… puntitos de colores que aparecen sobre todo cuando la iluminación de una foto no es la correcta. Fijaos en esta foto.

Bola de navidad

Mirad bien la bola que marco en el recuadro. El lado iluminado es liso, pero el que está en sombra está lleno de «puntitos» o «granitos» (de hecho si te fijas los puntitos están en muchas más zonas de ese recorte). Eso es el ruido en una imagen. Esta imagen es una parte minúscula de una foto muchísimo más grande (30 Mb) que ha sido tomada con una cámara de un iPhone de última generación. De hecho, la foto de origen es tan grande si la pusiera en un monitor FullHD con el tamaño original, posiblemente la altura de la foto serían…. unos 4 metros.

¡Qué barbaridad! ¿Pero por qué se ha sacado así?

Para un diseñador gráfico puede estar bien ver algunos detalles, pero evidentemente si quiero poner esa foto completa (no sólo ese detalle) en un documento de Powerpoint, debería reducir el tamaño de la foto hasta dejarla en un 8% del tamaño original (o incluso menos). Si pongo la foto con el tamaño original el problema del ruido desaparece porque no se ve (es tan pequeño que es completamente imperceptible), pero el tamaño en disco del documento ha aumentado en el tamaño del peso total de la foto (y en esta foto en concreto eran 30 Mb). Si previamente he reducido el tamaño de la foto (en píxeles de ancho y alto), el ruido tampoco se va a ver (porque aparece en detalles muy pequeños) y no notaremos diferencias de calidad perceptibles, pero habremos conseguido que el documento pese 29 megas menos.

Resumiendo: las fotos de nuestro teléfono están comprimidas y tienen ruido en la imagen. Al ponerlas tal cual en documentos de Powerpoint tenemos que reducir el tamaño de las mismas muchísimo porque si no no cabrían en el documento. Entonces ¿Por qué las tratamos como si fuésemos fotógrafos profesionales y las ponemos a saco en documentos sin redimensionarlas antes? Si las redimensionamos antes de insertarlas no vamos a notar en absoluto la pérdida de calidad (da igual reducir el tamaño antes que después). Ha llegado el momento en que debes reconocerlo: tu foto por muy bonita que sea es un truño porque engorda enormemente el tamaño del archivo, así que reducir el tamaño de la foto hará que el mundo sea un lugar mejor.

Venga, te lo compro. Pero reconócelo. Eso de reducir el tamaño de una foto antes de ponerla en un documento Powerpoint no lo hace nadie. 

Y por eso estoy escribiendo este artículo, Usuario Anónimo. Me he encontrado con el caso de una empresa que para sacar el trabajo adelante iba haciendo literalmente miles de documentos Powerpoint de esta misma forma, usando fotos sin redimensionar. Es más… muchos de esos documentos eran copias unos de otros (con las mismas fotos) pero sólo con pequeños cambios en los textos.

Esto puede parecer que no es un problema… hasta que te encuentras con decenas o cientos de gigas en documentos que deberían ocupar entre todos 200 megas a lo sumo. La bola de nieve que supone el «tirar para adelante para sacar el trabajo cuanto antes» se va haciendo cada vez más grande hasta que al final acabas con el espacio de tu servidor de archivos saturado por no usar correctamente el Powerpoint.

Venga, vale. Entonces debo reducir el tamaño de las imágenes antes de ponerlas en un Powerpoint. Pero ¿Como hay que hacer para solucionar lo de todos los powerpoints superpesados que se han creado hasta ahora?

Podemos enfocar la solución de dos formas, dependiendo de si son pocos los documentos afectados o son muchos. Vamos a ver qué podemos hacer para resolverlo:

Caso 1: Reducir el tamaño de las imágenes cuando tenemos pocos documentos afectados.

Si tenemos un volumen pequeño de documentos «inflados», podemos plantearnos una opción que nos permite el propio Powerpoint para reducir el tamaño del archivo (y que, por cierto, también está implementada en Excel y en Word), que no es otra que optimizar el tamaño de todas las fotos desde el propio programa.

Para ello debemos hacer lo siguiente:

  1. Seleccionamos una imagen cualquiera del Powerpoint (O Excel o Word).
  2. Nos vamos a la pestaña «Formato de imagen».
  3. Seleccionamos la opción «Comprimir imágenes».

4. En la ventana que nos aparece, desmarcamos la opción «Aplicar sólo a esta imagen» y marcamos la opción «Web». (podemos darle a alguna otra opción en caso de que queramos mejor calidad a costa de más espacio).

Al aceptar el diálogo, el problema habrá quedado resuelto. Por ejemplo, acabo de reducir el tamaño de este powerpoint que pesaba 82 Mb…

a un tamaño de poco más de 3 Mb.

Y al abrir el Powerpoint todo se ve exactamente igual. Cero problemas.

Madre mía. ¿Todo ese espacio se estaba desperdiciando? ¡Menos mal que era un único archivo!

Sí pero por desgracia yo me he encontrado con éste caso. Mira.

Son 2.174 archivos de Powerpoint repartidos por una infinidad de carpetas que pesan un total de 19,1 Gb, y casi todos son iguales pero necesarios.

Bueno... es armarse de paciencia y repetir el paso anterior... 2.174 veces para reducir el tamaño de todos los archivos. Hala. Paciencia.  

Sí, claro. Pero hay una forma mejor. Vamos a verla.

Caso 2: Reducir el tamaño de las imágenes cuando tenemos un montón de documentos afectados en una infinidad de carpetas.

Aquí tenemos un problemón gordo. Podéis buscar por internet y consultar las opciones que da microsoft, pero en powerpoint no hay forma de reducir el tamaño de tantos archivos a la vez. Tal vez encuentres alguna herramienta de pago que lo haga, pero en este blog somos muy cabezones y todo lo que no sea software libre y a ser posible gratis no nos gusta.

Desgraciadamente no encontramos nada en internet que nos solucionase el problema. Así que después de mirar mucho entre Pablo Nistal, un antiguo compañero de departamento y gran amigo mío y yo mismo, nos pusimos a averiguar cómo podíamos solucionarlo.

Después de darle mucho a la cabeza, descubrimos que los archivos de Office (Powerpoint, Excel o Word) son algo similar a archivos ZIP comprimidos que se pueden abrir incluso con un descompresor libre como el 7-zip. Dentro de ese archivo, en la ruta /ppt/media están las imágenes que vemos dentro del documento. Sin retocar ni comprimir y en el mismo formato en el que se han añadido al documento.

Sí. Yo también me sorprendí al ver el interior de un Powerpoint
Me acabas de dejar con el culo roto. ¿Esto no es una chapuza por parte de Microsoft?

Pues no lo tengo claro. De hecho con los archivos ODP de LibreOffice ocurre lo mismo. Supongo que es una práctica habitual para este tipo de archivos.

Con ese dato, lo primero que se nos pasó por la cabeza es coger una imagen de dentro del archivo de Powerpoint (extraerla del archivo con 7Zip), reducir el tamaño de la misma externamente (Es decir, que en lugar de ocupar, por ejemplo, 4000 pixeles de alto, que ocupe 600) y volver a ponerla dentro del documento ya modificada (en la misma ruta y con el mismo nombre). Sin embargo no era tan sencillo, porque al abrir el Powerpoint la imagen se hacía pequeña en la misma medida en que la reducíamos. Lo que debíamos hacer era primero reducir el tamaño en píxeles y luego estirar la foto (en centímetros) en la misma proporción para que la imagen siguiera ocupando el mismo tamaño aparente en el documento (aunque tuviera menor resolución).

Perfecto. Ya sabíamos el procedimiento correcto. Ahora el tema es ponerlo en práctica. Después de dar varios bandazos la mejor opción fue usar desde Windows un pequeño script de Python.

Espera, espera... Yo no tengo ni pajolera idea de programación. ¿No me estarás metiendo en un fregao con esta cosa de Python?

No te preocupes. Va a ser tan sencillo que hasta un verdadero negado con los ordenadores como tú lo va a poder hacer.

Bueno, menos mal. Pero... espera un momento... ¿Qué me acabas de...?

Centrémonos en la solución. Existen módulos de Python que si los importas te permiten manejar un montón de cosas en algunos tipos de archivos, como archivos comprimidos e imágenes, así que en principio parece posible automatizar algo para reducir el tamaño de las fotos que hay dentro de los archivos pptx. Veamos cómo podemos hacerlo.

1) Descargamos python en nuestro ordenador.

Primero debemos ir a la siguiente página:

https://www.python.org

Desde ahí nos vamos a la sección «Downloads» y nos bajamos la última versión de Python para Windows.

A fecha de realizar este artículo, la última versión disponible es ésta, pero puede que haya alguna versión superior cuando lo leáis.

2) Instalamos Python en nuestro equipo Windows.

Para instalar Python, en lugar de hacer doble click en el instalador, vamos a pulsar en el archivo con el botón derecho del ratón y en el desplegable seleccionaremos la opción «ejecutar como administrador». Eso nos lanzará el instalador, pero ojo: Debemos marcar las opciones «Use admin privileges when installing py.exe» y «Add python.exe to Path». Sobre todo la última opción es fundamental para poder realizar todos los pasos correctamente.

Uy... yo ya le di a instalar y me olvidé de marcar esas opciones. 

Pues lanza de nuevo el instalador y selecciónalas. Son importantes.

Al terminar la instalación, aseguraos también de marcar la opción «Disable path lenght limit». No vamos a usar esa opción, pero es útil.

3) Instalamos el complemento Pillow

Para poder hacer lo que queremos, vamos a tener que instalarle un complemento a Python, que se llama «pillow». Pillow es una biblioteca de Python que proporciona una amplia gama de funcionalidades para trabajar con imágenes. Permite cargar imágenes en un montón de formatos diferentes, reducir el tamaño de las mismas, recortarlas, rotarlas, etc…

Nuestro script de Python va a usar este complemento para reducir las imágenes que tenemos dentro de los powerpoints.

Instalarlo es muy sencillo. Primero vamos a desplegar el menú inicio de Windows y vamos a buscar la aplicación «CMD». Vamos a pulsar encima de ella con el botón derecho del ratón y luego pulsaremos «Ejecutar como administrador».

En la ventana del símbolo de comandos, debemos ejecutar el siguiente comando.

pip install pillow

Os debería aparecer algo como esto, indicando que la instalación se ha realizado con éxito.

A mi me dice que el comando no se reconoce.

Eso significa que durante la instalación de Python no has marcado la casilla «Add python.exe to path». Repite esa instalación, anda.

Ah, y no cierres la línea de comandos. La vamos a usar dentro de un momento.

4) Averiguamos la ruta dónde están nuestros archivos.

Antes de ponernos a ejecutar el script, debemos tener clara la ruta dónde están los archivos PPTX que queremos redimensionar.

¡Pero es que yo tengo diseminados esos archivos en un montón de carpetas!

Pues no hay problema. Simplemente debes ser capaz de localizar la carpeta con la ruta más baja que tiene archivos de Powerpoint. Me explico: Si los archivos están distribuidos tal que así…

c:\archivos\archivo1.pptx
c:\archivos\carpeta1\archivo2.pptx
c:\archivos\carpeta1\subcarpeta1\archivo3.pptx
c:\archivos\carpeta2\archivo4.pptx

… en ese caso la ruta más baja sería c:\archivos. Buscamos la ruta a partir de la cual tenemos los archivos que nos interesan.

Ya, pero en esas rutas hay un montón de archivos de otros tipos que no quiero que toque el script. 

No te preocupes por eso. El script únicamente va a tocar los archivos PPTX. Si se encuentra con otros tipos de archivos no los va a tocar.

Eso sí… sería una buena idea hacer una copia de seguridad de esas carpetas. Siempre que se hacen cosas así, el procedimiento antes de lanzar un script de estas características es lanzar una copia de seguridad del sistema. El script no tiene por qué hacer nada mal, pero sed siempre precavidos.

En fin… apuntad esa ruta. En el ejemplo que os voy a poner voy a suponer que la ruta es C:\archivospptx .

5) Lanzamiento del script para reducir el tamaño de los archivos.

Ahora llega el momento de la verdad. Descargaos el script desde este enlace:

Descargar el script

En todo caso os voy a poner el código que contiene aquí, para que lo examinéis previamente.

import os
import zipfile
import shutil
from PIL import Image
import logging
import csv
#
#
# MODIFICAR ESTAS LÍNEAS.
# ESTA ES LA RUTA DONDE ESTAN LOS ARCHIVOS .pptx (y subcarpetas) Y LOGS
archivo_csv = r'C:\archivospptx\copiar_pptx.csv'
ruta_pptx = r'C:\archivospptx'
archivo_logs = r'C:\archivospptx\comprimir_pptx.log'
# NO MODIFICAR NADA MAS DEL SCRIPT
#
#
#Configuración de los logs
logging.basicConfig(filename=archivo_logs, level=logging.INFO,
                    format='%(asctime)s:%(levelname)s:%(message)s')
def comprimir_imagen_en_zip(zip_path, calidad=80):
    try:
        temp_extract_path = 'temp_extract'
        os.makedirs(temp_extract_path, exist_ok=True)
        with zipfile.ZipFile(zip_path, 'r') as zip_ref:
            zip_ref.extractall(temp_extract_path)
        for root, dirs, files in os.walk(temp_extract_path):
            for file in files:
                full_path = os.path.join(root, file)
                if file.lower().endswith(('.png', '.jpg', '.jpeg')):
                    img = Image.open(full_path).convert('RGBA')
                    # Verificar si hay transparencia real
                    if any(pixel[3] < 255 for pixel in img.getdata()):
                        # Si hay transparencia, no procesar la imagen
                        continue
                    # Convertir a RGB para guardar en formato JPEG
                    img_rgb = img.convert('RGB')
                    # Reducir tamaño y guardar si supera los 1080px en alguna dimensión
                    if img_rgb.width > 1080 or img_rgb.height > 1080:
                        img_rgb.save(full_path, format='JPEG', quality=calidad)
                        # Reducir tamaño a la mitad
                        nuevo_ancho = img_rgb.width // 2
                        nuevo_alto = img_rgb.height // 2
                        img_resized = img_rgb.resize((nuevo_ancho, nuevo_alto), Image.LANCZOS)
                        # Guardar la imagen comprimida sobrescribiendo la original
                        img_resized.save(full_path, format='JPEG', quality=calidad)
                    else:
                        # Guardar sin modificar si no supera los 1080px
                        img_rgb.save(full_path)
        # Mover la recomposición del .pptx fuera del bucle
        with zipfile.ZipFile(zip_path, 'w') as zipf:
            for root, dirs, files in os.walk(temp_extract_path):
                for file in files:
                    file_path = os.path.join(root, file)
                    zipf.write(file_path, os.path.relpath(file_path, temp_extract_path))
        shutil.rmtree(temp_extract_path)
        return True
    except Exception as e:
        logging.error(f"Error al procesar el archivo {zip_path}: {e}")
        return False
def procesar_todos_los_pptx(ruta, csv_file):
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        csv_writer = csv.writer(file)
        for root, dirs, files in os.walk(ruta):
            for archivo in files:
                if archivo.endswith(".pptx"):
                    ruta_completa = os.path.join(root, archivo)
                    print(f"Procesando: {ruta_completa}")
                    if comprimir_imagen_en_zip(ruta_completa):
                        logging.info(f"Procesado exitosamente: {ruta_completa}")
                        csv_writer.writerow([ruta_completa, 'Éxito'])
                    else:
                        logging.error(f"Error al procesar: {ruta_completa}")
                        csv_writer.writerow([ruta_completa, 'Error'])
procesar_todos_los_pptx(ruta_pptx, archivo_csv)
logging.info("Pablo-Nistal-y-Marcos-Matas")

Os voy a enseñar un ejemplo que tengo en el equipo para que veáis cómo funciona. Tengo en la carpeta c:\archivospptx tres archivos de Powerpoint muy engordados. También tengo una carpeta dentro de ella con otro archivo .pptx y dentro de ella otra carpeta más de nuevo con otro archivo. En total son 5 archivos. Vamos a hacer que el script nos los adelgace.

Vamos a ir al archivo que hemos descargado con el script, lo clickamos con el botón derecho del ratón y pulsamos sobre «Editar con el block de notas». Me interesa que editéis las siguientes líneas que están casi al principio de todo del script.

#
#
# MODIFICAR ESTAS LÍNEAS.
# ESTA ES LA RUTA DONDE ESTAN LOS ARCHIVOS .pptx (y subcarpetas) Y LOGS
archivo_csv = r'C:\archivospptx\copiar_pptx.csv'
ruta_pptx = r'C:\archivospptx'
archivo_logs = r'C:\archivospptx\comprimir_pptx.log'
# NO MODIFICAR NADA MAS DEL SCRIPT
#
#

Vamos a cambiar las tres rutas que se nos indican. Os digo que hay que poner en cada una de ellas:

  • archivo_csv: En ese archivo se registrará el resultado del procesamiento de cada archivo .pptx. Va a guardar la ruta completa del archivo .pptx junto con un estado que indica si el procesamiento fue exitoso o fallido.
  • Ruta_pptx: Es la ruta dónde están nuestros archivos.
  • archivo_logs: Es un archivo similar al CSV pero con informes más detallados. Lo que hace es capturar todos los eventos a lo largo del procesamiento de cada archivo.

Una vez definidas esas tres rutas, vamos a ir a la línea de comandos que teníamos abierta y vamos a ejecutar por fin el script de esta forma:

python script.py

Debería aparecernos algo como ésto.

Y los archivos, que antes pesaban más de 30 megas, ahora nos pesan varias veces menos de lo que pesaban. Como podéis ver, se han guardado dos archivos a mayores con registros de lo que ha hecho el script, por lo que todo está controlado. En este ejemplo no hay archivos de ningún otro tipo, pero si los hubiese, el script los ignoraría por completo.

6) Entendiendo lo que hace el script.

¿Cómo conseguimos que el script haga esto? Muy sencillo. El script se mete dentro de cada archivo y busca imágenes. Si encuentra una imagen y sus dimensiones son menores que 1080 puntos de alto o 1080 puntos de ancho la ignora por completo (no se reduce).

Si la imagen sí que tiene más de esas dimensiones la guarda en un formato que ocupa menos espacio, sin que pierda mucha calidad. También la reduce de tamaño a la mitad para que ocupe aún menos espacio y luego la estira. Por cierto, si una imagen tiene partes transparentes, el script decide no modificarla para evitar que se vea mal.

Esto lo repite para cada una de las imágenes y anota todo en los logs para que veamos qué cambios ha hecho.

Pero entonces ¿las imagenes de menos de 1080 puntos de ancho o de alto no las toca?

No. Hemos visto casos en los que la persona que hace el powerpoint mezcla imágenes que están ya bien dimensionadas con imágenes enormes. Si aplico la misma regla a todas las imágenes, las imágenes pequeñas se dejan de ver bien, así que las que son más pequeñas de esas dimensiones es mejor dejarlas como están.

Pero entonces si hacemos lo que dijiste antes que hace el propio powerpoint es más eficiente y permite comprimir más los archivos PPTX ¿no?

Efectivamente. Pero si hay que hacerlo para un volumen enorme de archivos no queda otra que optar por una solución como la que os acabo de exponer.

Y esto es todo. ¿Sabíais que los archivos de office internamente estaban organizados de esta forma? ¿Se os ocurre algún otro método mejor para optimizar el tamaño de estos archivos? Estaré atento a vuestros comentarios.

Share