You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python将DOCX指定页面保存为独立DOCX文件?

可以用Python实现DOCX指定页面拆分,推荐两种方案

方案一:跨平台免费方案(基于python-docx)

python-docx本身没有直接的页码访问API,但可以通过识别分页符和段落范围来拆分文档,能保留复选框等交互元素。核心思路是先划分每个页面的内容范围,再将对应内容复制到新文档。

安装依赖

pip install python-docx

实现代码

from docx import Document

def get_page_segments(doc):
    """划分文档的页面段落范围,返回按页面分组的段落列表"""
    pages = []
    current_page_paras = []
    for para in doc.paragraphs:
        current_page_paras.append(para)
        # 检查段落是否包含分页符
        if para.runs:
            last_run = para.runs[-1]
            if last_run.element.xpath('.//w:br[@w:type="page"]'):
                pages.append(current_page_paras)
                current_page_paras = []
    # 添加最后一页内容
    if current_page_paras:
        pages.append(current_page_paras)
    return pages

def copy_paragraph_style(source_para, target_para):
    """复制段落的格式和样式"""
    target_para.style = source_para.style
    target_para.paragraph_format.alignment = source_para.paragraph_format.alignment
    target_para.paragraph_format.line_spacing = source_para.paragraph_format.line_spacing

def copy_run_style(source_run, target_run):
    """复制段落中run的格式"""
    target_run.bold = source_run.bold
    target_run.italic = source_run.italic
    target_run.underline = source_run.underline
    target_run.font.size = source_run.font.size
    target_run.font.name = source_run.font.name

def extract_pages(source_path, target_pages, output_path):
    """
    提取指定页码的内容到新文档
    :param source_path: 源DOCX文件路径
    :param target_pages: 1-based的页码列表,如[1,5]
    :param output_path: 输出文件路径
    """
    source_doc = Document(source_path)
    page_segments = get_page_segments(source_doc)
    new_doc = Document()
    
    # 复制源文档的样式集合,保证格式一致
    new_doc.styles = source_doc.styles
    
    # 复制指定页面的段落
    for page_num in target_pages:
        if page_num < 1 or page_num > len(page_segments):
            continue
        paras = page_segments[page_num - 1]
        for para in paras:
            new_para = new_doc.add_paragraph()
            # 复制每个run的内容和格式
            for run in para.runs:
                new_run = new_para.add_run(run.text)
                copy_run_style(run, new_run)
            # 复制段落格式
            copy_paragraph_style(para, new_para)
    
    # 复制文档中的表格(保留样式和内容)
    for table in source_doc.tables:
        new_table = new_doc.add_table(table.rows.count, table.columns.count)
        new_table.style = table.style
        for i in range(table.rows.count):
            for j in range(table.columns.count):
                cell = table.cell(i, j)
                new_cell = new_table.cell(i, j)
                new_cell.text = cell.text
                if cell.paragraphs:
                    copy_paragraph_style(cell.paragraphs[0], new_cell.paragraphs[0])
    
    new_doc.save(output_path)

# 使用示例
extract_pages("template.docx", [1,5], "newdoc1.docx")
extract_pages("template.docx", [2,3,4], "newdoc2.docx")

注意事项

  • 该方案依赖手动识别分页符,对于自动分页(如段落过长自动换页)的场景,需额外结合段落XML位置信息优化判断逻辑;
  • 能保留复选框、表格、图片等元素,格式还原度较高。

方案二:Windows平台精准方案(基于pywin32调用Word COM)

如果使用Windows系统,直接调用Microsoft Word的COM接口是最可靠的方案——利用Word自身的页码识别逻辑,能100%保留所有格式和交互元素(包括复选框),无需手动处理分页逻辑。

安装依赖

pip install pywin32

实现代码

import win32com.client as win32
import os

def split_docx_by_pages(source_path, page_groups, output_paths):
    """
    按指定页码组拆分DOCX文档
    :param source_path: 源DOCX文件路径
    :param page_groups: 页码组列表,如[[1,5], [2,3,4]]
    :param output_paths: 对应输出文件路径列表
    """
    # 初始化Word应用
    word = win32.gencache.EnsureDispatch('Word.Application')
    word.Visible = False  # 后台运行,不显示Word窗口
    
    try:
        # 打开源文档
        source_doc = word.Documents.Open(os.path.abspath(source_path))
        total_pages = source_doc.ComputeStatistics(win32.constants.wdStatisticPages)
        
        for pages, output_path in zip(page_groups, output_paths):
            new_doc = word.Documents.Add()
            for page_num in pages:
                if page_num < 1 or page_num > total_pages:
                    continue
                # 获取当前页的起始位置
                start_pos = source_doc.GoTo(
                    What=win32.constants.wdGoToPage,
                    Which=win32.constants.wdGoToAbsolute,
                    Count=page_num
                ).Start
                # 获取当前页的结束位置
                if page_num < total_pages:
                    end_pos = source_doc.GoTo(
                        What=win32.constants.wdGoToPage,
                        Which=win32.constants.wdGoToAbsolute,
                        Count=page_num + 1
                    ).Start - 1
                else:
                    end_pos = source_doc.Content.End - 1
                # 复制当前页内容并粘贴到新文档
                source_doc.Range(Start=start_pos, End=end_pos).Copy()
                new_doc.Range(new_doc.Content.End).Paste()
            # 保存新文档
            new_doc.SaveAs(os.path.abspath(output_path))
            new_doc.Close()
        
        source_doc.Close()
    finally:
        # 确保Word进程退出
        word.Quit()

# 使用示例
split_docx_by_pages(
    "template.docx",
    [[1,5], [2,3,4]],
    ["newdoc1.docx", "newdoc2.docx"]
)

注意事项

  • 需要安装Microsoft Word(支持2010及以上版本);
  • 分页判断完全依赖Word引擎,精准度100%,能保留所有交互元素和格式;
  • 仅支持Windows平台。

内容的提问来源于stack exchange,提问作者danielliuce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:05:22