解决Word文档拼接图片后产生空白页的问题
我理解您的问题了。即使修改了分页逻辑,Word文档仍然会产生空白页。这是因为Word在处理图片和分页时有一些特殊行为。下面我将提供一个更完善的解决方案,可以避免多余的空白页。
最终解决方案
import os
from docx import Document
from docx.shared import Inches
from datetime import datetime
import pytz
import re
from docx.enum.section import WD_SECTION
def add_images_to_word_document(word_file, output_dir, output_word_path=None):
"""
将指定目录中的图片按页码顺序添加到Word文档末尾,并保存为新文档
优化版本:避免产生多余的空白页
参数:
word_file (str): 原始Word文档路径
output_dir (str): 包含图片的目录路径
output_word_path (str, optional): 新Word文档保存路径。如果为None,则使用原始目录
返回:
str: 新Word文档的保存路径
"""
# 设置时区并获取当前时间
shanghai_tz = pytz.timezone('Asia/Shanghai')
current_time = datetime.now(shanghai_tz).strftime("%Y%m%d_%H%M%S")
# 如果未指定输出路径,则使用原始目录
if output_word_path is None:
output_word_path = os.path.dirname(word_file)
# 创建新Word文档的文件名
original_name = os.path.splitext(os.path.basename(word_file))[0]
output_word = os.path.join(output_word_path, f"{original_name}_with_images_{current_time}.docx")
# 加载现有的Word文档
doc = Document(word_file)
# 获取output_images目录下的所有图片文件并按页码排序
image_files = [f for f in os.listdir(output_dir)
if f.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp'))]
# 定义提取页码的函数
def extract_page_number(filename):
match = re.search(r'page_(\d+)\.', filename, re.IGNORECASE)
return int(match.group(1)) if match else 0
# 按页码排序
image_files.sort(key=extract_page_number)
print(f"开始将图片按顺序添加到Word文档,共找到 {len(image_files)} 张图片...")
# 获取Word文档的页面宽度(标准A4纸宽度减去左右边距)
page_width = Inches(6.27)
# 检查文档最后一个段落是否是空段落
def is_last_paragraph_empty():
if len(doc.paragraphs) == 0:
return False
last_para = doc.paragraphs[-1]
return not last_para.text.strip()
# 添加每张图片到文档
for i, img_file in enumerate(image_files):
img_path = os.path.join(output_dir, img_file)
page_num = extract_page_number(img_file)
print(f"正在处理第 {page_num} 页: {img_file}...")
try:
# 如果不是第一张图片且上一页不是空白页,才添加分页符
if i > 0 and not is_last_paragraph_empty():
# 添加分节符而不是分页符,可以更好地控制分页
doc.add_section(WD_SECTION.NEW_PAGE)
# 添加图片
paragraph = doc.add_paragraph()
run = paragraph.add_run()
run.add_picture(img_path, width=page_width)
print(f"成功添加第 {page_num} 页图片")
except Exception as e:
print(f"添加第 {page_num} 页图片时出错: {str(e)}")
continue
# 保存新的Word文档
doc.save(output_word)
print(f"\n所有图片处理完成,已成功保存到Word文档: {output_word}")
return output_word
# 使用示例
if __name__ == "__main__":
word_file = r"C:\Leon\python_project\oceanxecm\2025\04\20250410-Logan-ocr位置\word\bid_document.docx"
output_dir = r"C:\Leon\python_project\oceanxecm\2025\04\20250410-Logan-ocr位置\output_images"
add_images_to_word_document(word_file, output_dir)
关键改进点
-
使用分节符代替分页符:
doc.add_section(WD_SECTION.NEW_PAGE)
比doc.add_page_break()
能更好地控制分页 -
检查空白页:添加了
is_last_paragraph_empty()
函数来检查最后一个段落是否为空 -
智能分页逻辑:
- 只有当前一页不是空白页时才添加分页
- 第一张图片不添加分页符
- 后续图片只在必要时添加分页符
-
更精确的页面控制:使用分节符可以避免Word自动添加的额外空白页
额外建议
-
如果仍然遇到空白页问题,可以尝试调整图片大小,确保图片不会因为太大而被Word自动分页
-
可以在添加图片后检查文档的段落和分节情况,进一步优化分页逻辑
-
考虑使用
python-docx
的Section
相关功能进行更精细的页面控制
这个版本应该能有效解决空白页问题,同时保持图片按顺序正确插入到Word文档中。