مقارنة مستندات PDF

يرجى ملاحظة أن جميع أدوات المقارنة متاحة في مكتبة Aspose.PDF.Drawing.

طرق مقارنة مستندات PDF

عند العمل مع مستندات PDF، هناك أوقات تحتاج فيها إلى مقارنة محتوى مستندين لتحديد الاختلافات. توفر مكتبة Aspose.PDF for .NET مجموعة أدوات قوية لهذا الغرض. في هذه المقالة، سنستكشف كيفية مقارنة مستندات PDF باستخدام مجموعة من مقتطفات التعليمات البرمجية البسيطة.

تتيح وظيفة المقارنة في Aspose.PDF لك مقارنة مستندين PDF صفحة بصفحة. يمكنك اختيار مقارنة صفحات محددة أو مستندات كاملة. تسلط وثيقة المقارنة الناتجة الضوء على الاختلافات، مما يسهل تحديد التغييرات بين الملفين.

إليك قائمة بطرق ممكنة لمقارنة مستندات PDF باستخدام مكتبة Aspose.PDF for .NET:

  1. مقارنة صفحات محددة - مقارنة الصفحات الأولى من مستندين PDF.

  2. مقارنة مستندات كاملة - مقارنة المحتوى الكامل لمستندين PDF.

  3. مقارنة مستندات PDF رسوميًا:

  • مقارنة PDF باستخدام طريقة GetDifference - صور فردية حيث يتم وضع علامات على التغييرات.

  • مقارنة PDF باستخدام طريقة CompareDocumentsToPdf - مستند PDF مع صور حيث يتم وضع علامات على التغييرات.

مقارنة صفحات محددة

توضح مقتطفات التعليمات البرمجية الأولى كيفية مقارنة الصفحات الأولى من مستندين PDF.

  1. تهيئة المستند. تبدأ التعليمات البرمجية بتهيئة مستندين PDF باستخدام مسارات الملفات الخاصة بهما (documentPath1 و documentPath2). يتم تحديد المسارات كسلاسل فارغة في الوقت الحالي، ولكن في الممارسة العملية، ستستبدل هذه بالمسارات الفعلية للملفات.

  2. عملية المقارنة.

  • اختيار الصفحة - تقتصر المقارنة على الصفحة الأولى من كل مستند (‘Pages[1]’).
  • خيارات المقارنة:

‘AdditionalChangeMarks = true’ - تضمن هذه الخيار عرض علامات التغيير الإضافية. تبرز هذه العلامات الاختلافات التي قد تكون موجودة في صفحات أخرى، حتى لو لم تكن على الصفحة الحالية التي تتم مقارنتها.

‘ComparisonMode = ComparisonMode.IgnoreSpaces’ - تخبر هذه الوضعية المقارن بتجاهل المسافات في النص، والتركيز فقط على التغييرات داخل الكلمات.

  1. يتم حفظ وثيقة المقارنة الناتجة، التي تبرز الاختلافات بين الصفحتين، إلى مسار الملف المحدد في ‘resultPdfPath’.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ComparingSpecificPages()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

    // Open PDF documents
    using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparingSpecificPages1.pdf"))
    {
        using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparingSpecificPages2.pdf"))
        {
            // Compare
            Aspose.Pdf.Comparison.SideBySidePdfComparer.Compare(document1.Pages[1], document2.Pages[1], dataDir + "ComparingSpecificPages_out.pdf", new Aspose.Pdf.Comparison.SideBySideComparisonOptions
            {
                AdditionalChangeMarks = true,
                ComparisonMode = Aspose.Pdf.Comparison.ComparisonMode.IgnoreSpaces,
                DeleteColor = Color.DarkGray,
                InsertColor = Color.LightYellow
            });
        }
    }
}

مقارنة مستندات كاملة

توسع مقتطف التعليمات البرمجية الثاني النطاق لمقارنة المحتوى الكامل لمستندين PDF.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ComparingEntireDocuments()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

    // Open PDF documents
    using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparingEntireDocuments1.pdf"))
    {
        using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparingEntireDocuments2.pdf"))
        {
            // Compare
            Aspose.Pdf.Comparison.SideBySidePdfComparer.Compare(
                document1,
                document2,
                dataDir + "ComparingEntireDocuments_out.pdf",
                new Aspose.Pdf.Comparison.SideBySideComparisonOptions
                {
                    AdditionalChangeMarks = true,
                    ComparisonMode = Aspose.Pdf.Comparison.ComparisonMode.IgnoreSpaces,
                    DeleteColor = Color.DarkGray,
                    InsertColor = Color.LightYellow
                });
        }
    }
}

