对DOCX文件中的图片进行缩小处理
这份Python脚本旨在处理给定的DOCX(Word文档)文件中的图片,将其按照指定的比例进行缩小,并生成一个新的压缩版DOCX文件,其中包含经过缩小处理的图片。
代码功能概览:
-
导入必要的库
zipfile
:用于处理ZIP文件PIL
中的Image
:用于处理图像os
:用于与操作系统进行交互(文件路径等)
-
定义函数:
resize_image(image_path, scale_percent)
: 缩放单张图片的函数。resize_images_in_docx(input_docx, scale_percent)
: 处理整个DOCX文件中的图片,包括解压缩、缩放和生成压缩版DOCX。
-
代码执行步骤:
- 读取输入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)