Сливане на документи

Това Aspose.Words Document Merger за .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, and 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;
}

Горни колонтитули, долни колонтитули и водни знаци

Запазете оригиналните горни/долни колонтитули или ги заменете с главен набор след обединяването:

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

Полета, кръстосани препратки и TOC

След обединяване, актуализирайте полетата, за да се обновят номерата на страниците, препратките и Съдържание съответствайте на новото оформление:

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

Ако поддържате един главен TOC, вмъкнете го еднократно и оставете автоматичното му обновяване:

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 / голям обем

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. Ще се актуализират ли номерата на страниците и съдържанието автоматично? Извикайте UpdateFields()UpdatePageLayout() за точно пагиниране) след всички добавяния.
  4. Необходим ли е Office? Не. Aspose.Words е самостоятелна библиотека.
 Български