تولد نتائج المقارنة الناتجة عن هذه المقتطفات مستندات PDF يمكنك فتحها في عارض مثل Adobe Acrobat. إذا استخدمت عرض الصفحتين في Adobe Acrobat، سترى التغييرات جنبًا إلى جنب:

  • الحذف - يتم ملاحظتها على الصفحة اليسرى.
  • الإدراجات - يتم ملاحظتها على الصفحة اليمنى.

من خلال تعيين ‘AdditionalChangeMarks’ إلى ’true’، يمكنك أيضًا رؤية علامات للتغييرات التي قد تحدث في صفحات أخرى، حتى لو لم تكن تلك التغييرات على الصفحة الحالية المعروضة.

Aspose.PDF for .NET توفر أدوات قوية لمقارنة مستندات PDF، سواء كنت بحاجة إلى مقارنة صفحات محددة أو مستندات كاملة. من خلال استخدام خيارات مثل ‘AdditionalChangeMarks’ وإعدادات ‘ComparisonMode’ المختلفة، يمكنك تخصيص عملية المقارنة وفقًا لاحتياجاتك الخاصة. يوفر المستند الناتج عرضًا واضحًا، جنبًا إلى جنب، للتغييرات، مما يسهل تتبع المراجعات وضمان دقة المستند.

يقوم المقارن الجانبي لمستندات PDF بإرجاع نتائج المقارنة ككائنات من الفئات التالية

الفئة الغرض الخصائص الرئيسية كيفية الاستخدام
SideBySideDocsComparisonResult يمثل نتيجة مقارنة جنبًا إلى جنب لمستندين PDF. * HasChanges – تشير إلى ما إذا تم اكتشاف أي تغييرات.
* FirstDocChanges – قائمة بالتغييرات مجمعة حسب صفحات النسخة الأولى من المستند.
* SecondDocChanges – قائمة بالتغييرات مجمعة حسب صفحات النسخة الثانية من المستند.
* FullChanges – التسلسل الكامل للتغييرات، حيث يتوافق كل عنصر مع زوج من الصفحات المقارنة ويحتوي على جميع عمليات المقارنة لتلك الصفحة.
يتم إرجاعه بواسطة طريقة SideBySidePdfComparer.Compare(Document, Document, string, SideBySideComparisonOptions). بعد الحصول على المثيل، يمكنك تحديد ما إذا كانت هناك أي تغييرات موجودة (HasChanges) والتكرار عبر المجموعات لاسترداد معلومات مفصلة حول الصفحات والقطع التي تغيرت.
SideBySidePagesComparisonResult يمثل نتيجة مقارنة جنبًا إلى جنب لصفحتين فرديتين من PDF. * HasChanges – تشير إلى ما إذا كانت هناك أي اختلافات بين الصفحتين.
* FirstPageChanges – قائمة بالتغييرات المكتشفة على الصفحة الأولى.
* SecondPageChanges – قائمة بالتغييرات المكتشفة على الصفحة الثانية.
* FullChanges – التسلسل الكامل لعمليات المقارنة بين الصفحتين.
يتم إرجاعه بواسطة طريقة SideBySidePdfComparer.Compare(Page, Page, string, SideBySideComparisonOptions). بعد الحصول على المثيل، يمكنك تحديد ما إذا كانت هناك أي تغييرات موجودة (HasChanges) والتكرار عبر المجموعات لاسترداد القائمة الكاملة للاختلافات.

الخصائص التفصيلية

الخاصية النوع الوصف
HasChanges bool تشير إلى ما إذا كان هناك اختلاف واحد على الأقل.
FirstDocChanges / FirstPageChanges List<List<EditContainer>> / List<EditContainer> تحتوي على التغييرات المكتشفة في الأول (المستند/الصفحة). بالنسبة للمستندات، هذه قائمة من القوائم، حيث تتوافق كل قائمة متداخلة مع صفحة واحدة.
SecondDocChanges / SecondPageChanges List<List<EditContainer>> / List<EditContainer> تحتوي على التغييرات المكتشفة في الثاني (المستند/الصفحة). بالنسبة للمستندات، هذه قائمة من القوائم، حيث تتوافق كل قائمة متداخلة مع صفحة واحدة.
FullChanges List<List<DiffOperation>> (المستندات)
List<DiffOperation> (الصفحات)
مجموعة موحدة من جميع عمليات المقارنة. بالنسبة للمستندات، هذه قائمة ثنائية الأبعاد حيث يتوافق كل عنصر خارجي مع زوج من الصفحات المقارنة. بالنسبة للصفحات، هي قائمة مسطحة من العمليات.
DiffOperation (نوع خارجي) تصف تغييرًا معينًا (إدراج، حذف، تطابق).

