مُدمج المستندات

ال Aspose.Words Document Merger for .NET يسمح لك برمجياً دمج أي عدد من المستندات المتوافقة مع Word في مخرجات واحدة مع الحفاظ على التنسيق، الأنماط، تخطيط الصفحة، رؤوس/تذييلات، والحقول. تشمل الاستخدامات الشائعة تجميع التقارير، تجميع ملاحق العقود، أو تجميع المحتوى المُنشأ للأرشفة.

يعمل بدون واجهة رسومية على Windows و Linux و macOS. لا يلزم وجود Microsoft Office.

التثبيت والإعداد

  1. قم بتثبيت حزمة NuGet Aspose.Words.
  2. طبق الترخيص القائم على القياس عند بدء تشغيل التطبيق لتجنب علامات مائية للتقييم. راجع Metered Licensing .
  3. تحقق من متطلبات الإطار في دليل التثبيت .

بيئات التطوير المتكاملة: 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 عندما تريد تنسيقًا موحدًا عبر العشرات من المدخلات.
  • تخلص Document instances مبكرًا في خطوط الأنابيب الطويلة لتقليل الذاكرة القصوى.

أفضل الممارسات

  • التحقق المسبق من أجل الفساد/كلمات المرور لتجنب الدمج الجزئي.
  • اختر KeepSourceFormatting عندما تكون دقة العلامة التجارية مهمة؛ اختر UseDestinationStyles للحصول على مظهر موحد.
  • أدرج a فاصل القسم قبل كل إلحاق لحماية إعداد الصفحة.
  • توحيد رؤوس/تذييلات بعد الإلحاق إذا كنت تريد قالبًا مؤسسيًا واحدًا.
  • تحديث الحقول وفهرس المحتويات كخطوة نهائية.
  • بالنسبة للدفعات الكبيرة جدًا، قسّمها إلى مجموعات وادمج المجموعات للحفاظ على استقرار الذاكرة.

FAQ

  1. هل يمكنني إجبار كل مصدر على البدء في صفحة جديدة؟? نعم. أدخل فاصل قسم أو صفحة قبل كل AppendDocument نداء أو مجموعة SectionStart إلى NewPage.
  2. كيف أحافظ على أنماط الوجهة أثناء الاستيراد؟? استخدام ImportFormatMode.UseDestinationStyles في AppendDocument.
  3. هل سيتم تحديث أرقام الصفحات وفهرس المحتويات تلقائيًا؟? استدعاء UpdateFields()UpdatePageLayout() لترقيم صفحات دقيق) بعد جميع الإضافات.
  4. هل Office مطلوب؟? لا. Aspose.Words هي مكتبة مستقلة.
 عربي