PDF हाइलाइट्स जावा बनाएं: PDF हाइलाइट करने की पूरी गाइड

परिचय

क्या आप कई दस्तावेज़ संस्करणों में फीडबैक प्रबंधन से जूझते रहे हैं? आप अकेले नहीं हैं। चाहे आप एक दस्तावेज़ प्रबंधन प्रणाली बना रहे हों, शैक्षिक प्लेटफ़ॉर्म बना रहे हों, या सहयोगी टूल विकसित कर रहे हों, create pdf highlights java को शून्य से लागू करना आश्चर्यजनक रूप से कठिन हो सकता है।

यहीं पर GroupDocs.Annotation for Java मदद के लिए आता है। यह शक्तिशाली लाइब्रेरी जटिल PDF एनोटेशन कार्यों को सरल ऑपरेशनों में बदल देती है, जिससे आप लो‑लेवल PDF मैनिपुलेशन से जूझे बिना हाइलाइट्स, कमेंट्स और रिप्लाईज़ जोड़ सकते हैं।

इस व्यापक ट्यूटोरियल में, आप वास्तविक दुनिया के उदाहरणों के साथ highlight pdf in java करना सीखेंगे। हम बेसिक सेटअप से लेकर एडवांस्ड हाइलाइटिंग तकनीकों तक सब कुछ कवर करेंगे, साथ ही प्रोडक्शन वातावरण में इसे लागू करने के दौरान मैंने जो व्यावहारिक टिप्स सीखी हैं, उन्हें साझा करेंगे।

आप बिल्कुल यह सीखेंगे:

  • अपने जावा प्रोजेक्ट में GroupDocs.Annotation को सेटअप करना (सही तरीके से)
  • कस्टम स्टाइलिंग के साथ इंटरैक्टिव PDF हाइलाइट्स बनाना
  • सहयोग के लिए थ्रेडेड रिप्लाईज़ और कमेंट्स जोड़ना
  • सामान्य समस्याओं और प्रदर्शन अनुकूलन को संभालना
  • वास्तविक दुनिया की इम्प्लीमेंटेशन रणनीतियाँ

अपने PDFs को इंटरैक्टिव, सहयोगी दस्तावेज़ों में बदलने के लिए तैयार हैं? चलिए शुरू करते हैं!

त्वरित उत्तर

  • जावा में PDF हाइलाइट्स को सरल बनाने वाली लाइब्रेरी कौन सी है? GroupDocs.Annotation for Java
  • कौन सी Maven डिपेंडेंसी लाइब्रेरी जोड़ती है? com.groupdocs:groupdocs-annotation:25.2
  • विकास के लिए लाइसेंस चाहिए? परीक्षण के लिए एक मुफ्त टेम्पररी लाइसेंस काम करता है; प्रोडक्शन के लिए पेड लाइसेंस आवश्यक है।
  • क्या हाइलाइट्स में कमेंट्स जोड़ सकते हैं? हाँ, आप रिप्लाईज़ और थ्रेडेड कमेंट्स अटैच कर सकते हैं।
  • बड़े PDFs के लिए मेमोरी कैसे मैनेज करें? try‑with‑resources का उपयोग करें और सेव करने के बाद dispose() कॉल करें।

क्यों चुनें GroupDocs.Annotation for Java PDF प्रोसेसिंग?

कोड में कूदने से पहले, चलिए बात करते हैं कि GroupDocs.Annotation जावा PDF लाइब्रेरीज़ के भीड़भाड़ वाले क्षेत्र में क्यों अलग खड़ा है।

DIY PDF एनोटेशन की समस्या: शून्य से PDF एनोटेशन बनाना मतलब जटिल PDF स्पेसिफिकेशन, कोऑर्डिनेट सिस्टम और रेंडरिंग इंजन से निपटना। मैंने देखा है कि डेवलपर्स कई हफ्ते बुनियादी हाइलाइट को विभिन्न PDF प्रकारों में लगातार काम करने में बिताते हैं।

GroupDocs.Annotation समाधान: यह लाइब्रेरी जटिलता को एब्स्ट्रैक्ट करती है जबकि आपको एनोटेशन की उपस्थिति और व्यवहार पर सूक्ष्म नियंत्रण देती है। यह ऐसे है जैसे आपकी टीम में एक सीनियर PDF विशेषज्ञ हो जिसने सभी एज केस पहले ही हल कर लिए हों।

