Îmbinător de Documente

Articolul Aspose.Words Document Merger for .NET îți permite programatic să unești orice număr de documente compatibile cu Word într-un singur rezultat, păstrând formatarea, stilurile, aspectul paginii, anteturile/subsolurile și câmpurile. Utilizările tipice includ asamblarea rapoartelor, gruparea anexelor de contract sau agregarea conținutului generat pentru arhivare.

Funcționează fără interfață grafică pe Windows, Linux și macOS. Nu este necesar Microsoft Office.

Instalare și configurare

  1. Instalează pachetul NuGet Aspose.Words.
  2. Aplică metered licensing la pornirea aplicației pentru a evita marcajele de evaluare. Vezi Metered Licensing .
  3. Verifică cerințele framework-ului în Ghid de instalare .

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

Intrări / Ieșiri acceptate: DOC, DOCX, RTF, DOT, DOTX, DOTM, DOCM, Word 2003 XML, și Word 2007 XML.

Începe rapid: Adaugă mai multe documente

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

Moduri de format de import:

  • KeepSourceFormatting — păstrează stilurile și formatarea directă ale fiecărei surse (ideal pentru inserții branduite).
  • UseDestinationStyles — mapează numele de stil identice la definițiile destinației pentru un aspect uniform.

Secțiune controlată și aspect de pagină

Începe fiecare document pe Pagină nouă, Continuă, sau Pagină pară/impară:

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

Uniformizați marginile/mărimea paginii prin copiere PageSetup dintr-o secțiune de șablon:

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

Antete, subsoluri și filigrane

Păstrează antetele/subsolurile sursă sau înlocuiește-le cu un set principal după îmbinare:

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

Câmpuri, referințe încrucișate și TOC

După îmbinare, actualizați câmpurile astfel încât numerele de pagină, referințele și Cuprins să se potrivească cu noul aspect:

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

Dacă menții un singur TOC principal, inserează-l o singură dată și lasă-l să se reconstruiască automat:

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

Stream‑First / Îmbinări cu volum mare

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
}

Sfaturi de performanță:

  • Adăugări în lot în memorie; apelați UpdateFields() o singură dată la final.
  • Preferă UseDestinationStyles când doriți un stil consistent pentru zeci de intrări.
  • Eliberează Document instanțe devreme în conductele lungi pentru a reduce memoria de vârf.

Cele mai bune practici

  • Pre‑validează pentru corupție/parole pentru a evita îmbinările parțiale.
  • Alege KeepSourceFormatting când fidelitatea brandului contează; alege UseDestinationStyles pentru un aspect uniform.
  • Inserează un întrerupere de secțiune înainte de fiecare adăugare pentru a proteja configurarea paginii.
  • Unifică anteturile/subsolurile după adăugare dacă doriți un singur șablon corporativ.
  • Actualizați câmpurile & TOC ca pasul final.
  • Pentru loturi foarte mari, împarte-le în grupuri și fuzionează grupurile pentru a menține memoria stabilă.

FAQ

  1. Pot să forțez fiecare source să înceapă pe o pagină nouă? Da. Inserează o secțiune sau o întrerupere de pagină înainte de fiecare AppendDocument call sau set SectionStart la NewPage.
  2. Cum pot păstra stilurile destinație în timp ce importez? Folosește ImportFormatMode.UseDestinationStyles în AppendDocument.
  3. Numerele de pagină și TOC se vor actualiza automat? Apel UpdateFields() (și UpdatePageLayout() pentru paginare precisă) după toate adăugările.
  4. Este Office necesar? Nu. Aspose.Words este o bibliotecă independentă.
 Română