Scalacz dokumentów

Ten Aspose.Words Document Merger for .NET pozwala Ci programowo połączyć dowolną liczbę dokumentów zgodnych z Word do jednego wyjścia, zachowując formatowanie, style, układ strony, nagłówki/stopki oraz pola. Typowe zastosowania obejmują tworzenie raportów, łączenie załączników umownych lub agregowanie wygenerowanej treści w celu archiwizacji.

Działa w trybie bez interfejsu graficznego na Windows, Linux i macOS. Nie wymaga Microsoft Office.

Instalacja i konfiguracja

  1. Zainstaluj pakiet NuGet Aspose.Words.
  2. Zastosuj licencjonowanie rozliczane przy uruchamianiu aplikacji, aby uniknąć znaków wodnych wersji ewaluacyjnej. Zobacz Licencjonowanie rozliczane .
  3. Sprawdź wymagania frameworka w Przewodnik instalacji .

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

Obsługiwane wejścia / wyjścia: DOC, DOCX, RTF, DOT, DOTX, DOTM, DOCM, Word 2003 XML i Word 2007 XML.

Quick Start: Dołącz wiele dokumentów

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

Tryby formatu importu:

  • KeepSourceFormatting — zachowuje style i formatowanie bezpośrednie każdego źródła (idealne dla wstawek markowych).
  • UseDestinationStyles — mapuje identyczne nazwy stylów na definicje w miejscu docelowym, aby uzyskać jednolity wygląd.

Kontrolowana sekcja & układ strony — Kontrolowana sekcja & układ strony

Rozpocznij każdy dokument na Nowa strona, Ciągły, lub Strona parzysta/nieparzysta:

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

Ujednolicić marginesy/rozmiar strony poprzez kopiowanie PageSetup z sekcji szablonu:

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

Headers, Footers, and Watermarks — Nagłówki, stopki i znaki wodne

Keep source headers/footers, or replace them with a master set after the merge: — Zachowaj nagłówki/stopki źródłowe lub zastąp je zestawem głównym po scaleniu:

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

Pola, odwołania krzyżowe i spis treści — Pola, odwołania krzyżowe i spis treści

Po scaleniu zaktualizuj pola, aby numery stron, odwołania i Spis treści pasowały do nowego układu:

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

Jeśli utrzymujesz pojedynczy główny TOC, wstaw go raz i pozwól mu się auto‑rebuild:

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 / High‑Volume Merges

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
}

Wskazówki dotyczące wydajności:

  • Zbiorcze dopisywanie w pamięci; wywołaj UpdateFields() raz na końcu.
  • Preferuj UseDestinationStyles gdy chcesz spójny styl wśród dziesiątek wejść.
  • Zwolnij Document instancje wcześnie w długich potokach, aby zmniejszyć szczytowe zużycie pamięci.

Najlepsze praktyki

  • Wstępnie zweryfikuj dla uszkodzeń/haseł, aby uniknąć częściowych scaleni​.
  • Wybierz KeepSourceFormatting gdy ważna jest wierność marki; wybierz UseDestinationStyles dla jednolitego wyglądu.
  • Wstaw przerwę sekcji przed każdym dopisaniem, aby chronić ustawienia strony.
  • Ujednolić nagłówki/stopki Po dołączeniu, jeśli chcesz pojedynczy szablon korporacyjny.
  • Zaktualizuj pola i spis treści Jako ostatni krok.
  • W przypadku bardzo dużych partii, podziel je na grupy i scal grupy, aby utrzymać stabilność pamięci.

FAQ

  1. Czy mogę wymusić, aby każde źródło zaczynało się na nowej stronie? Tak. Wstaw podział sekcji lub strony przed każdym AppendDocument wywołanie lub ustawienie SectionStart do NewPage.
  2. Jak zachować style docelowe podczas importu? Użyj ImportFormatMode.UseDestinationStyles w AppendDocument.
  3. Czy numery stron i spis treści będą aktualizowane automatycznie? Wywołaj UpdateFields() (i UpdatePageLayout() dla precyzyjnej paginacji) po wszystkich dopisaniach.
  4. Czy Office jest wymagany? Nie. Aspose.Words jest samodzielną biblioteką.
 Polski