Fusionador de Documentos
El Aspose.Words Document Merger for .NET te permite programáticamente unir cualquier número de documentos Word‑compatible en una única salida mientras se preservan el formato, los estilos, el diseño de página, los encabezados/pies de página y los campos. Los usos típicos incluyen ensamblar informes, agrupar anexos de contratos o agregar contenido generado para archivarlo.
Funciona sin interfaz gráfica en Windows, Linux y macOS. No se requiere Microsoft Office.
Instalación y configuración
- Instala el paquete NuGet
Aspose.Words. - Aplica Metered Licensing al iniciar la aplicación para evitar marcas de agua de evaluación. Ver Metered Licensing .
- Verifica los requisitos del framework en el Guía de instalación .
IDEs: Visual Studio 2017–2026, JetBrains Rider, MonoDevelop.
Entradas / Salidas compatibles: DOC, DOCX, RTF, DOT, DOTX, DOTM, DOCM, Word 2003 XML, y Word 2007 XML.
Inicio rápido: Agregar varios documentos
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");Modos de formato de importación:
- KeepSourceFormatting — conserva los estilos y el formato directo de cada origen (ideal para inserciones de marca).
- UseDestinationStyles — asigna nombres de estilo idénticos a las definiciones del destino para un aspecto uniforme.
Sección Controlada y Diseño de Página
Iniciar cada documento en Nueva página, Continuo, o Página par/impar:
var sect = master.LastSection;
sect.PageSetup.SectionStart = SectionStart.NewPage; // Continuous, EvenPage, OddPageUnificar márgenes/tamaño de página copiando PageSetup de una sección de plantilla:
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;
}Encabezados, pies de página y marcas de agua
Mantener los encabezados/pies de página de origen, o reemplazarlos con un conjunto maestro después de la fusión:
// 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);
}Campos, referencias cruzadas y TOC
Después de combinar, actualice los campos para que los números de página, las referencias y Tabla de contenido coincidan con el nuevo diseño:
master.UpdateFields();
master.UpdatePageLayout(); // ensures accurate page count
master.UpdateTableLayout(); // improves complex table paginationSi mantienes una única TOC maestra, insértala una sola vez y permite que se reconstruya automáticamente:
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();Fusiones de alto volumen / Prioridad de flujo
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
}Consejos de rendimiento:
- Añadidos por lotes en memoria; llame
UpdateFields()una vez al final. - Prefiera UseDestinationStyles cuando desee un estilo coherente en decenas de entradas.
- Liberar
Documentinstancias temprano en pipelines largos para reducir la memoria pico.
Mejores prácticas
- Pre‑validar para corrupción/contraseñas para evitar fusiones parciales.
- Elija KeepSourceFormatting cuando la fidelidad de la marca importa; elija UseDestinationStyles para un aspecto uniforme.
- Inserte un salto de sección antes de cada anexado para proteger la configuración de página.
- Unificar encabezados/pies de página después de agregar si deseas una única plantilla corporativa.
- Actualizar campos & TOC como paso final.
- Para lotes muy grandes, divide en grupos y fusiona los grupos para mantener estable la memoria.
FAQ
- ¿Puedo obligar a que cada origen comience en una nueva página? Sí. Inserte una sección o salto de página antes de cada
AppendDocumentllamada o conjuntoSectionStartaNewPage. - ¿Cómo mantengo los estilos de destino al importar? Utilice
ImportFormatMode.UseDestinationStylesenAppendDocument. - ¿Se actualizarán automáticamente los números de página y el TOC? Llamar
UpdateFields()(yUpdatePageLayout()para una paginación precisa) después de todas las inserciones. - ¿Se requiere Office? No. Aspose.Words es una biblioteca independiente.