आपको पसंद आने वाले मुख्य लाभ:

  • विभिन्न PDF प्रकारों और संरचनाओं के साथ काम करता है
  • कोऑर्डिनेट कैलकुलेशन को स्वचालित रूप से संभालता है
  • हाइलाइट्स से आगे कई एनोटेशन प्रकारों का समर्थन करता है
  • मौजूदा जावा एप्लिकेशन्स के साथ सहज इंटीग्रेशन
  • उत्कृष्ट दस्तावेज़ीकरण और समर्थन प्रदान करता है

पूर्वापेक्षाएँ और पर्यावरण सेटअप

आपको क्या चाहिए

डेवलपमेंट एनवायरनमेंट:

  • Java 8 या उससे ऊपर (बेहतर प्रदर्शन के लिए Java 11+ की सिफारिश)
  • डिपेंडेंसी मैनेजमेंट के लिए Maven या Gradle
  • आपका पसंदीदा IDE (IntelliJ IDEA, Eclipse, या VS Code बहुत अच्छे हैं)

ज्ञान आवश्यकताएँ:

  • बेसिक जावा प्रोग्रामिंग (कलेक्शन्स, ऑब्जेक्ट्स, फ़ाइल I/O)
  • Maven डिपेंडेंसीज़ की परिचितता
  • कोऑर्डिनेट सिस्टम की समझ (सहायक लेकिन अनिवार्य नहीं)

GroupDocs.Annotation for Java की इंस्टॉलेशन

शुरू करने का सबसे आसान तरीका Maven के माध्यम से है। अपने pom.xml फ़ाइल में निम्न कॉन्फ़िगरेशन जोड़ें:

<repositories>
    <repository>
        <id>repository.groupdocs.com</id>
        <name>GroupDocs Repository</name>
        <url>https://releases.groupdocs.com/annotation/java/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>com.groupdocs</groupId>
        <artifactId>groupdocs-annotation</artifactId>
        <version>25.2</version>
    </dependency>
</dependencies>

Pro Tip: हमेशा नवीनतम स्थिर संस्करण का उपयोग करें। GroupDocs नियमित रूप से प्रदर्शन सुधार और बग फिक्स के साथ अपडेट जारी करता है।

लाइसेंस सेटअप (इसे न छोड़ें!)

प्रोडक्शन में GroupDocs.Annotation उपयोग करने के लिए आपको लाइसेंस चाहिए। लाइसेंसिंग को इस प्रकार हैंडल करें:

विकास के लिए: मुफ्त ट्रायल या temporary license
प्रोडक्शन के लिए: GroupDocs वेबसाइट से लाइसेंस खरीदें

टेम्पररी लाइसेंस परीक्षण और विकास के लिए परफेक्ट है—यह वॉटरमार्क के बिना पूरी कार्यक्षमता देता है।

चरण-दर-चरण इम्प्लीमेंटेशन गाइड

अब रोमांचक भाग—आइए एक पूर्ण PDF एनोटेशन सिस्टम बनाते हैं! हम प्रत्येक कॉम्पोनेन्ट को समझाएंगे, न केवल कोड क्या करता है, बल्कि हम इसे इस तरह क्यों कर रहे हैं, भी बताएँगे।

चरण 1: अपने Annotator ऑब्जेक्ट को इनिशियलाइज़ करें

सबसे पहले—हमें एक Annotator ऑब्जेक्ट बनाना है जो हमारे PDF फ़ाइल को संभालेगा। इसे ऐसे सोचें जैसे आप PDF को एक विशेष एडिटर में खोल रहे हैं जो एनोटेशन को समझता है।

import com.groupdocs.annotation.Annotator;
import org.apache.commons.io.FilenameUtils;

String outputPath = "YOUR_OUTPUT_DIRECTORY/AnnotationOutput.pdf";
final Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/InputDocument.pdf");

यहाँ क्या हो रहा है?

  • Annotator कंस्ट्रक्टर आपके PDF को मेमोरी में लोड करता है।
  • हम एक आउटपुट पाथ सेट कर रहे हैं जहाँ एनोटेटेड PDF सेव होगा।
  • इनपुट PDF अपरिवर्तित रहता है—हम एक नया एनोटेटेड संस्करण बना रहे हैं।

