Unione Documenti

Il Aspose.Words Document Merger for .NET ti consente di farlo programmaticamente unire un numero qualsiasi di documenti Word‑compatible in un unico output preservando la formattazione, gli stili, il layout della pagina, intestazioni/piè di pagina e i campi. Gli usi tipici includono l’assemblaggio di report, il raggruppamento di allegati contrattuali o l’aggregazione di contenuti generati per l’archiviazione.

Funziona in modalità headless su Windows, Linux e macOS. Non è necessario Microsoft Office.

Installazione e configurazione

  1. Installa il pacchetto NuGet Aspose.Words.
  2. Applica metered licensing all’avvio dell’app per evitare filigrane di valutazione. Vedi Metered Licensing .
  3. Verifica i requisiti del framework nel Guida all’installazione .

IDE: Visual Studio 2017–2026, JetBrains Rider, MonoDevelop.

Input / Output supportati: DOC, DOCX, RTF, DOT, DOTX, DOTM, DOCM, Word 2003 XML, e Word 2007 XML.

Avvio rapido: Aggiungi più documenti

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");

Modalità di formato di importazione:

  • KeepSourceFormatting — preserva gli stili e la formattazione diretta di ogni sorgente (ideale per inserimenti brandizzati).
  • UseDestinationStyles — mappa i nomi di stile identici alle definizioni della destinazione per un aspetto uniforme.

Sezione e Layout di Pagina Controllati

Inizia ogni documento su Nuova pagina, Continuo, o Pagina pari/dispari:

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

Uniforma i margini/dimensioni della pagina copiando PageSetup da una sezione modello:

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;
}

Intestazioni, Piè di pagina e Filigrane

Mantieni le intestazioni/piè di pagina di origine, o sostituiscili con un set master dopo la fusione:

// 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);
}

Campi, Riferimenti Incrociati e Indice

Dopo l’unione, aggiorna i campi in modo che i numeri di pagina, i riferimenti e Indice corrispondano al nuovo layout:

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

Se mantieni un unico master TOC, inseriscilo una sola volta e lascia che si ricostruisca 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();

Unioni 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
}

Suggerimenti sulle prestazioni:

  • Aggiunte batch in memoria; chiama UpdateFields() una volta alla fine.
  • Preferisci UseDestinationStyles quando desideri uno stile coerente su decine di input.
  • Elimina Document le istanze in anticipo nelle pipeline lunghe per ridurre il picco di memoria.

Buone pratiche

  • Pre‑valida per corruzione/password per evitare merge parziali.
  • Scegli KeepSourceFormatting quando la fedeltà al marchio è importante; scegli UseDestinationStyles per un aspetto uniforme.
  • Inserisci un interruzione di sezione prima di ogni aggiunta per proteggere l’impostazione della pagina.
  • Unificare intestazioni/piè di pagina dopo l’aggiunta se desideri un unico modello aziendale.
  • Aggiorna campi & indice come passaggio finale.
  • Per batch molto grandi, suddividi in gruppi e unisci i gruppi per mantenere stabile la memoria.

FAQ

  1. Posso forzare ogni sorgente a iniziare su una nuova pagina? Sì. Inserisci una sezione o un’interruzione di pagina prima di ogni AppendDocument chiamata o impostazione SectionStart a NewPage.
  2. Come mantengo gli stili di destinazione durante l’importazione? Usa ImportFormatMode.UseDestinationStyles in AppendDocument.
  3. Le numerazioni di pagina e il TOC verranno aggiornati automaticamente? Chiama UpdateFields() (e UpdatePageLayout() per una paginazione precisa) dopo tutti gli aggiunti.
  4. È necessario Office? No. Aspose.Words è una libreria autonoma.
 Italiano