Trình hợp nhất tài liệu

Cái Aspose.Words Document Merger for .NET cho phép bạn lập trình nối bất kỳ số lượng tài liệu tương thích Word thành một đầu ra duy nhất trong khi giữ nguyên định dạng, kiểu dáng, bố cục trang, header/footer và các trường. Các trường hợp sử dụng điển hình bao gồm lắp ráp báo cáo, gộp các phụ lục hợp đồng, hoặc tổng hợp nội dung được tạo ra để lưu trữ.

Hoạt động không giao diện trên Windows, Linux và macOS. Không cần Microsoft Office.

Cài đặt và Thiết lập

  1. Cài đặt gói NuGet Aspose.Words.
  2. Áp dụng giấy phép tính theo mức sử dụng khi khởi động ứng dụng để tránh dấu nước đánh giá. Xem Giấy phép tính theo mức sử dụng .
  3. Xác minh yêu cầu khung công tác trong Hướng dẫn cài đặt .

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

Đầu vào / Đầu ra được hỗ trợ: DOC, DOCX, RTF, DOT, DOTX, DOTM, DOCM, Word 2003 XML, và Word 2007 XML.

Bắt đầu nhanh: Thêm nhiều tài liệu

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

Chế độ Định dạng Nhập:

  • KeepSourceFormatting — giữ nguyên các kiểu và định dạng trực tiếp của mỗi nguồn (lý tưởng cho các chèn có thương hiệu).
  • UseDestinationStyles — ánh xạ các tên kiểu giống nhau sang định nghĩa của đích để có giao diện đồng nhất.

Kiểm soát Phần & Bố cục Trang

Bắt đầu mỗi tài liệu trên Trang Mới, Liên tục, hoặc Trang Chẵn/Lẻ:

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

Đồng nhất lề/kích thước trang bằng cách sao chép PageSetup từ một phần mẫu:

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

Đầu trang, Chân trang và Đánh dấu nước

Giữ đầu/trang nguồn, hoặc thay thế chúng bằng một bộ chính sau khi hợp nhất:

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

Trường, Cross‑References, và TOC

Sau khi hợp nhất, cập nhật các trường để số trang, tham chiếu, và Mục lục phù hợp với bố cục mới:

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

Nếu bạn duy trì một TOC chính duy nhất, chèn nó một lần và để nó tự động xây dựng lại:

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

Đầu‑luồng / Hợp nhất Lượng lớn

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
}

Mẹo hiệu năng:

  • Thêm hàng loạt trong bộ nhớ; gọi UpdateFields() một lần ở cuối.
  • Ưu tiên UseDestinationStyles khi bạn muốn kiểu dáng nhất quán trên hàng chục đầu vào.
  • Giải phóng Document các thể hiện sớm trong các pipeline dài để giảm mức sử dụng bộ nhớ tối đa.

Các thực tiễn tốt nhất

  • Tiền‑xác thực đối với lỗi/mật khẩu để tránh việc hợp nhất một phần.
  • Chọn KeepSourceFormatting khi độ trung thực thương hiệu quan trọng; chọn UseDestinationStyles để có giao diện đồng nhất.
  • Chèn một ngắt phần trước mỗi lần nối để bảo vệ thiết lập trang.
  • Hợp nhất đầu trang/chân trang sau khi nối nếu bạn muốn một mẫu doanh nghiệp duy nhất.
  • Cập nhật các trường & TOC như bước cuối cùng.
  • Đối với các lô rất lớn, hãy chia thành các nhóm và hợp nhất các nhóm để giữ bộ nhớ ổn định.

FAQ

  1. Tôi có thể buộc mỗi nguồn bắt đầu trên một trang mới không? Có. Chèn một phần hoặc ngắt trang trước mỗi AppendDocument lệnh gọi hoặc thiết lập SectionStart để NewPage.
  2. Làm sao tôi giữ lại các style đích khi nhập? Sử dụng ImportFormatMode.UseDestinationStyles trong AppendDocument.
  3. Số trang và TOC có tự động cập nhật không? Gọi UpdateFields() (và UpdatePageLayout() để phân trang chính xác) sau khi thêm tất cả.
  4. Cần Office không? Không. Aspose.Words là một thư viện độc lập.
 Tiếng Việt