مُدمج المستندات
ال Aspose.Words Document Merger for .NET يسمح لك برمجياً دمج أي عدد من المستندات المتوافقة مع Word في مخرجات واحدة مع الحفاظ على التنسيق، الأنماط، تخطيط الصفحة، رؤوس/تذييلات، والحقول. تشمل الاستخدامات الشائعة تجميع التقارير، تجميع ملاحق العقود، أو تجميع المحتوى المُنشأ للأرشفة.
يعمل بدون واجهة رسومية على Windows و Linux و macOS. لا يلزم وجود Microsoft Office.
التثبيت والإعداد
- قم بتثبيت حزمة NuGet
Aspose.Words. - طبق الترخيص القائم على القياس عند بدء تشغيل التطبيق لتجنب علامات مائية للتقييم. راجع Metered Licensing .
- تحقق من متطلبات الإطار في دليل التثبيت .
بيئات التطوير المتكاملة: Visual Studio 2017–2026, JetBrains Rider, MonoDevelop.
المدخلات / المخرجات المدعومة: DOC, DOCX, RTF, DOT, DOTX, DOTM, DOCM, Word 2003 XML, و 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 — يطابق أسماء الأنماط المتطابقة مع تعريفات الوجهة للحصول على مظهر موحد.
Controlled Section & Page Layout — تخطيط القسم والصفحة المتحكم فيه
ابدأ كل مستند على صفحة جديدة, مستمر,، أو صفحة زوجية/فردية:
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إذا كنت تحتفظ بفهرس محتويات رئيسي واحد، أدرجه مرة واحدة ودعه يُعيد بناء نفسه تلقائيًا:
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
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 عندما تريد تنسيقًا موحدًا عبر العشرات من المدخلات.
- تخلص
Documentinstances مبكرًا في خطوط الأنابيب الطويلة لتقليل الذاكرة القصوى.
أفضل الممارسات
- التحقق المسبق من أجل الفساد/كلمات المرور لتجنب الدمج الجزئي.
- اختر KeepSourceFormatting عندما تكون دقة العلامة التجارية مهمة؛ اختر UseDestinationStyles للحصول على مظهر موحد.
- أدرج a فاصل القسم قبل كل إلحاق لحماية إعداد الصفحة.
- توحيد رؤوس/تذييلات بعد الإلحاق إذا كنت تريد قالبًا مؤسسيًا واحدًا.
- تحديث الحقول وفهرس المحتويات كخطوة نهائية.
- بالنسبة للدفعات الكبيرة جدًا، قسّمها إلى مجموعات وادمج المجموعات للحفاظ على استقرار الذاكرة.
FAQ
- هل يمكنني إجبار كل مصدر على البدء في صفحة جديدة؟? نعم. أدخل فاصل قسم أو صفحة قبل كل
AppendDocumentنداء أو مجموعةSectionStartإلىNewPage. - كيف أحافظ على أنماط الوجهة أثناء الاستيراد؟? استخدام
ImportFormatMode.UseDestinationStylesفيAppendDocument. - هل سيتم تحديث أرقام الصفحات وفهرس المحتويات تلقائيًا؟? استدعاء
UpdateFields()(وUpdatePageLayout()لترقيم صفحات دقيق) بعد جميع الإضافات. - هل Office مطلوب؟? لا. Aspose.Words هي مكتبة مستقلة.