सामान्य गड़बड़ी: सुनिश्चित करें कि आपके फ़ाइल पाथ सही हैं और डायरेक्टरी मौजूद हैं। मैंने देखा है कि डेवलपर्स कई घंटे सरल पाथ समस्याओं को डिबग करने में बिता देते हैं!

चरण 2: इंटरैक्टिव रिप्लाईज़ और कमेंट्स बनाएं

यहाँ चीज़ें दिलचस्प हो जाती हैं। अधिकांश PDF एनोटेशन ट्यूटोरियल इस भाग को छोड़ देते हैं, लेकिन रिप्लाईज़ ही एनोटेशन को वास्तव में सहयोगी बनाते हैं। चलिए एक थ्रेडेड कॉन्वर्सेशन सिस्टम बनाते हैं:

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

List<Reply> replies = new ArrayList<>();

// First reply
Reply reply1 = new Reply();
reply1.setComment("First comment");
reply1.setRepliedOn(Calendar.getInstance().getTime());
replies.add(reply1);

// Second reply  
Reply reply2 = new Reply();
reply2.setComment("Second comment");
reply2.setRepliedOn(Calendar.getInstance().getTime());
replies.add(reply2);

यह क्यों महत्वपूर्ण है: वास्तविक एप्लिकेशन्स में अक्सर आपको यह ट्रैक करना पड़ता है कि किसने क्या कहा और कब। यह रिप्लाई सिस्टम आपको निम्न फीचर बनाने में मदद करता है:

  • हाइलाइटेड टेक्स्ट पर कमेंट थ्रेड्स
  • स्वीकृति चेन के साथ रिव्यू वर्कफ़्लो
  • दस्तावेज़ परिवर्तन के लिए ऑडिट ट्रेल्स
  • सहयोगी एडिटिंग वातावरण

वास्तविक दुनिया की टिप: उपयोगकर्ता जानकारी और टाइमस्टैम्प को अधिक मजबूत तरीके से स्टोर करने पर विचार करें। प्रोडक्शन में आप इसे अपने ऑथेंटिकेशन सिस्टम या डेटाबेस से ले सकते हैं।

चरण 3: सटीक हाइलाइट कोऑर्डिनेट्स परिभाषित करें

यह वह जादू है—हम लाइब्रेरी को ठीक बताते हैं कि हाइलाइट कहाँ रखें। कोऑर्डिनेट सिस्टम पहली बार थोड़ा जटिल लग सकता है, लेकिन यह वास्तव में काफी लॉजिकल है:

import com.groupdocs.annotation.models.Point;
import java.util.ArrayList;
import java.util.List;

List<Point> points = new ArrayList<>();
points.add(new Point(80, 730));   // Top-left corner
points.add(new Point(240, 730));  // Top-right corner  
points.add(new Point(80, 650));   // Bottom-left corner
points.add(new Point(240, 650));  // Bottom-right corner

PDF कोऑर्डिनेट्स को समझना:

  • उत्पत्ति (0,0) पेज के बॉटम‑लेफ़्ट पर है।
  • X दाएँ बढ़ता है, Y ऊपर बढ़ता है।
  • पॉइंट्स एक आयताकार हाइलाइट एरिया को परिभाषित करते हैं।
  • चार पॉइंट्स आपके लक्ष्य टेक्स्ट के चारों ओर बाउंडिंग बॉक्स बनाते हैं।

कोऑर्डिनेट खोजने के लिए प्रो टिप: कोऑर्डिनेट डिस्प्ले वाले PDF व्यूअर का उपयोग करें, या अनुमानित मानों से शुरू करके परिणामों के आधार पर समायोजित करें। अधिकांश PDF व्यूअर कर्सर कोऑर्डिनेट दिखा सकते हैं।

चरण 4: अपने हाइलाइट एनोटेशन को कॉन्फ़िगर करें

अब हम सभी विज़ुअल प्रॉपर्टीज़ के साथ वास्तविक हाइलाइट एनोटेशन बनाएंगे। यहाँ आप यूज़र एक्सपीरियंस को वास्तव में कस्टमाइज़ कर सकते हैं:

import com.groupdocs.annotation.models.annotationmodels.HighlightAnnotation;