مثال على الاستخدام

  // For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
  private static void ComparingEntireDocuments()
  {
      // The path to the documents directory
      var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

      // --- Comparing pages ----------------------------

      // Open PDF documents
      using (Document doc1 = new Document(dataDir + "ComparingEntireDocuments1.pdf"),
             doc2 = new Document(dataDir + "ComparingEntireDocuments2.pdf"))
      {
          // Compare
          SideBySidePagesComparisonResult pageResult = SideBySidePdfComparer.Compare(
              doc1.Pages[1],
              doc2.Pages[1],
              dataDir + "ComparingEntireDocuments_out.pdf",
              new SideBySideComparisonOptions
              {
                  AdditionalChangeMarks = false,
                  ComparisonMode = ComparisonMode.Normal
              });

          Console.WriteLine("=== Page Comparison ===");

          Console.WriteLine(pageResult.HasChanges ? "Changes were detected" : "No changes detected");

          Console.WriteLine($"First page changes count : {pageResult.FirstPageChanges.Count}");
          Console.WriteLine($"Second page changes count: {pageResult.SecondPageChanges.Count}");
          Console.WriteLine($"Total changes count      : {pageResult.FullChanges.Count}");
      }

      // --- Comparing documents ----------------------------

      // Open PDF documents
      using (Document doc1 = new Document(dataDir + "ComparingEntireDocuments1.pdf"),
             doc2 = new Document(dataDir + "ComparingEntireDocuments2.pdf"))
      {
          // Compare
          SideBySideDocsComparisonResult docResult = SideBySidePdfComparer.Compare(
              doc1,
              doc2,
              dataDir + "ComparingEntireDocuments_out.pdf",
              new SideBySideComparisonOptions
              {
                  AdditionalChangeMarks = false,
                  ComparisonMode = ComparisonMode.Normal
              });

          Console.WriteLine("\n=== Document Comparison ===");

          Console.WriteLine(docResult.HasChanges ? "Changes were detected" : "No changes detected");

          Console.WriteLine($"First document changes count : {Count(docResult.FirstDocChanges)} ");
          Console.WriteLine($"Second document changes count: {Count(docResult.SecondDocChanges)}");
          Console.WriteLine($"Total changes count          : {Count(docResult.FullChanges)}");
      }
  }

 private static int Count<T>(List<List<T>> list)
  {
      int count = 0;
      foreach (var innerList in list)
      {
          count += innerList.Count;
      }
      return count;
  }

EditContainer هو كائن مساعد يصف تغييرًا فرديًا تم اكتشافه أثناء مقارنة صفحات PDF (أو المستندات). يعمل كـ “حاوية” تخزن معرف التغيير، نوع الاختلاف، علامات إضافية، وإحداثيات هندسية (مستطيلات) تشير إلى الموقع الدقيق للتغيير على الصفحة.

الخاصية النوع الوصف
Id int معرف فريد للتغيير. يسمح بتمييز تغيير واحد عن آخر في نتيجة المقارنة. يستخدم في تعليقات التغيير على الصفحات.
Operation DiffOperation نوع عملية الفرق التي تصف طبيعة التغيير (إدراج، حذف، استبدال، إلخ).
Rects List<Rectangle> مجموعة من المناطق المستطيلة التي تغطي الجزء المعدل على الصفحة.

مقارنة مستندات PDF باستخدام GraphicalPdfComparer

عند التعاون في المستندات، خاصة في البيئات المهنية، غالبًا ما ينتهي بك الأمر مع إصدارات متعددة من نفس الملف.

يمكنك استخدام فئة GraphicalPdfComparer لمقارنة مستندات PDF والصفحات. الفئة مناسبة لمقارنة التغييرات في محتوى الصفحة الرسومي.

مع Aspose.PDF for .NET، من الممكن مقارنة المستندات والصفحات وإخراج نتيجة المقارنة إلى مستند PDF أو ملف صورة.

