Comprimir documentos de Microsoft Office Word (.docx)

Método práctico para reducir el tamaño del archivo Word DOCX.

Estructura del archivo DOCX

Un archivo .docx es esencialmente un paquete ZIP que contiene documentos XML y recursos multimedia:

  • [Content_Types].xml define los tipos de contenido
  • Los archivos .rels definen relaciones
  • word/document.xml almacena el contenido del documento principal
  • word/styles.xml almacena estilos
  • word/numbering.xml almacena definiciones de lista

Si cambia el nombre de .docx a .zip, puede extraer e inspeccionar la estructura del directorio.

Cómo comprimir DOCX

Los archivos DOCX grandes suelen estar dominados por archivos bajo “word/media”, por lo que la compresión debe centrarse allí.

Por el momento, la compatibilidad DOCX para formatos de imagen más nuevos puede estar limitada en algunos flujos de trabajo, por lo que los formatos comunes como JPG/PNG suelen ser más seguros.

1. Descomprimir

Cambie el nombre de la extensión a ZIP y extráigala, o use Python:

1
2
3
4
5
6
7
8
def unzip(file):
    docname = file[0:-5]
    if os.path.exists(docname):
        print('os.path.exists! remove!')
        shutil.rmtree(docname)

    with pyzipper.PyZipFile(file, "r") as zf:
        zf.extractall(docname)

2. Comprimir JPG/PNG

Puede comprimir imágenes directamente. Caesium proporciona buenos resultados de compresión a través de CLI.

1
2
3
4
5
6
7
8
def compress_image(input_path: str, quality: int = 80):
    command = 'caesiumclt.exe --same-folder-as-input --quality ' + str(quality) + ' ' + input_path
    print(command)

    try:
        os.system(command)
    except Exception as e:
        logging.error(f"An error occurred: {str(e)}")

En la práctica:

  • calidad=50 a menudo proporciona una fuerte reducción de tamaño con una calidad aceptable.
  • Incluso “calidad = 80” puede reducir notablemente el tamaño.

3. Manejar archivos EMF

Los archivos EMF suelen ser grandes. Convertir EMF a JPG/PNG puede reducir el tamaño significativamente. Puede usar ImageMagick para la conversión y luego actualizar word/_rels/document.xml.rels si la extensión/ruta del archivo cambia.

4. Reempacar

Vuelva a comprimir la carpeta extraída usando ZIP_DEFLATED.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def zip(folder, zipfile):
    print('zip:', folder, ' -> ', zipfile)
    with pyzipper.PyZipFile(zipfile, "w", compression=pyzipper.ZIP_DEFLATED) as zf:
        for root, dirs, files in os.walk(folder):
            for file in files:
                abs_path = os.path.join(root, file)
                rel_path = os.path.relpath(abs_path, folder)
                zf.write(abs_path, rel_path)

    shutil.rmtree(folder)

5. Ejemplo de script de un extremo a otro

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def compress_docx(indir, outdir):
    for root, dirs, files in os.walk(indir):
        for file in files:
            if file.endswith('.docx'):
                docfile = os.path.join(root, file)
                unzip(docfile)
                docname = file[0:-5]
                imgpath = os.path.join(root, docname, 'word/media/')
                compress_image(imgpath, 50)

                outfolder = os.path.join(outdir, os.path.relpath(root, indir))
                if not os.path.exists(outfolder):
                    os.mkdir(outfolder)
                zip(os.path.join(root, docname), os.path.join(outfolder, file))

Resumen

Con este enfoque y “calidad = 50”, los archivos DOCX a menudo se pueden reducir a aproximadamente un tercio del tamaño original.

记录并分享
Creado con Hugo
Tema Stack diseñado por Jimmy