Об’єднувач документів

Цей Aspose.Words Document Merger for .NET дозволяє вам програмно об’єднувати будь-яку кількість документів, сумісних з Word‑compatible в один вихідний файл, зберігаючи форматування, стилі, розмітку сторінки, колонтитули та поля. Типові випадки використання включають складання звітів, об’єднання додатків до контрактів або агрегування згенерованого вмісту для архівування.

Працює без графічного інтерфейсу на Windows, Linux та macOS. Microsoft Office не потрібен.

Встановлення та налаштування

  1. Встановіть пакет NuGet Aspose.Words.
  2. Застосуйте лічену ліцензію під час запуску програми, щоб уникнути водяних знаків оцінки. Див Лічена ліцензія .
  3. Перевірте вимоги до фреймворку в Посібник з встановлення .

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

Підтримувані вхідні/вихідні дані: DOC, DOCX, RTF, DOT, DOTX, DOTM, DOCM, Word 2003 XML, та Word 2007 XML.

Швидкий старт: Додати кілька документів

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

Режими формату імпорту:

  • KeepSourceFormatting — зберігає стилі та пряме форматування кожного джерела (ідеально підходить для брендованих вставок).
  • UseDestinationStyles — зіставляє однакові назви стилів з визначеннями у цільовому документі для уніфікованого вигляду.

Керований розділ & макет сторінки

Починайте кожен документ з Нова сторінка, Безперервний, або Парна/непарна сторінка:

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

Уніфікувати поля/розмір сторінки шляхом копіювання PageSetup з розділу шаблону:

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

Верхні та нижні колонтитули та Watermarks

Зберігайте колонтитули джерела або замініть їх набором майстра після злиття:

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

Fields, Cross‑References та TOC

Після об’єднання оновіть поля, щоб номери сторінок, посилання та Зміст відповідайте новому макету:

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

Якщо ви підтримуєте один головний TOC, вставте його один раз і дозвольте йому 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 злиття

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
}

Поради щодо продуктивності:

  • Пакетне додавання в пам’яті; викличте UpdateFields() один раз в кінці.
  • Віддавайте перевагу UseDestinationStyles коли ви хочете послідовне оформлення для десятків вхідних даних.
  • Звільняйте Document екземпляри на ранньому етапі у довгих конвеєрах, щоб зменшити пікове використання пам’яті.

Кращі практики

  • Попередньо перевірити для пошкоджень/паролів, щоб уникнути часткових злиттів.
  • Виберіть KeepSourceFormatting коли важлива вірність бренду; виберіть UseDestinationStyles для однорідного вигляду.
  • Вставте розрив розділу перед кожним додаванням, щоб захистити налаштування сторінки.
  • Уніфікувати заголовки/нижні колонтитули після додавання, якщо ви хочете один корпоративний шаблон.
  • Оновити поля та зміст як останній крок.
  • Для дуже великих пакетів розділіть їх на групи та об’єднуйте групи, щоб підтримувати стабільність пам’яті.

FAQ

  1. Чи можу я примусити кожне джерело починатися з нової сторінки? Так. Вставте розділ або розрив сторінки перед кожним AppendDocument виклик або набір SectionStart до NewPage.
  2. Як зберегти стилі призначення під час імпорту? Використовуйте ImportFormatMode.UseDestinationStyles у AppendDocument.
  3. Чи оновлюються номери сторінок та TOC автоматично? Викликати UpdateFields()UpdatePageLayout() для точної пагінації) після усіх дописувань.
  4. Чи потрібен Office? Ні. Aspose.Words — це окрема бібліотека.
 Українська