يمكنك تعيين الخصائص التالية للفئة:

  • الدقة - الدقة بوحدات DPI للصور الناتجة، وكذلك للصور التي تم إنشاؤها أثناء المقارنة.
  • اللون - لون علامات التغيير.
  • العتبة - عتبة التغيير بالنسبة المئوية. القيمة الافتراضية هي صفر. تعيين قيمة غير صفرية يسمح لك بتجاهل التغييرات الرسومية التي تعتبر غير مهمة بالنسبة لك.

تحتوي الفئة على طريقة تتيح لك الحصول على اختلافات صورة الصفحة بشكل مناسب لمزيد من المعالجة: ImagesDifference GetDifference(Page page1, Page page2).

تُرجع هذه الطريقة كائنًا من فئة ImagesDifference التي تحتوي على صورة الصفحة الأولى التي تتم مقارنتها ومصفوفة من الاختلافات. تحتوي مصفوفة الاختلافات والصورة الأصلية على تنسيق بكسل RGB24bpp.

تتيح لك ImagesDifference إنشاء صورة مختلفة والحصول على صورة الصفحة الثانية التي تتم مقارنتها عن طريق إضافة مصفوفة الاختلافات إلى الصورة الأصلية. للقيام بذلك، استخدم طرق ImagesDifference.GetDestinationImage و ImagesDifference.DifferenceToImage.

مقارنة PDF باستخدام طريقة GetDifference

تحدد التعليمات البرمجية المقدمة طريقة GetDifference التي تقارن مستندين PDF وتولد تمثيلات بصرية للاختلافات بينهما.

تقارن هذه الطريقة الصفحات الأولى من ملفي PDF وتولد صورتين PNG:

  • صورة واحدة (diffPngFilePath) تبرز الاختلافات بين الصفحات باللون الأحمر.
  • الصورة الأخرى (destPngFilePath) هي تمثيل بصري للصفحة الثانية من PDF.

يمكن أن تكون هذه العملية مفيدة للمقارنة المرئية للتغييرات أو الاختلافات بين إصدارين من مستند.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ComparePDFWithGetDifferenceMethod()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

    // Open PDF documents
    using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithGetDifferenceMethod1.pdf"))
    {
        using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithGetDifferenceMethod2.pdf"))
        {
            // Create comparer 
            var comparer = new Aspose.Pdf.Comparison.GraphicalPdfComparer();
            // Compare
            using (var imagesDifference = comparer.GetDifference(document1.Pages[1], document2.Pages[1]))
            {
                using (var diffImg = imagesDifference.DifferenceToImage(Aspose.Pdf.Color.Red, Aspose.Pdf.Color.White))
                {
                    diffImg.Save(dataDir + "ComparePDFWithGetDifferenceMethodDiffPngFilePath_out.png");
                }
                using (var destImg = imagesDifference.GetDestinationImage())
                {
                    destImg.Save(dataDir + "ComparePDFWithGetDifferenceMethodDestPngFilePath_out.png");
                }
            }
        }
    }
}

مقارنة PDF باستخدام طريقة CompareDocumentsToPdf

تستخدم مقتطف التعليمات البرمجية المقدمة طريقة CompareDocumentsToPdf التي تقارن مستندين وتولد تقرير PDF عن نتائج المقارنة.

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ComparePDFWithCompareDocumentsToPdfMethod()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();

    // Open PDF documents
    using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithCompareDocumentsToPdfMethod1.pdf"))
    {
        using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithCompareDocumentsToPdfMethod2.pdf"))
        {
            // Create comparer
            var comparer = new Aspose.Pdf.Comparison.GraphicalPdfComparer()
            {
                Threshold = 3.0,
                Color = Aspose.Pdf.Color.Blue,
                Resolution = new Aspose.Pdf.Devices.Resolution(300)
            };
            // Compare
            comparer.CompareDocumentsToPdf(document1, document2, dataDir + "compareDocumentsToPdf_out.pdf");
        }
    }
}

طريقة عالمية لمقارنة المستندات

يمكنك استخدام فئة TextPdfComparer لمقارنة المستندات والصفحات الفردية. تتيح الفئة مقارنة المستندات صفحة بصفحة أو كتيار محتوى مستمر واحد (بدون فصل الصفحات). تعيد طرق المقارنة مصفوفة من الاختلافات يمكن تمريرها إلى أي فئة تنفذ الواجهات IStringOutputGenerator أو IFileOutputGenerator لإنتاج إخراج مقارنة منسق. يتم دعم الإخراج في: HTML، Markdown، PDF، و JSON. يمكنك أيضًا استخدام فئة ComparisonStatistics للحصول على إحصائيات حول عمليات المقارنة المنفذة.