HighlightAnnotation highlight = new HighlightAnnotation();
highlight.setBackgroundColor(65535);  // Yellow highlight
highlight.setCreatedOn(Calendar.getInstance().getTime());
highlight.setFontColor(0);            // Black text  
highlight.setMessage("This is a highlight annotation");
highlight.setOpacity(0.5);            // Semi‑transparent
highlight.setPageNumber(0);           // First page (zero‑indexed)
highlight.setPoints(points);
highlight.setReplies(replies);

// Add the highlight to the annotator
annotator.add(highlight);

कस्टमाइज़ेशन विकल्पों की व्याख्या:

  • setBackgroundColor(65535): पीला हाइलाइट (RGB रंग इंटीजर के रूप में)
  • setOpacity(0.5): 50 % ट्रांसपेरेंसी—टेक्स्ट पढ़ने योग्य रहता है
  • setFontColor(0): अच्छा कंट्रास्ट के लिए काला टेक्स्ट
  • setPageNumber(0): पेज इंडेक्स (0 = पहला पेज)

रंग चयन टिप्स:

  • पीला (65535) क्लासिक और गैर‑आक्रामक है।
  • महत्वपूर्ण हाइलाइट्स के लिए, ऑरेंज (16753920) या रेड (16711680) आज़माएँ।
  • बेहतर पठनीयता के लिए अपारदर्शिता 0.3‑0.7 के बीच रखें।

चरण 5: अपने एनोटेटेड PDF को सेव करें

अंत में, चलिए अपना काम सेव करते हैं और संसाधनों को सही तरीके से साफ़ करते हैं:

annotator.save(outputPath);
annotator.dispose();

संसाधन प्रबंधन: dispose() कॉल बहुत महत्वपूर्ण है—यह मेमोरी मुक्त करता है और सुनिश्चित करता है कि सभी परिवर्तन डिस्क पर सही ढंग से लिखे जाएँ। हमेशा इसे try‑finally ब्लॉक में शामिल करें या प्रोडक्शन कोड में try‑with‑resources का उपयोग करें।

सामान्य समस्याओं का निवारण

PDF एनोटेशन के साथ काम करते हुए मैंने जिन समस्याओं का सामना किया (और हल किया) उन्हें साझा करता हूँ:

फ़ाइल पाथ समस्याएँ

लक्षण: FileNotFoundException या “फ़ाइल तक पहुँच नहीं सकता” त्रुटियाँ

समाधान:

  • फ़ाइल पाथ्स को प्रोजेक्ट रूट के सापेक्ष या एब्सोल्यूट होने की पुष्टि करें।
  • फ़ाइल अनुमतियों की जाँच करें—आपके जावा प्रोसेस को पढ़ने/लिखने की पहुँच चाहिए।
  • सेव करने से पहले आउटपुट डायरेक्टरीज़ मौजूद हों यह सुनिश्चित करें।

कोऑर्डिनेट्स अपेक्षित स्थान से मेल नहीं खाते

लक्षण: हाइलाइट्स गलत स्थान पर दिखते हैं

समाधान:

  • ध्यान रखें कि PDF कोऑर्डिनेट सिस्टम बॉटम‑लेफ़्ट से शुरू होता है।
  • विभिन्न PDF जेनरेटर में थोड़े अंतर हो सकते हैं।
  • सैंपल PDFs के साथ टेस्ट करें और कोऑर्डिनेट्स को उसी अनुसार समायोजित करें।

बड़े PDFs के साथ मेमोरी समस्याएँ

लक्षण: OutOfMemoryError या धीमा प्रदर्शन

समाधान:

  • JVM हीप साइज बढ़ाएँ, जैसे -Xmx2G
  • PDFs को छोटे बैचों में प्रोसेस करें।
  • संसाधनों को मुक्त करने के लिए हमेशा dispose() कॉल करें।

रंग सही ढंग से नहीं दिख रहा

लक्षण: गलत हाइलाइट रंग या अदृश्य एनोटेशन

समाधान:

  • RGB इंटीजर वैल्यूज़ का उपयोग करें, हेक्स स्ट्रिंग्स नहीं।
  • ऑपेसिटी वैल्यूज़ 0.1 से 0.9 के बीच टेस्ट करें।
  • पृष्ठभूमि और फ़ॉन्ट रंगों के बीच अच्छा कंट्रास्ट सुनिश्चित करें।

