Document Merger
De Aspose.Words Document Merger for .NET laat je programmatisch voegt een willekeurig aantal Word‑compatibele documenten samen naar één enkele output terwijl de opmaak, stijlen, paginalay-out, kop‑ en voetteksten, en velden behouden blijven. Typische toepassingen omvatten het samenstellen van rapporten, het bundelen van contractbijlagen, of het aggregeren van gegenereerde inhoud voor archivering.
Werkt headless op Windows, Linux en macOS. Microsoft Office is niet vereist.
Installatie en configuratie
- Installeer het NuGet‑pakket
Aspose.Words. - Pas metered licensing toe bij het opstarten van de app om evaluatiewatermerken te vermijden. Zie Metered Licensing .
- Controleer de framework‑vereisten in de Installatiehandleiding .
IDE’s: Visual Studio 2017–2026, JetBrains Rider, MonoDevelop.
Ondersteunde invoer / uitvoer: DOC, DOCX, RTF, DOT, DOTX, DOTM, DOCM, Word 2003 XML, en Word 2007 XML.
Snelstart: Meerdere documenten toevoegen
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");Importformaatmodi:
- KeepSourceFormatting — behoudt de stijlen en directe opmaak van elke bron (ideaal voor merkgebonden inserts).
- UseDestinationStyles — map identieke stijlnamen naar de definities van de bestemming voor een uniform uiterlijk.
Geregelde sectie & paginalay-out
Begin elk document op Nieuwe pagina, Continu, of Even/Oneven pagina:
var sect = master.LastSection;
sect.PageSetup.SectionStart = SectionStart.NewPage; // Continuous, EvenPage, OddPageUniformeer marges/paginaformaat door te kopiëren PageSetup van een sjabloonsectie:
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;
}Koppen, voetteksten en watermerken
Bewaar bronkoppen/voetteksten, of vervang ze door een masterset na het samenvoegen:
// 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);
}Velden, kruisverwijzingen en TOC
Na het samenvoegen, werk velden bij zodat paginanummers, verwijzingen, en Inhoudsopgave overeenkomen met de nieuwe lay-out:
master.UpdateFields();
master.UpdatePageLayout(); // ensures accurate page count
master.UpdateTableLayout(); // improves complex table paginationAls je een enkele master TOC bijhoudt, voeg deze dan één keer in en laat hem automatisch opnieuw opbouwen:
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 samenvoegingen
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
}Prestatie‑tips:
- Batch-append in het geheugen; roep
UpdateFields()eenmalig aan het einde. - Voorkeur UseDestinationStyles wanneer je consistente styling wilt over tientallen invoerbestanden.
- Verwijder
Documentinstanties vroeg in lange pipelines om piekgeheugen te verminderen.
Best practices
- Pre‑valideren op corruptie/wachtwoorden om gedeeltelijke samenvoegingen te voorkomen.
- Kies KeepSourceFormatting wanneer merktrouw belangrijk is; kies UseDestinationStyles voor een uniforme uitstraling.
- Voeg een sectie‑einde voor elke toevoeging om de paginainstelling te beschermen.
- Koppen/voetteksten uniformeren na het toevoegen als je één corporate-sjabloon wilt.
- Velden & inhoudsopgave bijwerken als de laatste stap.
- Voor zeer grote batches, splits in groepen en voeg de groepen samen om het geheugen stabiel te houden.
FAQ
- Kan ik elke bron dwingen op een nieuwe pagina te beginnen? Ja. Voeg een sectie- of pagina-einde in vóór elke
AppendDocumentaanroep of setSectionStartnaarNewPage. - Hoe behoud ik de bestemmingsstijlen bij het importeren? Gebruik
ImportFormatMode.UseDestinationStylesinAppendDocument. - Worden paginanummers en inhoudsopgave automatisch bijgewerkt? Roep
UpdateFields()(enUpdatePageLayout()voor precieze paginering) na alle toevoegingen. - Is Office vereist? Nee. Aspose.Words is een zelfstandige bibliotheek.