GroupDocs का उपयोग कैसे करें: जावा दस्तावेज़ तुलना स्ट्रीम – पूर्ण गाइड
जब आपको अनुबंधों, कानूनी ब्रीफ़्स, या किसी भी संस्करण‑नियंत्रित पाठ की तुलना करने के लिए GroupDocs का उपयोग कैसे करें की आवश्यकता हो, तो सबसे भरोसेमंद समाधान GroupDocs.Comparison for Java है। यह आपको कई दस्तावेज़ों की तुलना एक ही रन में करने देता है जबकि उन्हें सीधे InputStream ऑब्जेक्ट्स से प्रोसेस करता है, जिससे हीप उपयोग में काफी कमी आती है। इस ट्यूटोरियल में आप जानेंगे कि स्ट्रीम‑आधारित तुलना कब सही विकल्प है, सामान्य समस्याओं से कैसे बचें, और सर्वोत्तम‑प्रैक्टिस पैटर्न जो आपके इम्प्लीमेंटेशन को प्रोडक्शन‑रेडी बनाते हैं।
त्वरित उत्तर
- स्ट्रीम‑आधारित तुलना का मुख्य लाभ क्या है? यह दस्तावेज़ों को सीधे स्ट्रीम से प्रोसेस करता है, जिससे 100‑पृष्ठ फ़ाइलों के लिए भी मेमोरी उपयोग 50 MB से कम रहता है।
- क्या मैं एक साथ दो से अधिक दस्तावेज़ों की तुलना कर सकता हूँ? हाँ—GroupDocs आपको एक कॉल में अनिश्चित संख्या में लक्ष्य दस्तावेज़ों की तुलना करने देता है।
- क्या बड़े फ़ाइलों के लिए मुझे पेड लाइसेंस चाहिए? मूल्यांकन के लिए एक फ्री ट्रायल लाइसेंस काम करता है; पूर्ण लाइसेंस आकार सीमाओं को हटाता है और बैच प्रोसेसिंग सक्षम करता है।
- कौन सा जावा संस्करण अनुशंसित है? Java 11+ सबसे बेहतर प्रदर्शन और दीर्घकालिक समर्थन प्रदान करता है।
- क्या यह दृष्टिकोण वेब एप्लिकेशन के लिए उपयुक्त है? बिल्कुल—स्ट्रीम हैंडलिंग अपलोड‑एंड‑कम्पेयर API के साथ पूरी तरह फिट बैठती है।
जावा दस्तावेज़ तुलना स्ट्रीम के लिए GroupDocs का उपयोग क्या है?
InputStream ऑब्जेक्ट्स से सीधे अपने दस्तावेज़ लोड करें और GroupDocs.Comparison को डिफ़ करने दें बिना पूरी फ़ाइल को मेमोरी में लोड किए। यह तकनीक बड़े Word, PDF, या Excel फ़ाइलों और उन बैच जॉब्स के लिए आदर्श है जिन्हें एक ही निष्पादन में दर्जनों फ़ाइलों की तुलना करनी होती है।
स्ट्रीम‑आधारित दस्तावेज़ तुलना का उपयोग क्यों करें?
दस्तावेज़ों को स्ट्रीम के रूप में प्रोसेस करने से फ़ाइल‑लोडिंग तरीकों की तुलना में हीप दबाव में 80 % तक कमी आती है, 200 MB से बड़ी फ़ाइलों को संभालना संभव होता है, और स्टार्ट‑अप लेटेंसी में 30 % सुधार होता है। GroupDocs.Comparison 50+ इनपुट और आउटपुट फ़ॉर्मेट का समर्थन करता है—जैसे DOCX, PDF, XLSX, PPTX, और प्लेन टेक्स्ट—जिससे आप एक ही API कॉल में लगभग किसी भी ऑफिस दस्तावेज़ की तुलना कर सकते हैं।
स्ट्रीम‑आधारित दस्तावेज़ तुलना कब उपयोग करें
स्ट्रीम‑आधारित तुलना तब आदर्श है जब आप बड़े फ़ाइलों से निपटते हैं, बैच जॉब्स चलाने की आवश्यकता होती है, या वेब API के माध्यम से दस्तावेज़ सर्व करते हैं। यह हीप उपयोग को कम रखता है, लेटेंसी घटाता है, और ऐसी फ़ाइलों को प्रोसेस करने देता है जो सामान्य मेमोरी सीमाओं से अधिक हैं, जिससे यह एंटरप्राइज़‑स्तर के दस्तावेज़ वर्कफ़्लो और क्लाउड‑नेटिव सेवाओं के लिए उपयुक्त बनता है।
इन परिस्थितियों के लिए उपयुक्त
- बड़ी दस्तावेज़ प्रोसेसिंग – फ़ाइलें ≥ 50 MB जहाँ हीप उपयोग महत्वपूर्ण है।
- बैच ऑपरेशन्स – रात्री कार्य में दर्जनों या सैकड़ों फ़ाइलों की तुलना।
- वेब एप्लिकेशन – उपयोगकर्ता फ़ाइलें अपलोड करते हैं; स्ट्रीम सर्वर मेमोरी को हल्का रखती हैं।
- स्वचालित वर्कफ़्लो – DMS, CI/CD पाइपलाइन, या माइक्रो‑सर्विसेज़ के साथ एकीकरण।
इन स्थितियों में स्ट्रीम को छोड़ें
- फ़ाइलें बहुत छोटी हैं (10 MB से कम) और सरलता प्रदर्शन से अधिक महत्वपूर्ण है।
- तुलना से पहले आपको एक ही सामग्री को कई बार पढ़ना पड़ता है (जैसे, पहले टेक्स्ट निकालना)।
- आपके पर्यावरण में पर्याप्त मेमोरी है और अतिरिक्त कोड जटिलता उचित नहीं है।
पूर्वापेक्षाएँ और सेटअप
आपको क्या चाहिए
- Java Development Kit (JDK) – संस्करण 8 या उससे ऊपर (Java 11+ अनुशंसित)।
- Maven – डिपेंडेंसी प्रबंधन के लिए (या यदि आप चाहें तो Gradle)।
- Basic Java knowledge – try‑with‑resources, streams, और exception handling।
- Sample documents – परीक्षण के लिए कुछ Word, PDF, या Excel फ़ाइलें।
GroupDocs.Comparison को जावा के लिए सेटअप करना
pom.xml में GroupDocs.Comparison Maven डिपेंडेंसी जोड़ें:
<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>
अपना लाइसेंस प्राप्त करना
आप मूल्यांकन के लिए फ्री ट्रायल लाइसेंस से शुरू कर सकते हैं। प्रोडक्शन के लिए, विकास के दौरान टेम्पररी लाइसेंस प्राप्त करें या फ़ाइल‑साइज़ प्रतिबंध हटाने और प्रायोरिटी सपोर्ट सक्षम करने के लिए पूर्ण लाइसेंस खरीदें।
चरण‑दर‑चरण कार्यान्वयन गाइड
स्ट्रीम दृष्टिकोण को समझना
स्ट्रीम का उपयोग जावा को बताता है: “सिर्फ आवश्यक बाइट्स पढ़ें, जब जरूरत हो।” यह पूरे दस्तावेज़ को मेमोरी में लोड करने से बचाता है, जो java compare large files परिदृश्यों के लिए महत्वपूर्ण है।
चरण 1: स्रोत दस्तावेज़ के साथ अपने comparer को प्रारंभ करें
Comparer वह कोर क्लास है जो डिफ़ ऑपरेशन को व्यवस्थित करता है। यह स्रोत दस्तावेज़ के लिए एक InputStream स्वीकार करता है और सभी लक्ष्य स्ट्रीम्स को प्रबंधित करता है।
import com.groupdocs.comparison.Comparer;
import java.io.FileInputStream;
import java.io.InputStream;
try (InputStream sourceStream = new FileInputStream("YOUR_DOCUMENT_DIRECTORY/SOURCE_WORD")) {
try (Comparer comparer = new Comparer(sourceStream)) {
// Your comparer is now ready to accept target documents
// The try-with-resources ensures proper cleanup
}
}
यह पैटर्न क्यों काम करता है – try‑with‑resources ब्लॉक स्वचालित रूप से स्ट्रीम्स को बंद कर देता है, लीक को रोकता है, और Comparer इंस्टेंस हल्का रहता है क्योंकि यह कभी भी पूरी फ़ाइल को RAM में नहीं रखता।
चरण 2: कई लक्ष्य दस्तावेज़ जोड़ें
add प्रत्येक लक्ष्य InputStream को रजिस्टर करता है। आप जितनी चाहें जोड़ सकते हैं जितना आपका JVM संभाल सके; व्यवहार में, अधिकांश सर्वरों के लिए प्रति बैच 10–15 दस्तावेज़ एक उपयुक्त संख्या है।
try (InputStream target1Stream = new FileInputStream("YOUR_DOCUMENT_DIRECTORY/TARGET1_WORD"),
InputStream target2Stream = new FileInputStream("YOUR_DOCUMENT_DIRECTORY/TARGET2_WORD"),
InputStream target3Stream = new FileInputStream("YOUR_DOCUMENT_DIRECTORY/TARGET3_WORD")) {
comparer.add(target1Stream, target2Stream, target3Stream);
}
प्रो टिप – प्रत्येक add कॉल को अपने स्वयं के try‑catch ब्लॉक में रखें ताकि एक दूषित फ़ाइल पूरी बैच को रोक न सके।
चरण 3: तुलना निष्पादित करें और परिणाम उत्पन्न करें
compare() सभी रजिस्टर्ड लक्ष्यों के विरुद्ध डिफ़ चलाता है और परिणाम को आउटपुट स्ट्रीम में लिखता है, जिससे मेमोरी उपयोग कम रहता है।
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.nio.file.Path;
try (OutputStream resultStream = new FileOutputStream("YOUR_OUTPUT_DIRECTORY/CompareMultipleDocumentsResult")) {
final Path resultPath = comparer.compare(resultStream);
System.out.println("Comparison complete! Results saved to: " + resultPath);
}
यहाँ क्या होता है – यह मेथड एक Path ऑब्जेक्ट लौटाता है जो जेनरेटेड तुलना फ़ाइल की ओर इशारा करता है, जिसे आप सीधे क्लाइंट को सर्व कर सकते हैं या बाद में समीक्षा के लिए स्टोर कर सकते हैं।
पूर्ण कार्यशील उदाहरण
निम्नलिखित क्लास सभी चरणों को एक प्रोडक्शन‑रेडी स्निपेट में जोड़ता है:
import com.groupdocs.comparison.Comparer;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Path;
public class DocumentComparisonExample {
public static void compareMultipleDocuments() {
try (InputStream sourceStream = new FileInputStream("YOUR_DOCUMENT_DIRECTORY/SOURCE_WORD")) {
try (Comparer comparer = new Comparer(sourceStream)) {
// Add multiple target documents for comparison
try (InputStream target1Stream = new FileInputStream("YOUR_DOCUMENT_DIRECTORY/TARGET1_WORD"),
InputStream target2Stream = new FileInputStream("YOUR_DOCUMENT_DIRECTORY/TARGET2_WORD"),
InputStream target3Stream = new FileInputStream("YOUR_DOCUMENT_DIRECTORY/TARGET3_WORD")) {
comparer.add(target1Stream, target2Stream, target3Stream);
}
// Generate comparison results
try (OutputStream resultStream = new FileOutputStream("YOUR_OUTPUT_DIRECTORY/CompareMultipleDocumentsResult")) {
final Path resultPath = comparer.compare(resultStream);
System.out.println("Documents compared successfully! Check: " + resultPath);
}
}
} catch (Exception e) {
System.err.println("Error during document comparison: " + e.getMessage());
e.printStackTrace();
}
}
}
कई दस्तावेज़ जावा – सर्वोत्तम प्रथाएँ
BufferedInputStream एक रैपर है जो तेज़ I/O के लिए InputStream में बफ़रिंग जोड़ता है।
- बैच आकार – प्रत्येक तुलना बैच को 10‑15 फ़ाइलों तक सीमित रखें ताकि सामान्य हीप सीमाओं के भीतर रहें।
- स्ट्रीम बफ़रिंग – फ़ाइल स्ट्रीम्स को
BufferedInputStreamमें 8 KB–32 KB बफ़र के साथ रैप करें ताकि इष्टतम I/O थ्रूपुट मिले। - त्रुटि अलगाव – प्रत्येक लक्ष्य जोड़ने को अलग से संभालें ताकि बैच मजबूत रहे।
- लॉगिंग – प्रत्येक दस्तावेज़ जोड़ी के लिए शुरू/समाप्त टाइमस्टैम्प कैप्चर करें ताकि प्रदर्शन विश्लेषण में मदद मिले।
सामान्य समस्याएँ और समाधान
समस्या 1: बड़े दस्तावेज़ों के साथ OutOfMemoryError
लक्षण – एप्लिकेशन हीप‑स्पेस त्रुटियों के साथ क्रैश हो जाता है।
समाधान – JVM हीप बढ़ाएँ (-Xmx2g या अधिक) और दस्तावेज़ों को छोटे बैच में प्रोसेस करें:
java -Xmx2g -XX:+UseG1GC YourApplication
समस्या 2: फ़ाइल पहुँच अनुमतियाँ
लक्षण – FileNotFoundException या एक्सेस‑डिनाइड त्रुटियाँ।
समाधान – सुनिश्चित करें कि चलाने वाला उपयोगकर्ता स्रोत डायरेक्टरी पर पढ़ने के अधिकार रखता है:
File sourceFile = new File("YOUR_DOCUMENT_DIRECTORY/SOURCE_WORD");
if (!sourceFile.canRead()) {
throw new IllegalStateException("Cannot read source file: " + sourceFile.getAbsolutePath());
}
समस्या 3: दूषित या असमर्थित दस्तावेज़ स्वरूप
लक्षण – फ़ॉर्मेट‑संबंधी अपवादों के साथ तुलना विफल होती है।
समाधान – स्ट्रीम खोलने से पहले फ़ाइल एक्सटेंशन और MIME टाइप्स को वैलिडेट करें:
// Always validate files before processing
private boolean isValidDocument(String filePath) {
try {
// Add format validation logic here
return new File(filePath).length() > 0;
} catch (Exception e) {
return false;
}
}
उत्पादन उपयोग के लिए प्रदर्शन टिप्स
मेमोरी प्रबंधन
BufferedInputStreamका उपयोग करें – थ्रूपुट में 25 % तक सुधार करता है।- बफ़र आकार 16 KB सेट करें – अधिकांश वर्कलोड के लिए मेमोरी उपयोग और गति को संतुलित करता है।
- मेमोरी मॉनिटर करें – VisualVM या Java Flight Recorder जैसे टूल लीक को जल्दी पहचानने में मदद करते हैं।
// More efficient file handling for large documents
try (BufferedInputStream sourceStream = new BufferedInputStream(
new FileInputStream("source.docx"), 16384)) { // 16KB buffer
// Your comparison logic here
}
इष्टतम फ़ाइल हैंडलिंग
// Example of using a larger buffer for very big files
try (BufferedInputStream sourceStream = new BufferedInputStream(
new FileInputStream("large-document.docx"), 32768)) { // 32KB buffer
// Process with increased buffer size
}
समवर्ती प्रसंस्करण
ExecutorService जावा की कन्करेंसी यूटिलिटी है जो थ्रेड्स के पूल को प्रबंधित करती है।ExecutorService का उपयोग करके स्वतंत्र तुलना बैच को समानांतर चलाएँ, जिससे मल्टी‑कोर सर्वरों पर रैखिक स्केलिंग प्राप्त हो:
ExecutorService executor = Executors.newFixedThreadPool(4);
// Process multiple comparison tasks in parallel
// Ensure thread‑safety of shared resources
उत्पादन उपयोग के लिए सर्वोत्तम प्रथाएँ
1. मजबूत त्रुटि प्रबंधन और लॉगिंग
व्यापक लॉगिंग लागू करें ताकि आप समस्याओं को जल्दी ट्रेस कर सकें:
import java.util.logging.Logger;
import java.util.logging.Level;
private static final Logger logger = Logger.getLogger(DocumentComparisonExample.class.getName());
public void safeDocumentComparison() {
try {
// Your comparison logic
logger.info("Document comparison completed successfully");
} catch (Exception e) {
logger.log(Level.SEVERE, "Document comparison failed", e);
// Optionally retry or alert administrators
}
}
2. कॉन्फ़िगरेशन प्रबंधन
पाथ को हार्ड‑कोड करने से बचें; पर्यावरण वेरिएबल्स या समर्पित कॉन्फ़िगरेशन फ़ाइल का उपयोग करें:
String sourceDir = System.getProperty("document.source.dir", "default/path");
String outputDir = System.getProperty("document.output.dir", "default/output");
3. मान्यकरण और सफ़ाई
स्ट्रीम खोलने से पहले हमेशा इनपुट पाथ्स को वैलिडेट करें ताकि पाथ‑ट्रैवर्सल अटैक से बचा जा सके:
private void validateDocumentPath(String path) {
if (path == null || path.trim().isEmpty()) {
throw new IllegalArgumentException("Document path cannot be null or empty");
}
File file = new File(path);
if (!file.exists() || !file.isFile()) {
throw new IllegalArgumentException("Invalid document path: " + path);
}
}
वास्तविक‑दुनिया उपयोग मामलों
कानूनी दस्तावेज़ समीक्षा
कानूनी फर्म विभिन्न पक्षों के अनुबंध संस्करणों की तुलना करती हैं, ड्राफ्ट्स में बदलावों को ट्रैक करती हैं, और टेम्प्लेट्स के विरुद्ध अंतिम दस्तावेज़ों की तुलना करके अनुपालन सुनिश्चित करती हैं।
सॉफ़्टवेयर दस्तावेज़ीकरण
डेवलपमेंट टीमें रिलीज़ के बीच API दस्तावेज़ों की तुलना करती हैं, कई योगदानकर्ताओं से तकनीकी स्पेसिफिकेशन की समीक्षा करती हैं, और दस्तावेज़ सेट को सुसंगत रखती हैं।
अनुपालन और ऑडिट
संगठन नियामक दस्तावेज़ों को सत्यापित करते हैं, नीति परिवर्तनों को ट्रैक करते हैं, और दस्तावेज़ संशोधनों के लिए ऑडिट ट्रेल बनाते हैं।
समस्या निवारण गाइड
प्रदर्शन समस्याएँ
- समस्या – तुलना बहुत समय लेती है।
- समाधान – बहुत बड़ी फ़ाइलों को सेक्शन में विभाजित करें, JVM हीप बढ़ाएँ, और तेज़ I/O के लिए SSD स्टोरेज सुनिश्चित करें।
मेमोरी समस्याएँ
- समस्या – एप्लिकेशन मेमोरी समाप्त हो जाता है।
- समाधान – हीप आकार बढ़ाएँ, दस्तावेज़ों को छोटे बैच में प्रोसेस करें, और बड़े स्ट्रीम बफ़र का उपयोग करें।
फ़ाइल पहुँच समस्याएँ
- समस्या – स्रोत या लक्ष्य फ़ाइलें पढ़ी नहीं जा रही हैं।
- समाधान – फ़ाइल अनुमतियों की जाँच करें, सुनिश्चित करें फ़ाइलें लॉक नहीं हैं, और रिलेटिव‑पाथ भ्रम से बचने के लिए एब्सोल्यूट पाथ्स का उपयोग करें।
अक्सर पूछे जाने वाले प्रश्न
प्रश्न: क्या मैं Word फ़ाइलों के अलावा अन्य दस्तावेज़ों की तुलना कर सकता हूँ?
उत्तर: बिल्कुल—GroupDocs.Comparison PDF, Excel, PowerPoint, और प्लेन‑टेक्स्ट फ़ाइलों का समर्थन करता है, और स्ट्रीम‑आधारित दृष्टिकोण सभी समर्थित फ़ॉर्मेट में लगातार काम करता है।
प्रश्न: एक साथ मैं अधिकतम कितने दस्तावेज़ों की तुलना कर सकता हूँ?
उत्तर: कोई कठोर सीमा नहीं है, लेकिन व्यावहारिक प्रतिबंध मेमोरी, CPU, और प्रोसेसिंग टाइम हैं। एक साथ 10‑15 दस्तावेज़ों की तुलना सामान्य है; बड़े बैच को टुकड़ों में विभाजित करना चाहिए।
प्रश्न: मैं तुलना त्रुटियों को कैसे सुगमता से संभालूँ?
उत्तर: लेयर्ड एक्सेप्शन हैंडलिंग का उपयोग करें ताकि एकल विफलता पूरी जॉब को न रोक पाए:
try {
// Comparison logic
} catch (SecurityException e) {
logger.warn("Access denied for file: " + fileName);
} catch (IOException e) {
logger.error("I/O error during comparison", e);
} catch (Exception e) {
logger.error("Unexpected error during comparison", e);
}
प्रश्न: क्या मैं आउटपुट में अंतर को हाइलाइट करने के तरीके को कस्टमाइज़ कर सकता हूँ?
उत्तर: हाँ—GroupDocs.Comparison इन्सर्टेड, डिलीटेड, और मोडिफाइड कंटेंट के लिए स्टाइलिंग विकल्प प्रदान करता है, जिसमें कस्टम रंग, फ़ॉन्ट, और मेटाडेटा शामिल हैं।
प्रश्न: क्या यह दृष्टिकोण रीयल‑टाइम दस्तावेज़ तुलना के लिए उपयुक्त है?
उत्तर: स्ट्रीम‑आधारित तुलना कम‑लेटेंसी परिदृश्यों के लिए आदर्श है क्योंकि इसका मेमोरी फुटप्रिंट कम है। वास्तविक लाइव कोलैबोरेटिव एडिटिंग के लिए, इसे कैशिंग और इन्क्रिमेंटल डिफ़ तकनीकों के साथ संयोजित करें।
प्रश्न: बहुत बड़े दस्तावेज़ (100 MB+) को कैसे संभालूँ?
उत्तर:
- JVM हीप बढ़ाएँ (
-Xmx4g)। - 32 KB स्ट्रीम बफ़र का उपयोग करें।
- दस्तावेज़ को लॉजिकल सेक्शन में विभाजित करने पर विचार करें।
- VisualVM या Java Flight Recorder के साथ मेमोरी उपयोग प्रोफ़ाइल करें।
निष्कर्ष
अब आपके पास GroupDocs का उपयोग कैसे करें के लिए जावा में स्ट्रीम का उपयोग करके दस्तावेज़ तुलना करने की एक पूर्ण, प्रोडक्शन‑रेडी रोडमैप है। यह विधि आपको बड़े फ़ाइलों को संभालने की दक्षता, बैच जॉब चलाने की स्केलेबिलिटी, और वेब सर्विसेज़ या CI पाइपलाइन में एकीकृत करने की लचीलापन प्रदान करती है।
मुख्य बिंदु
- स्ट्रीम‑आधारित तुलना मेमोरी उपयोग को कम रखती है और प्रोसेसिंग को तेज़ करती है।
- लीक से बचने के लिए try‑with‑resources और उचित बफ़रिंग का उपयोग करें।
- प्रोडक्शन स्थिरता के लिए मजबूत लॉगिंग, वैलिडेशन, और एरर हैंडलिंग लागू करें।
- अपने दस्तावेज़ आकार और वर्कलोड विशेषताओं के आधार पर प्रदर्शन को ट्यून करें।
अगले कदम
- तुलना परिणाम के लिए उन्नत स्टाइलिंग विकल्पों का अन्वेषण करें।
- एक REST एंडपॉइंट बनाएं जो अपलोडेड स्ट्रीम स्वीकार करे और डिफ़ फ़ाइल लौटाए।
- दस्तावेज़ स्थिरता लागू करने के लिए तुलना चरण को अपने CI/CD पाइपलाइन में एकीकृत करें।
- Java Flight Recorder या VisualVM का उपयोग करके प्रोफ़ाइल और ऑप्टिमाइज़ करें।
आज ही निर्माण शुरू करें: कोड सैंपल को अपने प्रोजेक्ट में अनुकूलित करें, वास्तविक दस्तावेज़ों के साथ परीक्षण करें, और दोहराएँ। महारत इन पैटर्न को आपके सामने आने वाली चुनौतियों पर लागू करने से आती है।
संबंधित संसाधन:
- GroupDocs.Comparison दस्तावेज़ीकरण
- API रेफ़रेंस
- नवीनतम संस्करण डाउनलोड करें
- सपोर्ट फ़ोरम
- खरीद विकल्प
- फ़्री ट्रायल
- टेम्पररी लाइसेंस
अंतिम अपडेट: 2026-08-19
परीक्षण किया गया: GroupDocs.Comparison 25.2
लेखक: GroupDocs