प्रदर्शन अनुकूलन सर्वोत्तम प्रथाएँ

कई प्रोडक्शन सिस्टम में PDF एनोटेशन लागू करने के बाद, यहाँ वे प्रदर्शन टिप्स हैं जो वास्तव में मायने रखते हैं:

मेमोरी मैनेजमेंट

// Good practice - use try-with-resources when available
try (Annotator annotator = new Annotator(inputPath)) {
    // Your annotation code here
    annotator.save(outputPath);
} // Automatically disposes resources

बैच प्रोसेसिंग रणनीति

एक साथ कई PDFs के लिए, सभी को मेमोरी में लोड करने की बजाय क्रमिक रूप से प्रोसेस करें:

for (String pdfPath : pdfPaths) {
    try (Annotator annotator = new Annotator(pdfPath)) {
        // Process single PDF
        addAnnotations(annotator);
        annotator.save(getOutputPath(pdfPath));
    }
    // Memory freed before next iteration
}

फ़ाइल आकार विचार

  • बड़े PDFs (>10 MB) अधिक मेमोरी और प्रोसेसिंग समय लेते हैं।
  • बहुत बड़े दस्तावेज़ों को सेक्शन में विभाजित करने पर विचार करें।
  • संभव हो तो एनोटेशन से पहले इनपुट PDFs को ऑप्टिमाइज़ करें।

वास्तविक दुनिया के अनुप्रयोग और उपयोग केस

PDF एनोटेशन व्यावहारिक अनुप्रयोगों में जहाँ चमकता है, वह यहाँ है:

दस्तावेज़ रिव्यू सिस्टम

उपयुक्त: कानूनी अनुबंध, तकनीकी विशिष्टताएँ, अनुपालन दस्तावेज़

इम्प्लीमेंटेशन टिप्स:

  • विभिन्न समीक्षकों के लिए अलग-अलग हाइलाइट रंगों का उपयोग करें।
  • कौन एनोटेशन जोड़/संपादित कर सकता है, इसके लिए यूज़र परमिशन लागू करें।
  • रिपोर्टिंग के लिए एनोटेशन मेटाडाटा को अपने डेटाबेस में स्टोर करें।

शैक्षिक प्लेटफ़ॉर्म

उपयुक्त: पाठ्यपुस्तक हाइलाइटिंग, असाइनमेंट फीडबैक, सहयोगी अध्ययन

इम्प्लीमेंटेशन टिप्स:

  • छात्रों को व्यक्तिगत एनोटेशन सेव करने की अनुमति दें।
  • शिक्षकों को आधिकारिक टिप्पणी जोड़ने में सक्षम बनाएं।
  • दस्तावेज़ अपडेट के लिए संस्करण नियंत्रण पर विचार करें।

क्वालिटी एश्योरेंस वर्कफ़्लो

उपयुक्त: डिज़ाइन रिव्यू, प्रक्रिया दस्तावेज़ीकरण, अनुपालन जांच

इम्प्लीमेंटेशन टिप्स:

  • मौजूदा QA टूल्स के साथ इंटीग्रेट करें।
  • ट्रैकिंग के लिए एनोटेशन स्टेटस (ओपन/रिज़ॉल्व्ड) का उपयोग करें।
  • एनोटेशन डेटा से रिपोर्ट जनरेट करें।

सहयोगी रिसर्च टूल्स

उपयुक्त: अकादमिक पेपर, रिसर्च दस्तावेज़ीकरण, पीयर रिव्यू

इम्प्लीमेंटेशन टिप्स:

  • रियल‑टाइम सहयोगी फीचर्स लागू करें।
  • ज़रूरत पड़ने पर अनाम रिव्यू की अनुमति दें।
  • विश्लेषण और रिपोर्टिंग के लिए एनोटेशन एक्सपोर्ट करें।

उन्नत टिप्स और सर्वोत्तम प्रथाएँ

कोऑर्डिनेट कैलकुलेशन हेल्पर मेथड्स

सामान्य कोऑर्डिनेट कैलकुलेशन के लिए यूटिलिटी मेथड्स बनाएं:

