ChatGPT生成的docx文档压缩Python代码

对DOCX文件中的图片进行缩小处理

体验一下
这份Python脚本旨在处理给定的DOCX(Word文档)文件中的图片,将其按照指定的比例进行缩小,并生成一个新的压缩版DOCX文件,其中包含经过缩小处理的图片。

代码功能概览:

  1. 导入必要的库

    • zipfile:用于处理ZIP文件
    • PIL中的Image:用于处理图像
    • os:用于与操作系统进行交互(文件路径等)
  2. 定义函数:

    • resize_image(image_path, scale_percent): 缩放单张图片的函数。
    • resize_images_in_docx(input_docx, scale_percent): 处理整个DOCX文件中的图片,包括解压缩、缩放和生成压缩版DOCX。
  3. 代码执行步骤:

    • 读取输入DOCX文件的路径和缩放比例。
    • 解压缩DOCX文件到一个与其同名的文件夹。
    • 遍历文件夹中的所有文件,并对图片文件进行缩小处理。
    • 创建一个新的ZIP文件(压缩版DOCX),其中包含处理过的图片文件和其他文件。

详细解释:

1. 函数 resize_image(image_path, scale_percent)

这个函数用于对单张图片进行缩小处理。接受两个参数:

  • image_path:图片文件路径。
  • scale_percent:缩放比例。

函数内部逻辑:

  • 使用PIL库中的Image.open()打开指定路径的图像文件。
  • 根据给定的缩放比例,计算新的宽度和高度。
  • 使用resize()方法将图像按比例缩小。
  • 返回缩小后的图像对象。

2. 函数 resize_images_in_docx(input_docx, scale_percent)

这个函数是核心部分,用于处理整个DOCX文件中的图片。接受两个参数:

  • input_docx:输入的DOCX文件路径。
  • scale_percent:缩放比例。

函数内部逻辑:

  • 获取输入DOCX文件所在的目录和文件名。
  • 创建一个与输入文件同名的文件夹,并将DOCX文件解压缩到该文件夹中。
  • 遍历文件夹中的所有文件,并对图片文件进行缩小处理。
  • 使用PIL库中的save()方法保存缩小后的图片。
  • 创建一个新的ZIP文件(压缩版DOCX),将处理过的文件压缩到其中。

3. 执行流程

在调用代码时:

  • 指定输入的DOCX文件名和缩放比例。
  • resize_images_in_docx()函数执行以下步骤:
    • 解压缩指定的DOCX文件。
    • 缩小其中的图片文件。
    • 生成一个新的压缩版DOCX文件,其中包含缩小处理过的图片。


import zipfile
from PIL import Image
import os

def resize_image(image_path, scale_percent):
    image = Image.open(image_path)
    width, height = image.size
    new_width = int(width * scale_percent / 100)
    new_height = int(height * scale_percent / 100)
    resized_image = image.resize((new_width, new_height))
    return resized_image

def resize_images_in_docx(input_docx, scale_percent):
    # 获取输入DOCX文件所在目录和文件名
    input_directory = os.path.dirname(input_docx)
    file_name = os.path.splitext(os.path.basename(input_docx))[0]

    # 解压缩 DOCX 文件到其所在目录下同名文件夹
    output_directory = os.path.join(input_directory, file_name)
    with zipfile.ZipFile(input_docx, 'r') as zip_ref:
        zip_ref.extractall(output_directory)

    # 缩小图片并替换原始图片文件
    for root, _, files in os.walk(output_directory):
        for file in files:
            file_path = os.path.join(root, file)
            if os.path.isfile(file_path):
                # 如果是图片文件,则缩小并保存
                if any(file_path.lower().endswith(img_ext) for img_ext in ['.jpg', '.jpeg', '.png', '.gif']):
                    resized_image = resize_image(file_path, scale_percent)
                    resized_image.save(file_path)

    # 创建一个新的 ZIP 文件(将同名文件夹下的所有文件压缩起来)
    zipf = zipfile.ZipFile(f'{file_name}_压缩版.docx', 'w', zipfile.ZIP_DEFLATED)
    for root, _, files in os.walk(output_directory):
        for file in files:
            file_path = os.path.join(root, file)
            arc_path = os.path.relpath(file_path, output_directory)
            zipf.write(file_path, arcname=arc_path)
    zipf.close()
    
# 调用函数
input_docx_file = 'input.docx'  # 输入文件名
scale_percent = 50  # 缩放比例(50%)
resize_images_in_docx(input_docx_file, scale_percent)

在这里插入图片描述

你可能感兴趣的:(python,开发语言)