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

  1. Instale o pacote NuGet Aspose.Words.
  2. Aplique o Metered Licensing na inicialização do aplicativo para evitar marcas d’água de avaliação. Veja Metered Licensing .
  3. 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, OddPage

Unificar 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 pagination

Se 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 Document instâ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

  1. 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 AppendDocument chamada ou conjunto SectionStart para NewPage.
  2. Como mantenho os estilos de destination ao importar? Use ImportFormatMode.UseDestinationStyles em AppendDocument.
  3. Os números de página e o TOC serão atualizados automaticamente? Chamar UpdateFields() (e UpdatePageLayout() para paginação precisa) após todas as adições.
  4. O Office é necessário? Não. Aspose.Words é uma biblioteca independente.
 Português