Penggabung Dokumen Aspose.Words untuk .NET
Aspose.Words Document Merger untuk .NET memungkinkan Anda secara programmatik menyambungkan sejumlah dokumen yang kompatibel dengan Word ke dalam satu output sambil mempertahankan format, gaya, layout halaman, headers/footers, dan medan.
Beroperasi dengan baik di Windows, Linux, dan macOS. Tidak diperlukan Microsoft Office.
Instalasi dan Setup
- Menginstal paket NuGet
Aspose.Words
. - Mengaplikasikan lisensi berukuran di startup aplikasi untuk menghindari penilaian. lihat Lisensi berukur .
- Periksa persyaratan kerangka kerja di Panduan Pemasangan .
Input yang didukung (seleksi): DOC, DOCX, DOTX/DOTM, RTF, ODT, HTML/MHTML, PDF, TXT, WordML.Output yang didukung: DOCX, DOC, PDF, HTML (fixed/flow), MHTML, ODT, RTF, gambar, EPUB, XPS, dan banyak lagi.
Mulai dengan cepat: Tambahkan beberapa dokumen
using Aspose.Words;
// Destination (master) document
var master = new Document();
var builder = new DocumentBuilder(master);
// Start on a clean page
builder.InsertBreak(BreakType.SectionBreakNewPage);
// Append each source with chosen import mode
ImportFormatMode mode = ImportFormatMode.KeepSourceFormatting; // or UseDestinationStyles
foreach (string path in new [] { "intro.docx", "spec.docx", "annex.rtf" })
{
var src = new Document(path);
master.AppendDocument(src, mode);
// Optional: force each source to start on a new page
builder.MoveToDocumentEnd();
builder.InsertBreak(BreakType.SectionBreakNewPage);
}
// Refresh fields (page numbers, TOC, cross‑refs)
master.UpdateFields();
master.Save("MergedOutput.pdf");
Format Modus Import
- KeepSourceFormatting – mempertahankan gaya setiap sumber dan pemformatan langsung (ideal untuk insert berjenama).
- UseDestinationStyles — peta nama gaya yang identik dengan definisi tujuan untuk tampilan seragam.
Layout Section & Page yang Terkontrol
Memulai setiap dokumen dengan ** Page New ** , ** Continuous ** atau ** Even/Odd Page**:
var sect = master.LastSection;
sect.PageSetup.SectionStart = SectionStart.NewPage; // Continuous, EvenPage, OddPage
Unify margin/page size dengan menyalin PageSetup
Dari bagian template:
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 dan Watermarks
Tetap kepala sumber / kaki, atau menggantikan mereka dengan set master setelah penggabungan:
// 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);
}
Bidang, referensi silang, dan TOC
Setelah menggabungkan, update medan sehingga nomor halaman, referensi, dan Table of Contents sepadan dengan tata letak baru:
master.UpdateFields();
master.UpdatePageLayout(); // ensures accurate page count
master.UpdateTableLayout(); // improves complex table pagination
Jika Anda mempertahankan satu master TOC, masukkan sekali dan biarkan kembali secara otomatis:
var b = new DocumentBuilder(master);
b.MoveToDocumentStart();
b.InsertTableOfContents("TOC \o \h \z \u"); // classic TOC switch set
master.UpdateFields();
Password-Protected Inputs & Secure Output
using Aspose.Words.Loading;
var load = new LoadOptions { Password = "secret" };
var protectedDoc = new Document("protected.docx", load);
master.AppendDocument(protectedDoc, ImportFormatMode.KeepSourceFormatting);
// Save encrypted PDF
using Aspose.Words.Saving;
var pdf = new PdfSaveOptions
{
EncryptionDetails = new PdfEncryptionDetails("openPwd", "ownerPwd",
PdfEncryptionAlgorithm.RC4_128)
{ Permissions = PdfPermissions.DisallowAll }
};
master.Save("MergedEncrypted.pdf", pdf);
Stream-First / Merges Volume Tinggi
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.Pdf);
output.Position = 0;
// return/output stream
}
Tipe kinerja
- Batch melekat dalam memori; panggilan
UpdateFields()
sekali di akhir. - Lebih baik UseDestinationStyles ketika Anda ingin styling konsisten di atas puluhan input.
- Dispose
Document
Contoh awal dalam pipa panjang untuk mengurangi memori puncak.
Mengendalikan format campuran (HTML, PDF, TXT)
- HTML/MHTML: impor dengan gaya dan gambar (terhubung atau tertanam).
- PDF : halaman diimpor sebagai konten berfluktuasi di mana mungkin; tataletak kompleks disimpan selama output ke format tetap (misalnya, PDF).
- TXT : ditambah sebagai paragraf rata; gunakan gaya dasar setelah impor untuk konsistensi.
Praktik Terbaik
- Pre-validate untuk korupsi/password untuk menghindari penggabungan parsial.
- Pilih **KeepSourceFormatting ** ketika brand loyalitas penting; pilih UseDestinationStyles untuk tampilan seragam.
- Masukkan section break sebelum setiap lampiran untuk melindungi setup halaman.
- Unify headers/footers setelah menyambung jika Anda ingin satu template perusahaan.
- Update fields & TOC sebagai langkah terakhir.
- Untuk batch yang sangat besar, dibagi menjadi kelompok dan menggabungkan kelompok untuk menjaga memori stabil.
FAQ
**Bolehkah saya memaksa setiap sumber untuk memulai pada halaman baru?**Masukkan bagian atau halaman pecah sebelum masing-masing AppendDocument
panggilan atau set SectionStart
Untuk NewPage
.
**Bagaimana saya mempertahankan gaya tujuan saat mengimport?**Penggunaan ImportFormatMode.UseDestinationStyles
dalam AppendDocument
.
**Apakah nomor halaman dan TOC akan diperbarui secara otomatis?**panggilan UpdateFields()
(dan UpdatePageLayout()
untuk halaman yang tepat) setelah semua appends.
**Bolehkah saya menggabungkan input yang disulitkan dan menghasilkan output yang tersulit?**Ya, memberikan LoadOptions.Password
Untuk input dan penggunaan PdfSaveOptions.EncryptionDetails
(atau OoxmlSaveOptions.Password
) untuk produksi.
**Apakah kantor diperlukan?**No. Aspose.Words adalah perpustakaan yang terpisah.