解决Word文档拼接图片后产生空白页的问题

解决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)

关键改进点

  1. 使用分节符代替分页符doc.add_section(WD_SECTION.NEW_PAGE)doc.add_page_break() 能更好地控制分页

  2. 检查空白页:添加了 is_last_paragraph_empty() 函数来检查最后一个段落是否为空

  3. 智能分页逻辑

    • 只有当前一页不是空白页时才添加分页
    • 第一张图片不添加分页符
    • 后续图片只在必要时添加分页符
  4. 更精确的页面控制:使用分节符可以避免Word自动添加的额外空白页

额外建议

  1. 如果仍然遇到空白页问题,可以尝试调整图片大小,确保图片不会因为太大而被Word自动分页

  2. 可以在添加图片后检查文档的段落和分节情况,进一步优化分页逻辑

  3. 考虑使用 python-docxSection 相关功能进行更精细的页面控制

这个版本应该能有效解决空白页问题,同时保持图片按顺序正确插入到Word文档中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值