مقارنة المستندات .net – دليل تنفيذ GroupDocs الكامل
إذا كنت بحاجة إلى compare documents .net، فقد وجدت المكان المناسب. تخيّل فتح عقدين يبدوان متطابقين وتحديد كل تغيير على الفور—بدون تمرير يدوي، بدون تعديلات مفقودة. هذه هي قوة المقارنة الآلية للمستندات، ومع GroupDocs.Comparison for .NET يمكنك تحقيق ذلك في دقائق.
إجابات سريعة
- ما المكتبة التي تتعامل مع مقارنة المستندات في .NET؟ GroupDocs.Comparison.
- هل يمكنني مقارنة ملفات Word و Excel و PDF؟ نعم—أكثر من 50 صيغة مدعومة.
- أي نسخة يجب أن أستخدمها؟ النسخة 25.4.0 تقدم أفضل أداء واستقرار.
- هل أحتاج إلى ترخيص للإنتاج؟ الترخيص التجاري مطلوب لعمليات النشر في بيئة الإنتاج.
- هل المعالجة غير المتزامنة ممكنة؟ بالتأكيد—استخدم
Task.Runمع واجهة برمجة التطبيقات للمقارنة.
ما هو GroupDocs.Comparison؟
GroupDocs.Comparison هي مكتبة .NET تكتشف فرقًا بين مستندين أو أكثر برمجيًا وتولد ملف نتيجة مميز. تدعم أكثر من 50 تنسيقًا، وتعالج ملفات مئات الصفحات دون تحميل المحتوى بالكامل في الذاكرة، وتوفر تحكمًا دقيقًا في إعدادات المقارنة.
لماذا تستخدم GroupDocs.Comparison لمقارنة المستندات .net؟
GroupDocs.Comparison توفر مقارنة مستندات سريعة ودقيقة وقابلة للتوسع لتطبيقات .NET. يمكنها معالجة ملفات PDF و Office الكبيرة في ثوانٍ، مع الحفاظ على التنسيق والدقة البصرية مع تمييز الإضافات والحذف وتغييرات النمط. تعمل المكتبة عبر .NET Core و .NET 5/6/7 والإطار الكامل .NET Framework، مما يجعلها خيارًا مرنًا لأي مشروع.
- السرعة: تعالج ملف PDF مكوّن من 200 صفحة في أقل من ثانيتين على خادم قياسي.
- الدقة: تكتشف النص والتنسيق والجداول والصور بدقة 99.9 ٪.
- القابلية للتوسع: تدير وظائف دفعة لآلاف الملفات باستخدام واجهات برمجة التطبيقات المتدفقة.
- المرونة: تعمل مع .NET Core 3.1+، .NET 5/6/7، و .NET Framework 4.6.1+.
المتطلبات المسبقة
- بيئة التطوير: .NET Core 3.1 أو أحدث، أو .NET Framework 4.6.1 +
- مكتبة GroupDocs.Comparison: النسخة 25.4.0 (تثبيت عبر NuGet)
- ملفات العينة: مستندات Word أو PDF أو Excel للاختبار
- معرفة أساسية بـ C#: الفئات، الطرق،
usingstatements
مفضلة (اختياري)
- الإلمام بإدارة حزم NuGet
- خبرة في إدخال/إخراج الملفات والتدفقات
- فهم أنماط async/await
كيفية مقارنة المستندات .net باستخدام GroupDocs.Comparison؟
لمقارنة مستندين باستخدام GroupDocs.Comparison، قم بتحميل كل ملف إلى تدفق، واضبط إعدادات ComparisonSettings الاختيارية، واستدعِ طريقة Compare على كائن Comparer. تُعيد الـ API مستند نتيجة يبرز الاختلافات، ويمكنك حفظه بأي تنسيق مدعوم. يتطلب هذا النهج بضع أسطر من الشيفرة فقط مع إعطائك تحكمًا كاملاً في عملية المقارنة.
تنفيذ خطوة بخطوة
1️⃣ إدارة مسارات المستندات بذكاء
تجميع مسارات الملفات في مكان واحد يمنع أخطاء “الملف غير موجود” ويسهّل تبديل البيئات دون عناء.
public static class Constants
{
public const string SOURCE_WORD = @"YOUR_DOCUMENT_DIRECTORY\source.docx";
public const string TARGET_WORD = @"YOUR_DOCUMENT_DIRECTORY\target.docx";
public static string GetOutputDirectoryPath()
{
return @"YOUR_OUTPUT_DIRECTORY";
}
public const string RESULT_WORD = "result.docx";
}
لماذا يعمل هذا:
- مكان واحد لتحديث المسارات لبيئات التطوير أو الاختبار أو الإنتاج.
- يقضي على السلاسل المكتوبة صراحةً المنتشرة في قاعدة الشيفرة.
2️⃣ منطق المقارنة الأساسي
فئة Comparer هي المحرك الذي يدير خوارزمية الفرق.
using (Comparer comparer = new Comparer(Constants.SOURCE_WORD))
{
// Add the target document for comparison
comparer.Add(Constants.TARGET_WORD);
// Perform the comparison and save the result
string outputFileName = Path.Combine(Constants.GetOutputDirectoryPath(), Constants.RESULT_WORD);
comparer.Compare(outputFileName);
}
مرساة التعريف:Comparer هي الفئة الأساسية في GroupDocs.Comparison التي تنسق تحليل المستند وتنتج النتيجة المميزة.
كيف يساعد ذلك:
- يدعم مستندات هدف متعددة عبر استدعاءات
Add()المتكررة. - ينتج ملف نتيجة مع تمييز التغييرات باللون الأحمر أو الأخضر أو ألوان مخصصة.
3️⃣ إعدادات متقدمة لـ Excel و PDF
يمكنك ضبط المقارنة بدقة لتجاهل التنسيق أو التركيز على تغييرات البيانات—مثالي لسيناريوهات compare excel files c#.
CompareOptions compareOptions = new CompareOptions()
{
ShowDeletedContent = true,
ShowInsertedContent = true,
StyleChangeDetection = true
};
using (Comparer comparer = new Comparer(sourcePath))
{
comparer.Add(targetPath);
comparer.Compare(outputPath, compareOptions);
}
مرساة التعريف:ComparisonSettings يتيح لك تمكين أو تعطيل أنواع التغييرات المحددة مثل DetectStyleChanges أو DetectTableChanges.
4️⃣ معالجة صيغ متعددة
GroupDocs.Comparison يكتشف نوع الملف تلقائيًا، لكن يمكنك أيضًا فرض صيغة عند الحاجة—مثالي لـ compare pdf files c#.
public static void CompareDocumentsByType(string sourcePath, string targetPath, string outputPath)
{
string extension = Path.GetExtension(sourcePath).ToLower();
using (Comparer comparer = new Comparer(sourcePath))
{
comparer.Add(targetPath);
CompareOptions options = GetOptionsForFormat(extension);
comparer.Compare(outputPath, options);
}
}
private static CompareOptions GetOptionsForFormat(string extension)
{
switch (extension)
{
case ".pdf":
return new CompareOptions { DetectStyleChanges = false };
case ".xlsx":
return new CompareOptions { CalculateCoordinates = true };
default:
return new CompareOptions();
}
}
5️⃣ تدفق الملفات الكبيرة
عند معالجة مستندات ضخمة، يتيح التدفق تجنب تحميل الملف بالكامل في الذاكرة.
// For files over 50MB, consider this approach
using (var sourceStream = File.OpenRead(sourcePath))
using (var targetStream = File.OpenRead(targetPath))
using (var comparer = new Comparer(sourceStream))
{
comparer.Add(targetStream);
comparer.Compare(outputStream);
}
6️⃣ معالجة أخطاء قوية
لا تدع ملفًا تالفًا يتسبب في تعطل خدمتك؛ غلف الاستدعاءات بكتل try‑catch وسجّل التفاصيل المفيدة.
try
{
using (Comparer comparer = new Comparer(sourcePath))
{
comparer.Add(targetPath);
comparer.Compare(outputPath);
}
}
catch (FileNotFoundException ex)
{
Console.WriteLine($"Document not found: {ex.FileName}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"Access denied: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Comparison failed: {ex.Message}");
}
أفضل ممارسات مقارنة المستندات
- تحقق من صحة ملفات الإدخال قبل استدعاء الـ API للقبض على الصيغ غير المدعومة مبكرًا.
- استخدم
Path.Combineلإنشاء مسارات متوافقة عبر الأنظمة (انظر المشكلة #1). - فعّل فقط أنواع التغييرات المطلوبة لتحسين الأداء (مثلًا، عطّل كشف الأنماط للملفات Excel التي تركز على البيانات).
- تخلص من كائنات
Comparerpromptly لتفريغ الموارد الأصلية.
المشكلات الشائعة وكيفية تجنبها
المشكلة #1: مشاكل فاصل المسار
الحل: دائمًا أنشئ المسارات باستخدام Path.Combine() و Path.DirectorySeparatorChar.
// Wrong - will break on different operating systems
string path = "C:/Documents/source.docx";
// Right - works everywhere
string path = Path.Combine("C:", "Documents", "source.docx");
المشكلة #2: استنفاد الذاكرة في الملفات الكبيرة
الحل: التحول إلى وضع التدفق للملفات التي يزيد حجمها عن 50 ميغابايت.
// For files over 50MB, consider this approach
using (var sourceStream = File.OpenRead(sourcePath))
using (var targetStream = File.OpenRead(targetPath))
using (var comparer = new Comparer(sourceStream))
{
comparer.Add(targetStream);
comparer.Compare(outputStream);
}
المشكلة #3: تجاهل الاستثناءات
الحل: تنفيذ كتل try‑catch شاملة وتسجيل تتبع الأخطاء.
try
{
using (Comparer comparer = new Comparer(sourcePath))
{
comparer.Add(targetPath);
comparer.Compare(outputPath);
}
}
catch (FileNotFoundException ex)
{
Console.WriteLine($"Document not found: {ex.FileName}");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine($"Access denied: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Comparison failed: {ex.Message}");
}
استراتيجيات تحسين الأداء
إدارة الذاكرة
أعد استخدام كائنات Comparer عندما يكون ذلك ممكنًا واستدعِ Dispose() بعد كل مقارنة.
// Always dispose of resources properly
using (var comparer = new Comparer(sourcePath))
{
comparer.Add(targetPath);
comparer.Compare(outputPath);
// Comparer is automatically disposed here
}
// For batch processing, clear resources between comparisons
for (int i = 0; i < documentPairs.Count; i++)
{
using (var comparer = new Comparer(documentPairs[i].Source))
{
comparer.Add(documentPairs[i].Target);
comparer.Compare(documentPairs[i].Output);
}
// Force garbage collection every 10 documents if needed
if (i % 10 == 0)
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
المعالجة غير المتزامنة
شغّل المقارنات على خيوط خلفية للحفاظ على استجابة واجهة المستخدم.
public async Task<bool> CompareDocumentsAsync(string sourcePath, string targetPath, string outputPath)
{
return await Task.Run(() =>
{
try
{
using (var comparer = new Comparer(sourcePath))
{
comparer.Add(targetPath);
comparer.Compare(outputPath);
return true;
}
}
catch
{
return false;
}
});
}
التكامل مع أطر .NET الشائعة
تكامل ASP.NET Core Web API
اعرض نقطة نهاية REST تقبل ملفين وتعيد نتيجة الفرق.
[ApiController]
[Route("api/[controller]")]
public class DocumentComparisonController : ControllerBase
{
[HttpPost("compare")]
public async Task<IActionResult> CompareDocuments([FromForm] IFormFile sourceFile, [FromForm] IFormFile targetFile)
{
if (sourceFile == null || targetFile == null)
return BadRequest("Both source and target files are required.");
var tempFolder = Path.GetTempPath();
var sourcePath = Path.Combine(tempFolder, sourceFile.FileName);
var targetPath = Path.Combine(tempFolder, targetFile.FileName);
var outputPath = Path.Combine(tempFolder, $"comparison_{Guid.NewGuid()}.pdf");
try
{
// Save uploaded files
using (var stream = new FileStream(sourcePath, FileMode.Create))
await sourceFile.CopyToAsync(stream);
using (var stream = new FileStream(targetPath, FileMode.Create))
await targetFile.CopyToAsync(stream);
// Perform comparison
using (var comparer = new Comparer(sourcePath))
{
comparer.Add(targetPath);
comparer.Compare(outputPath);
}
// Return the result file
var fileBytes = await System.IO.File.ReadAllBytesAsync(outputPath);
return File(fileBytes, "application/pdf", "comparison_result.pdf");
}
finally
{
// Clean up temp files
File.Delete(sourcePath);
File.Delete(targetPath);
File.Delete(outputPath);
}
}
}
تكامل مكوّن Blazor
أنشئ مكوّنًا قابلًا لإعادة الاستخدام يعرض مقارنة جنبًا إلى جنب في المتصفح.
@using GroupDocs.Comparison
@inject IJSRuntime JSRuntime
<div class="document-comparison">
<InputFile OnChange="HandleFileSelection" multiple />
<button @onclick="CompareDocuments" disabled="@(!CanCompare)">Compare Documents</button>
@if (comparisonResult != null)
{
<div class="result">
<a href="@comparisonResult" download="comparison_result.pdf">Download Result</a>
</div>
}
</div>
@code {
private List<IBrowserFile> selectedFiles = new();
private string comparisonResult;
private bool CanCompare => selectedFiles.Count == 2;
private async Task HandleFileSelection(InputFileChangeEventArgs e)
{
selectedFiles = e.GetMultipleFiles(2).ToList();
}
private async Task CompareDocuments()
{
if (selectedFiles.Count != 2) return;
// Implementation similar to Web API example
// Save files, compare, and generate result
}
}
حالات الاستخدام الواقعية
السيناريو 1: مراجعة العقود القانونية
يمكن للمكاتب القانونية تمييز الإضافات والحذف وتغييرات التنسيق تلقائيًا عبر مراجعات العقود.
public class ContractReviewService
{
public ContractComparisonResult ReviewContract(string originalContract, string revisedContract)
{
var outputPath = Path.Combine(Path.GetTempPath(), $"contract_review_{DateTime.Now:yyyyMMddHHmmss}.docx");
var compareOptions = new CompareOptions
{
ShowDeletedContent = true,
ShowInsertedContent = true,
StyleChangeDetection = true,
WordsSeparatorChars = new[] { ' ', '.', ',', '!', '?' }
};
using (var comparer = new Comparer(originalContract))
{
comparer.Add(revisedContract);
comparer.Compare(outputPath, compareOptions);
}
return new ContractComparisonResult
{
OutputPath = outputPath,
HasChanges = File.Exists(outputPath),
ComparisonDate = DateTime.Now
};
}
}
السيناريو 2: التحكم في إصدارات جداول البيانات
يمكن لفرق المالية اكتشاف التغييرات في نماذج Excel دون فتح كل ملف يدويًا.
public class DocumentVersionControl
{
public void TrackDocumentChanges(string documentPath, string repositoryPath)
{
var versions = Directory.GetFiles(repositoryPath, "*.docx").OrderBy(f => f);
var latestVersion = versions.LastOrDefault();
if (latestVersion != null)
{
var comparisonPath = Path.Combine(repositoryPath, $"changes_{DateTime.Now:yyyyMMdd}.docx");
using (var comparer = new Comparer(latestVersion))
{
comparer.Add(documentPath);
comparer.Compare(comparisonPath);
}
// Archive the comparison for future reference
ArchiveComparison(comparisonPath);
}
}
private void ArchiveComparison(string comparisonPath)
{
// Implementation for archiving comparison results
var archivePath = Path.Combine(Path.GetDirectoryName(comparisonPath), "archive", Path.GetFileName(comparisonPath));
Directory.CreateDirectory(Path.GetDirectoryName(archivePath));
File.Move(comparisonPath, archivePath);
}
}
دليل استكشاف الأخطاء وإصلاحها
المشكلة 1: “تنسيق الملف غير مدعوم”
الحل: تحقق من امتداد الملف مقابل القائمة المدعومة (أكثر من 50 تنسيقًا) وحوّل الأنواع غير المدعومة إلى PDF أولاً.
private static readonly HashSet<string> SupportedFormats = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
{
".docx", ".doc", ".pdf", ".xlsx", ".xls", ".pptx", ".ppt", ".txt", ".rtf"
};
public static bool IsFormatSupported(string filePath)
{
var extension = Path.GetExtension(filePath);
return SupportedFormats.Contains(extension);
}
المشكلة 2: مشاكل الذاكرة مع الملفات الكبيرة
الحل: فعّل التدفق وعالج الملفات على أجزاء.
public static void CompareLargeDocuments(string sourcePath, string targetPath, string outputPath)
{
var fileInfo = new FileInfo(sourcePath);
if (fileInfo.Length > 50 * 1024 * 1024) // 50MB threshold
{
// Use streaming approach
using (var sourceStream = File.OpenRead(sourcePath))
using (var targetStream = File.OpenRead(targetPath))
using (var outputStream = File.Create(outputPath))
using (var comparer = new Comparer(sourceStream))
{
comparer.Add(targetStream);
comparer.Compare(outputStream);
}
}
else
{
// Standard approach for smaller files
using (var comparer = new Comparer(sourcePath))
{
comparer.Add(targetPath);
comparer.Compare(outputPath);
}
}
}
المشكلة 3: نتيجة مقارنة فارغة
الحل: زيادة الحساسية عن طريق تبديل DetectFormattingChanges أو DetectStyleChanges.
var compareOptions = new CompareOptions
{
DetectStyleChanges = true,
DiagramMasterSetting = new DiagramMasterSetting
{
UseSourceMaster = true,
CloneSourceMaster = true
},
OriginalSize = new Size(600, 800),
HeaderFootersComparison = true,
PaperSize = PaperSize.A4
};
الأسئلة المتكررة
س: كم عدد المستندات التي يمكنني مقارنتها في آن واحد؟
ج: يمكنك إضافة مستندات هدف متعددة إلى كائن Comparer واحد باستخدام استدعاءات Add() المتكررة، لكن يُنصح بمعالجةها بشكل متسلسل للدفعات الكبيرة.
س: هل يمكن لـ GroupDocs.Comparison التعامل مع الملفات المحمية بكلمة مرور؟
ج: نعم—مرّر كلمة المرور عند إنشاء كائن Comparer أو تحميل المستند.
using (var comparer = new Comparer(sourcePath, new LoadOptions("password")))
{
comparer.Add(targetPath, new LoadOptions("targetPassword"));
comparer.Compare(outputPath);
}
س: ما هي صيغ الملفات التي يدعمها GroupDocs.Comparison؟
ج: أكثر من 50 صيغة، بما في ذلك DOCX و XLSX و PPTX و PDF و JPEG و PNG و TXT وغيرها.
س: كيف يمكنني تخصيص مظهر التغييرات؟
ج: استخدم ComparisonSettings لتعيين InsertedColor و DeletedColor و StyleChangeColor.
var compareOptions = new CompareOptions
{
InsertedItemStyle = new StyleSettings
{
HighlightColor = Color.Green,
FontColor = Color.DarkGreen
},
DeletedItemStyle = new StyleSettings
{
HighlightColor = Color.Red,
FontColor = Color.DarkRed
}
};
س: هل يمكن تجاهل أنواع تغييرات محددة؟
ج: بالطبع—عطّل خيارات مثل DetectStyleChanges أو DetectTableChanges في ComparisonSettings.
var compareOptions = new CompareOptions
{
DetectStyleChanges = false, // Ignore formatting changes
HeaderFootersComparison = false, // Skip headers/footers
WordsSeparatorChars = new[] { ' ', '\n', '\r', '\t' } // Define word boundaries
};
س: هل يمكنني مقارنة المستندات المخزنة في التخزين السحابي؟
ج: نعم—قم بتنزيل التدفقات محليًا أو قارن مباشرةً من MemoryStream.
using (var sourceStream = await DownloadFromCloudAsync(sourceUrl))
using (var targetStream = await DownloadFromCloudAsync(targetUrl))
using (var comparer = new Comparer(sourceStream))
{
comparer.Add(targetStream);
comparer.Compare(outputStream);
}
س: كيف أشغّل GroupDocs.Comparison داخل حاوية Docker؟
ج: قم بتضمين الاعتمادات الأصلية اللازمة في ملف Dockerfile وانسخ ملف الترخيص إلى داخل الحاوية.
FROM mcr.microsoft.com/dotnet/aspnet:6.0
# Install necessary fonts and libraries for document processing
RUN apt-get update && apt-get install -y libfontconfig1 libfreetype6
س: ما الترخيص المطلوب للإنتاج؟
ج: ترخيص تجاري لـ GroupDocs.Comparison إلزامي لعمليات النشر في بيئة الإنتاج. تشمل الخيارات تراخيص المطور، الموقع، وOEM.
س: كيف يجب أن أتعامل مع فشل المقارنة بشكل سلس؟
ج: غلف استدعاء المقارنة بكتلة try‑catch، سجّل الاستثناء، وأعد رسالة خطأ صديقة للمستخدم.
public async Task<ComparisonResult> CompareDocumentsWithRetry(string source, string target, int maxRetries = 3)
{
for (int attempt = 1; attempt <= maxRetries; attempt++)
{
try
{
using (var comparer = new Comparer(source))
{
comparer.Add(target);
var outputPath = GenerateOutputPath();
comparer.Compare(outputPath);
return new ComparisonResult { Success = true, OutputPath = outputPath };
}
}
catch (Exception ex) when (attempt < maxRetries)
{
_logger.LogWarning($"Comparison attempt {attempt} failed: {ex.Message}. Retrying...");
await Task.Delay(TimeSpan.FromSeconds(attempt * 2)); // Exponential backoff
}
catch (Exception ex)
{
_logger.LogError(ex, $"Comparison failed after {maxRetries} attempts");
return new ComparisonResult { Success = false, Error = ex.Message };
}
}
return new ComparisonResult { Success = false, Error = "Max retries exceeded" };
}
الموارد والوثائق الأساسية
- الوثائق الكاملة: GroupDocs Comparison .NET Docs
- دليل مرجع API: GroupDocs API Reference for .NET
- منتدى دعم المجتمع: GroupDocs Forum
- تنزيلات الإصدارات الأخيرة: Releases Page
- تحميل نسخة تجريبية مجانية: Try Free Version
- طلب ترخيص مؤقت: Apply for Temporary License
- شراء ترخيص كامل: Buy GroupDocs License
- الإصدارات: Releases
- صفحة الترخيص المؤقت: Temporary License Page
- صفحة الشراء: Purchase Page
آخر تحديث: 2026-06-10
تم الاختبار مع: GroupDocs.Comparison 25.4.0 for .NET
المؤلف: GroupDocs
Install-Package GroupDocs.Comparison -Version 25.4.0
dotnet add package GroupDocs.Comparison --version 25.4.0
using GroupDocs.Comparison;