public class AnnotationUtils {
    public static List<Point> createRectangle(double x, double y, double width, double height) {
        List<Point> points = new ArrayList<>();
        points.add(new Point(x, y + height));      // Top‑left
        points.add(new Point(x + width, y + height)); // Top‑right  
        points.add(new Point(x, y));               // Bottom‑left
        points.add(new Point(x + width, y));       // Bottom‑right
        return points;
    }
}

एनोटेशन टेम्प्लेट्स

पुन: उपयोग योग्य एनोटेशन कॉन्फ़िगरेशन बनाएं:

public class AnnotationTemplates {
    public static HighlightAnnotation createStandardHighlight(List<Point> points, String message) {
        HighlightAnnotation highlight = new HighlightAnnotation();
        highlight.setBackgroundColor(65535);  // Yellow
        highlight.setOpacity(0.5);
        highlight.setFontColor(0);
        highlight.setMessage(message);
        highlight.setCreatedOn(Calendar.getInstance().getTime());
        highlight.setPoints(points);
        return highlight;
    }
}

अक्सर पूछे जाने वाले प्रश्न

Q: क्या मैं GroupDocs.Annotation को वेब एप्लिकेशन्स में उपयोग कर सकता हूँ?
A: बिल्कुल! यह Spring Boot, Servlets और अन्य जावा वेब फ्रेमवर्क्स के साथ इंटीग्रेट होता है। आप REST एन्डपॉइंट्स एक्सपोज़ कर सकते हैं जो PDF फ़ाइलें स्वीकार करते हैं, हाइलाइट्स लागू करते हैं, और एनोटेटेड डॉक्यूमेंट वापस देते हैं।

Q: विभिन्न भाषाओं में एनोटेशन कैसे हैंडल करें?
A: लाइब्रेरी Unicode को सपोर्ट करती है, इसलिए आप किसी भी भाषा में कमेंट्स और मैसेजेज़ जोड़ सकते हैं। बस यह सुनिश्चित करें कि आपका जावा एप्लिकेशन UTF‑8 एन्कोडिंग उपयोग करता हो।

Q: कई एनोटेशन जोड़ने का प्रदर्शन पर क्या असर पड़ता है?
A: प्रदर्शन एनोटेशन की संख्या के साथ स्केल करता है, लेकिन PDF का आकार अधिक प्रभाव डालता है। सैकड़ों हाइलाइट वाले दस्तावेज़ों के लिए, मेमोरी उपयोग कम रखने हेतु लेज़ी लोडिंग या पेजिनेशन पर विचार करें।

Q: क्या मैं मौजूदा एनोटेशन को प्रोग्रामेटिकली मॉडिफ़ाई कर सकता हूँ?
A: हाँ। मौजूदा एनोटेशन वाले PDF को लोड करें, रंग या पोज़िशन जैसे प्रॉपर्टीज़ अपडेट करें, और अपडेटेड संस्करण सेव करें। यह एनोटेशन मैनेजमेंट टूल्स बनाने के लिए आदर्श है।

Q: रिपोर्टिंग के लिए एनोटेशन डेटा कैसे एक्सट्रैक्ट करें?
A: GroupDocs.Annotation एनेमरेशन मेथड्स प्रदान करता है जिससे आप एनोटेशन मेटाडाटा (लेखक, निर्माण तिथि, कमेंट टेक्स्ट आदि) पढ़ सकते हैं। आप इस डेटा को CSV, JSON में एक्सपोर्ट कर सकते हैं या एनालिटिक्स पाइपलाइन में फीड कर सकते हैं।

आवश्यक संसाधन और दस्तावेज़ीकरण

  • GroupDocs.Annotation Java Documentation - व्यापक गाइड और API रेफ़रेंसेज़
  • API Reference - विस्तृत मेथड डॉक्यूमेंटेशन
  • Download Latest Version - हमेशा नवीनतम स्थिर रिलीज़ का उपयोग करें
  • Purchase License - प्रोडक्शन लाइसेंसिंग विकल्प
  • Get Temporary License - विकास और परीक्षण के लिए परफेक्ट
  • Community Support Forum - विशेषज्ञों और अन्य डेवलपर्स से मदद प्राप्त करें

अंतिम अपडेट: 2026-03-17
टेस्टेड विथ: GroupDocs.Annotation 25.2
लेखक: GroupDocs