الطريقة الوصف المعلمات قيمة الإرجاع
CompareDocumentsPageByPage(Document document1, Document document2, ComparisonOptions options) تقارن مستندين PDF صفحة بصفحة. * document1 – المستند الأول.
* document2 – المستند الثاني.
* options – خيارات المقارنة (انظر أدناه).
List<List<DiffOperation>> – قائمة بالاختلافات لكل صفحة.
CompareDocumentsPageByPage(Document document1, Document document2, ComparisonOptions options, string resultPdfDocumentPath) نفس ما سبق، ولكن أيضًا يحفظ نتائج المقارنة في ملف PDF. نفس المعلمات كما في السابق + resultPdfDocumentPath – مسار الملف الناتج. List<List<DiffOperation>> – قائمة بالاختلافات.
CompareFlatDocuments(Document document1, Document document2, ComparisonOptions options) تقارن مستندين PDF كتيار نصي مستمر واحد (دمج جميع الصفحات). نفس المعلمات كما في CompareDocumentsPageByPage. List<DiffOperation> – قائمة بجميع الاختلافات.
CompareFlatDocuments(Document document1, Document document2, ComparisonOptions options, string resultPdfDocumentPath) مقارنة مستند مسطح مع حفظ النتيجة في ملف PDF. نفس المعلمات كما في CompareFlatDocuments + resultPdfDocumentPath. List<DiffOperation> – قائمة بالاختلافات.
ComparePages(Page page1, Page page2, ComparisonOptions options) تقارن صفحتين فرديتين. * page1 – الصفحة الأولى.
* page2 – الصفحة الثانية.
* options – خيارات المقارنة.
List<DiffOperation> – قائمة باختلافات الصفحة.
CreateComparisonStatistics(List<DiffOperation> diffs) تولد إحصائيات المقارنة لقائمة من العمليات (صفحة واحدة). diffs – قائمة من DiffOperation. TextItemComparisonStatistics (انظر أدناه).
CreateComparisonStatistics(List<List<DiffOperation>> diffs) تولد إحصائيات المقارنة لقائمة من العمليات عبر الصفحات (مستوى المستند). diffs – قائمة من قوائم DiffOperation. DocumentComparisonStatistics (انظر أدناه).
AssemblySourcePageText(List<DiffOperation> diffs) تعيد بناء النص الأصلي (قبل التغيير) للصفحة. diffs – قائمة من العمليات. string – النص الأصلي.
AssemblyDestinationPageText(List<DiffOperation> diffs) تعيد بناء النص المعدل (بعد التغيير) للصفحة. diffs – قائمة من العمليات. string – النص المعدل.

الفئات العامة ذات الصلة

ComparisonOptions

معلمات تؤثر على عملية المقارنة:

الخاصية النوع الوصف
ExtractionArea Rectangle المنطقة التي سيتم استخراج النص منها. غير متوافقة مع ExcludeTables، ExcludeAreas1/2.
ExcludeTables bool استبعاد الجداول من المقارنة. غير متوافقة مع ExtractionArea.
ExcludeAreas1 Rectangle[] مصفوفة من المناطق التي يجب استبعادها للمستند الأول.
ExcludeAreas2 Rectangle[] مصفوفة من المناطق التي يجب استبعادها للمستند الثاني.
EditOperationsOrder EditOperationsOrder (enum) ترتيب تطبيق عمليات الإدراج/الحذف (القيمة الافتراضية هي DeleteFirst).

DiffOperation

يمثل عملية اختلاف واحدة. يحتوي على:

الخاصية النوع الوصف
Operation Operation (enum) نوع العملية (Equal، Delete، Insert).
Text string النص المرتبط بالعملية.

ComparisonStatistics

الفئة الوصف
TextItemComparisonStatistics إحصائيات لنص فردي (صفحة). تشمل إجمالي الأحرف، عدد الإدراجات، الحذف، والعمليات المقابلة.
DocumentComparisonStatistics (ترث من TextItemComparisonStatistics) إحصائيات موسعة للمستند بالكامل، بما في ذلك قائمة بـ PagesStatistics (إحصائيات لكل صفحة).

مثال على الاستخدام