文档合并器

Aspose.Words Document Merger for .NET 让您以编程方式 合并任意数量的 Word‑兼容文档 为单一输出,同时保留格式、样式、页面布局、页眉/页脚和字段。典型用例包括组装报告、捆绑合同附件,或聚合生成的内容以进行归档。.

可在 Windows、Linux 和 macOS 上无界面运行。无需 Microsoft Office。.

安装与设置

  1. 安装 NuGet 包 Aspose.Words.
  2. 在应用启动时应用 metered licensing 以避免评估水印。参见 Metered Licensing .
  3. 验证框架要求 安装指南 .

IDEs: Visual Studio 2017–2026、JetBrains Rider、MonoDevelop。.

支持的输入/输出:: DOC、DOCX、RTF、DOT、DOTX、DOTM、DOCM、Word 2003 XML 和 Word 2007 XML。.

快速入门:追加多个文档

using Aspose.Words;

var master = new Document();
var builder = new DocumentBuilder(master);

builder.InsertBreak(BreakType.SectionBreakNewPage);

ImportFormatMode mode = ImportFormatMode.KeepSourceFormatting;

foreach (string path in new[] { "Blank.docx", "Background images.docx", "annex.rtf" })
{
    var src = new Document(path);
    master.AppendDocument(src, mode);
    builder.MoveToDocumentEnd();
    builder.InsertBreak(BreakType.SectionBreakNewPage);
}

master.UpdateFields();
master.Save("MergedOutput.docx");

导入格式模式::

  • KeepSourceFormatting — 保持每个源的样式和直接格式(适用于品牌插入)。.
  • UseDestinationStyles — 将相同的样式名称映射到目标的定义,以实现统一外观。.

Controlled Section & Page Layout — 受控章节与页面布局

在每个文档的开头 新页面, 连续,,或 偶/奇页:

var sect = master.LastSection;
sect.PageSetup.SectionStart = SectionStart.NewPage; // Continuous, EvenPage, OddPage

通过复制统一页边距/页面大小 PageSetup 来自模板章节::

using Aspose.Words;
var master = new Document();

var template = new Document("template.docx");
var pageSetup = template.FirstSection.PageSetup;
foreach (Section s in master.Sections)
{
    s.PageSetup.Orientation = pageSetup.Orientation;
    s.PageSetup.PageWidth  = pageSetup.PageWidth;
    s.PageSetup.PageHeight = pageSetup.PageHeight;
    s.PageSetup.TopMargin  = pageSetup.TopMargin;
    s.PageSetup.BottomMargin = pageSetup.BottomMargin;
    s.PageSetup.LeftMargin = pageSetup.LeftMargin;
    s.PageSetup.RightMargin = pageSetup.RightMargin;
}

页眉、页脚和水印 — 页眉、页脚和水印

保留源页眉/页脚,或在合并后用主套件替换它们: — 保留源页眉/页脚,或在合并后用主套件替换它们::

// Copy headers/footers from a master template into every section
var hft = new Document("header-footer-template.docx");
foreach (Section s in master.Sections)
{
    s.HeadersFooters.Clear();
    s.HeadersFooters.AddClone(hft.FirstSection.HeadersFooters[HeaderFooterType.HeaderPrimary]);
    s.HeadersFooters.AddClone(hft.FirstSection.HeadersFooters[HeaderFooterType.FooterPrimary]);
}

// Add a simple text watermark
foreach (Section s in master.Sections)
{
    var header = s.HeadersFooters[HeaderFooterType.HeaderPrimary] ?? new HeaderFooter(master, HeaderFooterType.HeaderPrimary);
    if (header.ParentNode == null) s.HeadersFooters.Add(header);
    var shape = new Shape(master, ShapeType.TextPlainText)
    {
        RelativeHorizontalPosition = RelativeHorizontalPosition.Page,
        RelativeVerticalPosition   = RelativeVerticalPosition.Page,
        WrapType = WrapType.None,
        Rotation = -40,
        Width = 400, Height = 100, Left = 100, Top = 200,
        BehindText = true
    };
    shape.TextPath.Text = "CONFIDENTIAL";
    header.AppendChild(shape);
}

域、交叉引用和目录 — 域、交叉引用和目录

合并后,更新字段,使页码、引用和 目录 匹配新布局::

master.UpdateFields();
master.UpdatePageLayout();        // ensures accurate page count
master.UpdateTableLayout();       // improves complex table pagination

如果您维护单一的主 TOC,只插入一次,让它自动重建::

using Aspose.Words;
var master = new Document();

var b = new DocumentBuilder(master);
b.MoveToDocumentStart();
b.InsertTableOfContents("TOC \\$1 \\$1 \\$1 \\$1");  // classic TOC switch set
master.UpdateFields();

流式优先 / 大批量合并

using System.IO;
using System.Collections.Generic;
using Aspose.Words;
using Aspose.Words.Lists;

IEnumerable<Stream> sourceStreams = new List<Stream>();

using (var output = new MemoryStream())
{
    var dst = new Document();
    foreach (Stream srcStream in sourceStreams)
    {
        using var s = srcStream; // e.g., S3/Blob stream
        var src = new Document(s); // auto‑detects format
        dst.AppendDocument(src, ImportFormatMode.UseDestinationStyles);
    }
    dst.UpdateFields();
    dst.Save(output, SaveFormat.docx);
    output.Position = 0;
    // return/output stream
}

性能提示:

  • 在内存中批量追加;调用 UpdateFields() 一次性在结束时调用。.
  • 首选 UseDestinationStyles 当您希望在数十个输入之间保持一致的样式时。.
  • 释放 Document 在长流水线的早期释放实例,以降低峰值内存。.

最佳实践

  • 预验证 用于检测损坏/密码,以避免部分合并。.
  • 选择 KeepSourceFormatting 当品牌忠实度重要时;请选择 UseDestinationStyles 以获得统一的外观。.
  • 插入一个 分节符 在每次追加之前,以保护页面设置。.
  • 统一页眉/页脚 在追加后,如果您想要单一的公司模板。.
  • 更新字段和目录 作为最后一步。.
  • 对于非常大的批次,将其拆分为组并合并这些组,以保持内存稳定。.

FAQ

  1. 我能强制每个来源在新页面开始吗?? 是的。在每个之前插入节或分页符 AppendDocument 调用或设置 SectionStartNewPage.
  2. 导入时如何保留目标样式?? 使用 ImportFormatMode.UseDestinationStylesAppendDocument.
  3. 页码和目录会自动更新吗?? 调用 UpdateFields() (以及 UpdatePageLayout() 用于精确分页)在所有追加之后。.
  4. 是否需要 Office?? 不。Aspose.Words 是一个独立的库。.
 中文