文档合并器
该 Aspose.Words Document Merger for .NET 让您以编程方式 合并任意数量的 Word‑兼容文档 为单一输出,同时保留格式、样式、页面布局、页眉/页脚和字段。典型用例包括组装报告、捆绑合同附件,或聚合生成的内容以进行归档。.
可在 Windows、Linux 和 macOS 上无界面运行。无需 Microsoft Office。.
安装与设置
- 安装 NuGet 包
Aspose.Words. - 在应用启动时应用 metered licensing 以避免评估水印。参见 Metered Licensing .
- 验证框架要求 安装指南 .
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
- 我能强制每个来源在新页面开始吗?? 是的。在每个之前插入节或分页符
AppendDocument调用或设置SectionStart到NewPage. - 导入时如何保留目标样式?? 使用
ImportFormatMode.UseDestinationStyles在AppendDocument. - 页码和目录会自动更新吗?? 调用
UpdateFields()(以及UpdatePageLayout()用于精确分页)在所有追加之后。. - 是否需要 Office?? 不。Aspose.Words 是一个独立的库。.