Document Merger
O Aspose.Words Document Merger for .NET permite que você programaticamente junte qualquer número de documentos compatíveis com Word em uma única saída, preservando formatação, estilos, layout de página, cabeçalhos/rodapés e campos. Os usos típicos incluem montar relatórios, agrupar anexos de contratos ou agregar conteúdo gerado para arquivamento.
Funciona sem interface gráfica em Windows, Linux e macOS. Não é necessário o Microsoft Office.
Instalação e Configuração
- Instale o pacote NuGet
Aspose.Words. - Aplique o Metered Licensing na inicialização do aplicativo para evitar marcas d’água de avaliação. Veja Metered Licensing .
- Verifique os requisitos do framework no Guia de Instalação .
IDEs: Visual Studio 2017–2026, JetBrains Rider, MonoDevelop.
Entradas / Saídas suportadas: DOC, DOCX, RTF, DOT, DOTX, DOTM, DOCM, Word 2003 XML e Word 2007 XML.
Início Rápido: Anexar Vários Documentos
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");Modos de Formato de Importação:
- KeepSourceFormatting — preserva os estilos e a formatação direta de cada origem (ideal para inserções de marca).
- UseDestinationStyles — mapeia nomes de estilo idênticos para as definições do destino, proporcionando uma aparência uniforme.
Seção e Layout de Página Controlados
Inicie cada documento em Nova página, Contínuo, ou Página Par/Ímpar:
var sect = master.LastSection;
sect.PageSetup.SectionStart = SectionStart.NewPage; // Continuous, EvenPage, OddPageUnificar margens/tamanho da página copiando PageSetup de uma seção de modelo:
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;
}Cabeçalhos, Rodapés e Marcas d’água
Mantenha os cabeçalhos/rodapés de origem ou substitua-os por um conjunto mestre após a mesclagem:
// 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);
}Campos, Referências Cruzadas e Sumário
Depois de mesclar, atualize os campos para que os números de página, referências e Sumário correspondam ao novo layout:
master.UpdateFields();
master.UpdatePageLayout(); // ensures accurate page count
master.UpdateTableLayout(); // improves complex table paginationSe você mantiver um único TOC mestre, insira‑o uma vez e deixe que ele seja reconstruído automaticamente:
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();Mesclagens Stream‑First / High‑Volume
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
}Dicas de desempenho:
- Acrescentos em lote na memória; chame
UpdateFields()uma vez no final. - Prefira UseDestinationStyles quando quiser estilo consistente em dezenas de entradas.
- Descadastrar
Documentinstâncias cedo em pipelines longos para reduzir o pico de memória.
Melhores Práticas
- Pré‑validar para corrupção/senhas a fim de evitar mesclagens parciais.
- Escolher KeepSourceFormatting quando a fidelidade da marca importa; escolha UseDestinationStyles para aparência uniforme.
- Inserir um quebra de seção antes de cada acréscimo para proteger a configuração da página.
- Unificar cabeçalhos/rodapés após a anexação, se você quiser um único modelo corporativo.
- Atualizar campos & TOC como a etapa final.
- Para lotes muito grandes, divida em grupos e mescle os grupos para manter a memória estável.
FAQ
- Posso forçar cada source a iniciar em uma nova página? Sim. Insira uma quebra de section ou de página antes de cada
AppendDocumentchamada ou conjuntoSectionStartparaNewPage. - Como mantenho os estilos de destination ao importar? Use
ImportFormatMode.UseDestinationStylesemAppendDocument. - Os números de página e o TOC serão atualizados automaticamente? Chamar
UpdateFields()(eUpdatePageLayout()para paginação precisa) após todas as adições. - O Office é necessário? Não. Aspose.Words é uma biblioteca independente.