مقارنة ملفات PDF باستخدام Java – دليل GroupDocs.Comparison API
في هذا الدليل ستتعلم كيفية java compare pdf files بكفاءة باستخدام GroupDocs.Comparison للـ Java. سواءً كنت تبني بوابة مراجعة عقود، أو نظام تحكم بالإصدارات، أو أداة فحص أوراق أكاديمية، فإن القدرة على اكتشاف أصغر تغيير عبر مستندات PDF أمر أساسي. سنستعرض الإعداد، منطق المقارنة الأساسي، إنشاء المعاينات، التعامل مع كلمات المرور، التكامل السحابي، وأفضل الممارسات المحسّنة للأداء—حتى تتمكن من نشر حل موثوق خلال دقائق.
إجابات سريعة
- ما الذي يفعله GroupDocs Comparison Java؟ يقوم بمقارنة مستندين أو أكثر، يبرز كل تغيير، ويمكنه إنشاء معاينات بصرية للمراجعة السريعة.
- ما هي صيغ الملفات المدعومة؟ Word، PDF، Excel، PowerPoint، الصور، HTML، والعديد غيرها.
- هل أحتاج إلى ترخيص للإنتاج؟ نعم – ترخيص GroupDocs صالح يزيل العلامات المائية ويفتح مجموعة الميزات الكاملة.
- هل يمكنني معالجة مستندات كبيرة؟ نعم – مع إدارة الذاكرة المناسبة وتجزئة المعاينات يمكنك معالجة ملفات PDF مئات الصفحات.
- أين يمكنني العثور على أحدث تبعية Maven؟ في مستودع GroupDocs – تحقق من أحدث نسخة قبل إضافتها.
ما هو java compare pdf files؟
java compare pdf files يشير إلى العملية البرمجية لتحميل نسختين من PDF، اكتشاف الاختلافات النصية، التنسيقية، والرسومية، وإنتاج مستند نتيجة يوضح بصريًا تلك التغييرات (اختياريًا). تقوم GroupDocs.Comparison بتنفيذ ذلك عبر استدعاء API واحد، مما يلغي الحاجة إلى منطق مقارنة يدوي.
لماذا تستخدم GroupDocs.Comparison في مشاريع Java؟
توفر GroupDocs.Comparison اكتشاف تغييرات دقيق عبر أكثر من 50 صيغة مدعومة، تعالج ملفات PDF تصل إلى 200 صفحة في أقل من 5 ثوانٍ على JVM قياسي بسعة 8 GB، وتضم إنشاء معاينات مدمج. تجعل الحزم الجاهزة لـ Maven عملية التكامل سهلة، وتتمدد المكتبة أفقياً عندما تتبع أنماط إدارة الذاكرة الموصى بها.
المتطلبات المسبقة: ما تحتاجه للبدء
قبل الغوص في الشيفرة، تأكد من أن بيئتك تلبي هذه المتطلبات:
- Java Development Kit: JDK 8 أو أحدث؛ يُنصح بـ JDK 11 أو أحدث لأداء أفضل في جمع القمامة.
- أداة البناء: Maven أو Gradle لحل التبعيات.
- IDE: IntelliJ IDEA أو Eclipse أو VS Code – أي بيئة تطوير Java حديثة تعمل.
- معرفة أساسية بـ Java: يجب أن تكون مرتاحًا مع الفئات، الأساليب، وملفات الإدخال/الإخراج.
- الوصول إلى الشبكة: لتنزيل حزمة Maven الخاصة بـ GroupDocs، وإذا كنت تستخدم تخزين سحابي، الوصول إلى نقطة نهاية التخزين الخاصة بك.
إضافة GroupDocs.Comparison إلى مشروعك
أضف التبعية التالية إلى ملف pom.xml (استبدل X.Y.Z بأحدث نسخة تجدها على موقع GroupDocs):
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-comparison</artifactId>
<version>X.Y.Z</version>
</dependency>
نصيحة احترافية: تحقق من ملاحظات إصدار GroupDocs لإصلاحات الأخطاء الخاصة بالإصدار ودعم الصيغ الجديدة قبل الترقية.
الترخيص (لا تتخطاه!)
يسمح لك الترخيص التجريبي بتقييم الـ API، لكن عمليات النشر في الإنتاج تتطلب ترخيصًا دائمًا لإزالة العلامات المائية وتمكين جميع الوظائف.
- تجربة مجانية: تحميل من GroupDocs
- ترخيص مؤقت: احصل على ترخيص مؤقت للاختبار الموسع
- ترخيص كامل: شراء من متجر GroupDocs
الإعداد الأولي: تجهيز GroupDocs.Comparison
التهيئة الأساسية
فئة Comparer هي نقطة الدخول لجميع عمليات المقارنة. تقوم بتنظيم تحميل المستند، حساب الفروقات، وتوليد النتيجة.
<repositories>
<repository>
<id>repository.groupdocs.com</id>
<name>GroupDocs Repository</name>
<url>https://releases.groupdocs.com/comparison/java/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-comparison</artifactId>
<version>25.2</version>
</dependency>
</dependencies>
ما يفعله المقتطف: ينشئ كائن Comparer، يطبق ترخيصًا (إذا كان لديك)، ويجهز المحرك لاستدعاءات المقارنة اللاحقة.
دليل التنفيذ خطوة بخطوة
الجزء 1: إعداد مقارنة المستندات
الخطوة 1: تهيئة الـ comparer الخاص بك
كائن Comparer هو المكوّن الأساسي الذي ينفّذ خوارزمية الفروقات. يحتفظ بالإعدادات مثل خيارات المقارنة ومعلومات الترخيص.
import com.groupdocs.comparison.Comparer;
import com.groupdocs.comparison.examples.SampleFiles;
// Initialize the comparer with a source document
Comparer comparer = new Comparer(SampleFiles.SOURCE_WORD);
لماذا هذا مهم: المستند المصدر الذي تقدمه يصبح الأساس؛ يتم قياس كل تغيير مقابل ذلك.
الخطوة 2: إضافة المستندات الهدف
يمكنك مقارنة المصدر مع ملف أو أكثر من الملفات الهدف. في سيناريو إدارة العقود، يكون المصدر هو الاتفاقية الأصلية والهدف هو النسخة المعدلة من فريق الشؤون القانونية.
// Initialize comparer with the source document
Comparer comparer = new Comparer(SampleFiles.SOURCE_WORD);
الجزء 2: إنشاء معاينات الصفحات
الخطوة 1: إعداد إنشاء تدفق الإخراج
نمط delegate للمعاينة يمنحك تحكمًا كاملاً في مكان تخزين صور المعاينة — القرص المحلي، حاوية سحابية، أو قاعدة بيانات.
// Add a target document for comparison
comparer.add(SampleFiles.TARGET1_WORD);
الخطوة 2: تكوين خيارات المعاينة
قم بإنشاء معاينات فقط للصفحات التي تحتاجها فعليًا؛ هذا يقلل من استهلاك المعالج بنسبة تصل إلى 60 % للملفات الكبيرة.
import com.groupdocs.comparison.common.delegates.Delegates;
import java.io.FileOutputStream;
import java.io.OutputStream;
Delegates.CreatePageStream createPageStream = new Delegates.CreatePageStream() {
@Override
public OutputStream invoke(int pageNumber) {
String pagePath = "YOUR_OUTPUT_DIRECTORY" + "/result-GetPagePreviewsForTargetDocument_" + pageNumber + ".png";
try {
return new FileOutputStream(pagePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
};
الخطوة 3: إنشاء المعاينات
يقوم الـ API برسم كل صفحة مطلوبة كملف PNG (بدون فقدان) أو JPEG (حجم أصغر). يُنصح باستخدام PNG للمستندات القانونية حيث الدقة المثالية مهمة.
import com.groupdocs.comparison.options.PreviewOptions;
import com.groupdocs.comparison.options.enums.PreviewFormats;
// Set preview options
PreviewOptions previewOptions = new PreviewOptions.Builder(createPageStream)
.setPreviewFormat(PreviewFormats.PNG) // High-quality images
.setPageNumbers(new int[]{1, 2}) // Only generate what you need
.build();
صيغ الملفات المدعومة
تعمل GroupDocs.Comparison مع أكثر من 50 صيغة إدخال وإخراج، بما في ذلك:
- Microsoft Office: DOCX، DOC، XLSX، XLS، PPTX، PPT
- PDF: جميع إصدارات PDF‑1.x، ملفات PDF المشفرة، وملفات PDF ذات الخطوط المدمجة
- نص وتنسيق: TXT، RTF، HTML، MHTML
- صور: JPEG، PNG، BMP، GIF
- OpenDocument: ODT، ODS، ODP
تتيح لك هذه القدرات الواسعة مقارنة عقد مخزن كملف Word مع نسخة PDF ممسوحة ضوئيًا، كل ذلك ضمن استدعاء API واحد.
المشكلات الشائعة والحلول
المشكلة 1: FileNotFoundException أثناء إنشاء المعاينة
إذا لم يكن دليل الإخراج موجودًا أو كان التطبيق يفتقر إلى أذونات الكتابة، فإن delegate المعاينة يطرح هذا الاستثناء.
// Generate page previews
comparer.getTargets().get(0).generatePreview(previewOptions);
الحل: تحقق من المسار، أنشئ المجلدات المفقودة برمجيًا، ومنح عملية Java الحقوق المناسبة على نظام الملفات.
المشكلة 2: مشاكل الذاكرة مع المستندات الكبيرة
معالجة PDF مكون من 300 صفحة قد تتجاوز السعة الافتراضية للـ heap البالغة 512 MB، مما يؤدي إلى OutOfMemoryError.
Delegates.CreatePageStream createPageStream = new Delegates.CreatePageStream() {
@Override
public OutputStream invoke(int pageNumber) {
String outputDir = "previews";
File directory = new File(outputDir);
if (!directory.exists()) {
directory.mkdirs(); // Create directory if it doesn't exist
}
String pagePath = outputDir + "/preview_page_" + pageNumber + ".png";
try {
return new FileOutputStream(pagePath);
} catch (FileNotFoundException e) {
System.err.println("Failed to create output file: " + pagePath);
throw new RuntimeException("Cannot create preview file", e);
}
}
};
الحل: زيادة سعة heap للـ JVM (-Xmx2g أو أعلى) ومعالجة المستند في نطاقات صفحات أصغر باستخدام ميزة تقسيم الصفحات في PreviewOptions.
المشكلة 3: مشاكل الترخيص
عند فقدان ملف الترخيص أو تشوهه، يضيف الـ API علامة مائية إلى كل مخرجات ويعطل بعض الخيارات المتقدمة.
// Process fewer pages at a time
PreviewOptions previewOptions = new PreviewOptions.Builder(createPageStream)
.setPreviewFormat(PreviewFormats.PNG)
.setPageNumbers(new int[]{1, 2, 3}) // Limit page range
.build();
// Always dispose of the comparer when done
try (Comparer comparer = new Comparer(sourceDocument)) {
comparer.add(targetDocument);
comparer.getTargets().get(0).generatePreview(previewOptions);
} // Automatic cleanup
الحل: ضع ملف الترخيص في موقع معروف وحمّله باستخدام License.setLicense("path/to/license.lic") قبل أي استدعاء للمقارنة.
نصائح الأداء وأفضل الممارسات (java comparison best practices)
- قصر إنشاء المعاينات – اطلب فقط الصفحات التي تحتاجها؛ استخدم
pageNumbersلتخطي الأقسام غير ذات الصلة. - اختر صيغة الصورة المناسبة – PNG للمستندات القانونية بدون فقدان، JPEG للصور المصغرة حيث الحجم مهم.
- تنفيذ التخزين المؤقت – احفظ نتائج المقارنة (مثل تجزئة source + target) لتجنب إعادة معالجة الملفات غير المتغيرة.
- إدارة الذاكرة – غلف استخدام
Comparerفي كتلة try‑with‑resources واستدعِclose()عند الانتهاء. - تخلص من كائنات comparer – حرّر دائمًا الموارد الأصلية للحفاظ على بصمة JVM منخفضة.
نمط الكود الجاهز للإنتاج
فيما يلي دورة الحياة الموصى بها لمهمة مقارنة في خدمة مصغرة.
// Apply license at the start of your application
License license = new License();
license.setLicense("path/to/your/license.lic");
أمثلة تنفيذية من العالم الحقيقي
المثال 1: نظام إدارة العقود
يقوم قسم الشؤون القانونية بتحميل العقد الأصلي (المصدر) والنسخة المعدلة (الهدف). تُعيد الخدمة ملف PDF مميز ومجموعة من صور PNG للمعاينات الصفحية لتفتيش بصري سريع.
public class DocumentComparisonService {
private static final String OUTPUT_DIR = "document-previews/";
public ComparisonResult compareDocuments(String sourcePath, String targetPath) {
try (Comparer comparer = new Comparer(sourcePath)) {
comparer.add(targetPath);
// Perform comparison
String resultPath = OUTPUT_DIR + "comparison-result.docx";
comparer.compare(resultPath);
// Generate previews if needed
generatePreviews(comparer, 3); // First 3 pages only
return new ComparisonResult(resultPath, true);
} catch (Exception e) {
log.error("Document comparison failed", e);
return new ComparisonResult(null, false);
}
}
private void generatePreviews(Comparer comparer, int maxPages) {
// Implementation details...
}
}
المثال 2: مراجعة ورقة أكاديمية
يقوم الباحثون بإرسال مسودات معدلة. يقارن النظام PDF الجديد مع النسخة السابقة، يحدد الاقتباسات المعدلة، وينتج صور معاينة للوحة مراجعة المراجع.
public class ContractVersionManager {
public void reviewContractChanges(String originalContract, String revisedContract) {
try (Comparer comparer = new Comparer(originalContract)) {
comparer.add(revisedContract);
// Generate comparison document
String comparisonResult = "contracts/comparison-" + System.currentTimeMillis() + ".docx";
comparer.compare(comparisonResult);
// Create preview for stakeholder review
generatePreviewsForReview(comparer);
}
}
}
كيفية مقارنة ملفات PDF باستخدام Java مع حماية كلمة المرور
LoadOptions هي فئة تتيح لك تحديد معلمات التحميل مثل كلمات المرور للوثائق المشفرة. لمقارنة PDF محمي، أنشئ كائن LoadOptions مع كلمة المرور، مرره إلى Comparer عند تحميل المستند، ثم نفّذ المقارنة كالمعتاد. تقوم المكتبة بفك تشفير الملف في الذاكرة، مما يضمن عدم كتابة النص الصريح إلى القرص، وتعمل جميع العمليات اللاحقة — بما في ذلك إنشاء المعاينات وحساب الفروقات — بشكل شفاف.
public class AcademicDocumentReview {
public void compareResearchDrafts(String draft1, String draft2) {
try (Comparer comparer = new Comparer(draft1)) {
comparer.add(draft2);
// Focus on specific sections (first 10 pages typically contain main content)
PreviewOptions options = new PreviewOptions.Builder(createPageStream)
.setPageNumbers(IntStream.rangeClosed(1, 10).toArray())
.setPreviewFormat(PreviewFormats.PNG)
.build();
comparer.getTargets().get(0).generatePreview(options);
}
}
}
مقارنة المستندات المخزنة في السحابة
إذا كان المصدر والهدف موجودين في Amazon S3 أو Azure Blob أو Google Cloud Storage، قدم ببساطة InputStream تم الحصول عليه من SDK السحابي بدلًا من مسار ملف محلي.
LoadOptions loadOptions = new LoadOptions();
loadOptions.setPassword("your-password");
Comparer comparer = new Comparer("protected-document.docx", loadOptions);
الأسئلة المتكررة
س: كيف أتعامل مع المستندات المحمية بكلمة مرور؟
ج: استخدم LoadOptions لتزويد كلمة المرور عند إنشاء كائن Comparer، كما هو موضح أعلاه.
س: هل يمكنني مقارنة المستندات المخزنة في التخزين السحابي؟
ج: نعم — قدم تدفقات الإدخال من موفر السحابة إلى Comparer.
س: ما هو الحد الأقصى لحجم الملف الذي يمكن لـ GroupDocs.Comparison التعامل معه؟
ج: لا يوجد حد ثابت، لكن للملفات التي تتجاوز 100 MB يجب زيادة حجم heap للـ JVM أو معالجة المستند في أجزاء أصغر لتجنب OutOfMemoryError.
س: ما مدى دقة خوارزمية المقارنة؟
ج: تستخدم المكتبة خوارزميات diff متقدمة تكتشف التغييرات في النص، التنسيق، الصور، الجداول، والكائنات المدمجة، وتقدم نتائج diff بصرية شبه مثالية على مستوى البكسل.
س: هل يمكنني تخصيص أنواع التغييرات التي يتم اكتشافها؟
ج: بالتأكيد. اضبط CompareOptions لتمكين أو تعطيل اكتشاف النص، التنسيق، الصور، الجداول، وأكثر.
س: هل يدعم الـ API إنشاء معاينات لصفحات مختارة فقط؟
ج: نعم — اضبط PreviewOptions بمصفوفة pageNumbers محددة لتقليل الإخراج إلى الصفحات التي تحتاجها.
الخلاصة
أصبح لديك الآن دليل كامل وجاهز للإنتاج حول java compare pdf files باستخدام GroupDocs.Comparison. باتباع خطوات الإعداد، وتطبيق توصيات الأداء، والاستفادة من مقتطفات التعامل مع كلمات المرور وتكامل السحابة، يمكنك دمج قدرات مقارنة المستندات القوية في أي تطبيق Java — سواء كان بوابة مراجعة عقود، أو سير عمل ورقة أكاديمية، أو نظام أرشفة مستندات على نطاق واسع.
آخر تحديث: 2026-11-01
تم الاختبار مع: GroupDocs.Comparison 25.2
المؤلف: GroupDocs
InputStream sourceStream = getDocumentFromCloud("source-doc-id");
InputStream targetStream = getDocumentFromCloud("target-doc-id");
Comparer comparer = new Comparer(sourceStream);
comparer.add(targetStream);