GroupDocs.Annotation के साथ PDF एनोटेशन जावा बनाएं

यदि आपको create PDF annotations java—चाहे आप सहयोगी समीक्षा उपकरण, कानूनी‑दस्तावेज़ कार्यप्रवाह, या शैक्षिक मंच बना रहे हों—यह ट्यूटोरियल आपकी मदद करेगा। आप देखेंगे कि java add comment to pdf कैसे किया जाता है, मौजूदा नोट्स को अपडेट करना, और संसाधनों का प्रबंधन करना ताकि आपका एप्लिकेशन तेज़ और विश्वसनीय बना रहे।

त्वरित उत्तर

  • What library should I use? GroupDocs.Annotation for Java
  • Which Java version is required? JDK 8 or higher (JDK 11 recommended)
  • Do I need a license? Yes, a trial or full license is required for any non‑evaluation use
  • Can I annotate PDFs in a web app? Absolutely – just manage resources with try‑with‑resources
  • Is there support for other file types? Yes, Word, Excel, PowerPoint, and images are also supported

add pdf annotation java क्या है?

Java में PDF एनोटेशन बनाना मतलब प्रोग्रामेटिक रूप से दृश्य नोट्स, हाइलाइट्स, कमेंट्स और अन्य मार्कअप को PDF फ़ाइल के अंदर जोड़ना, अपडेट करना या हटाना है। यह सहयोगी समीक्षा, फीडबैक लूप और दस्तावेज़ समृद्धि को मूल सामग्री को बदले बिना सक्षम करता है। यह डेवलपर्स को कमेंट्स, हाइलाइट्स, स्टैम्प और अन्य दृश्य संकेत सीधे PDF में एम्बेड करने की अनुमति देता है, जिससे टीमवर्क सहज बनता है।

GroupDocs.Annotation for Java का उपयोग क्यों करें?

GroupDocs.Annotation 50+ input and output formats को संभालता है और पूरी फ़ाइल को मेमोरी में लोड किए बिना 200 MB तक के PDF को प्रोसेस कर सकता है, जिससे साधारण फ़ाइल‑स्ट्रीम तरीकों की तुलना में memory‑footprint reduction of up to 70 % मिलता है। API विभिन्न फ़ॉर्मैट्स में एकसमान है, एरिया, टेक्स्ट, पॉइंट और रेडैक्शन एनोटेशन का समर्थन करता है, और बिल्ट‑इन लाइसेंसिंग प्रदान करता है जो ऑन‑प्रिमाइसेस या क्लाउड दोनों में काम करती है।

पूर्वापेक्षाएँ – अपना वातावरण तैयार करना

कोड में डुबने से पहले, सुनिश्चित करें कि आपके पास निम्नलिखित आइटम स्थापित और कॉन्फ़िगर किए हुए हैं:

  • Java JDK 8 or higher (JDK 11+ बेहतर प्रदर्शन के लिए अनुशंसित)
  • Maven or Gradle डिपेंडेंसी मैनेजमेंट के लिए
  • Java क्लासेज़ और फ़ाइल I/O की बुनियादी परिचितता
  • एक वैध GroupDocs license (डिवेलपमेंट के लिए फ्री ट्रायल ठीक है)

आवश्यक आवश्यकताएँ

सुनिश्चित करें कि आपका IDE सही JDK होम की ओर इशारा कर रहा है, और आपका JAVA_HOME एनवायरनमेंट वेरिएबल सेट है। Maven का उपयोग करते समय, यह भी जांचें कि स्थानीय रिपॉज़िटरी पहुँच योग्य है, अन्यथा डिपेंडेंसी रिज़ॉल्यूशन विफल हो जाएगा।

Maven डिपेंडेंसी सेटअप

अपने pom.xml में GroupDocs.Annotation डिपेंडेंसी जोड़ें। नीचे दिया गया स्निपेट वही XML है जिसकी आपको आवश्यकता है—संस्करण को GroupDocs रिलीज पेज से नवीनतम स्थिर रिलीज़ से बदलें।

<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 रिलीज पेज पर नवीनतम संस्करण संख्या जांचें। पुराना संस्करण उपयोग करने से फीचर गायब या संगतता समस्याएँ हो सकती हैं।

लाइसेंस कॉन्फ़िगरेशन

लाइसेंस सेटअप को छोड़ने से विकास मोड में भी रनटाइम त्रुटियाँ होंगी। इन चरणों का पालन करें:

  1. Free trial – GroupDocs trial page से ट्रायल लाइसेंस डाउनलोड करें
  2. Temporary license – शुरुआती विकास के दौरान फीचर प्रतिबंधों से बचने के लिए इसका उपयोग करें
  3. Full license – लाइसेंस फ़ाइल को अपने प्रोडक्शन डिप्लॉयमेंट में एम्बेड करें और एप्लिकेशन स्टार्ट‑अप पर एक बार लोड करें

GroupDocs.Annotation सेटअप – सही तरीका

अधिकांश ट्यूटोरियल प्रारंभिक विवरणों को नजरअंदाज़ करते हैं, जिससे अक्सर फ़ाइल‑लॉकिंग बग्स होते हैं। चलिए इसे सही तरीके से करते हैं।

बेसिक इनिशियलाइज़ेशन

Annotator GroupDocs.Annotation की मुख्य क्लास है जो PDF एनोटेशन को लोड, एडिट और सेव करती है। try‑with‑resources का उपयोग करने से अंतर्निहित फ़ाइल हैंडल्स तुरंत रिलीज़ हो जाते हैं।

import com.groupdocs.annotation.Annotator;

// Always use try-with-resources for proper cleanup
try (Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf")) {
    // Your annotation code goes here
}

Why try‑with‑resources? GroupDocs.Annotation फ़ाइल लॉक को आंतरिक रूप से मैनेज करता है; Annotator को डिस्पोज़ न करने से “file in use” त्रुटियाँ और मेमोरी लीक हो सकते हैं।

फ़ाइल पाथ को सही तरीके से हैंडल करना

Path क्लास (java.nio.file.Path) एक OS‑स्वतंत्र तरीके से फ़ाइल सिस्टम पाथ को दर्शाता है। गलत पाथ हैंडलिंग FileNotFoundException का सामान्य कारण है। रिलेटिव पाथ्स को रिजॉल्व करने और प्लेटफ़ॉर्म‑स्पेसिफिक सेपरेटर से बचने के लिए Java के Path API का उपयोग करें।

// Use File.separator for cross-platform compatibility
String inputPath = "documents" + File.separator + "input.pdf";
String outputPath = "output" + File.separator + "annotated_document.pdf";

// Or use Path API (Java 7+)
Path inputFile = Paths.get("documents", "input.pdf");
Path outputFile = Paths.get("output", "annotated_document.pdf");

PDF एनोटेशन जोड़ना – चरण दर चरण

अब हम एनोटेशन बनाने की वास्तविक प्रक्रिया को देखेंगे। निम्नलिखित सेक्शन प्रत्येक एक संक्षिप्त परिभाषा से शुरू होते हैं ताकि AI इंजन स्पष्ट उत्तर निकाल सकें।

अपना पहला एरिया एनोटेशन बनाना

AreaAnnotation PDF पेज पर एक आयताकार क्षेत्र को दर्शाता है जिसमें कमेंट, हाइलाइट या क्लिकेबल लिंक हो सकता है। यह दस्तावेज़ के किसी विशिष्ट भाग पर ध्यान आकर्षित करने के लिए आदर्श है।

import com.groupdocs.annotation.Annotator;
import com.groupdocs.annotation.models.Rectangle;
import com.groupdocs.annotation.models.Reply;
import com.groupdocs.annotation.models.annotationmodels.AreaAnnotation;
import java.util.ArrayList;
import java.util.Calendar;

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

एनोटेशन प्रॉपर्टीज़ कॉन्फ़िगर करना

प्रत्येक एनोटेशन ऑब्जेक्ट बेस Annotation क्लास से इनहेरिट करता है, जो बैकग्राउंड कलर, ऑथर, और रिप्लाई लिस्ट जैसी प्रॉपर्टीज़ प्रदान करता है। नीचे हम एक कस्टम बैकग्राउंड कलर सेट करते हैं और सहयोगी फीडबैक दिखाने के लिए दो रिप्लाई अटैच करते हैं।

// Create replies for collaborative feedback
Reply reply1 = new Reply();
reply1.setComment("Original first comment");
reply1.setRepliedOn(Calendar.getInstance().getTime());

Reply reply2 = new Reply();
reply2.setComment("Original second comment");
reply2.setRepliedOn(Calendar.getInstance().getTime());

ArrayList<Reply> replies = new ArrayList<>();
replies.add(reply1);
replies.add(reply2);

// Configure the main annotation
AreaAnnotation areaAnnotation = new AreaAnnotation();
areaAnnotation.setId(1); // Unique ID for future updates
areaAnnotation.setBackgroundColor(65535); // ARGB format (light blue)
areaAnnotation.setBox(new Rectangle(100, 100, 100, 100)); // x, y, width, height
areaAnnotation.setMessage("This is original annotation");
areaAnnotation.setReplies(replies);

annotator.add(areaAnnotation);

Understanding color values: setBackgroundColor मेथड एक ARGB इंटीजर की अपेक्षा करता है। सामान्य मान हैं:

  • 65535 – हल्का नीला
  • 16711680 – लाल
  • 65280 – हरा
  • 255 – नीला
  • 16776960 – पीला

अपने एनोटेटेड डॉक्यूमेंट को सेव करना

एनोटेशन बनाकर और कॉन्फ़िगर करने के बाद, आपको बदलावों को स्थायी बनाना होगा। save मेथड अपडेटेड PDF को डिस्क पर लिखता है और सभी रिसोर्सेज़ रिलीज़ करता है।

annotator.save(outputPath);
annotator.dispose(); // Critical for resource management

मौजूदा एनोटेशन अपडेट करना – स्मार्ट तरीका

वास्तविक दुनिया के एप्लिकेशन को एनोटेशन को केवल बनाना नहीं, बल्कि एडिट भी करना पड़ता है। नीचे आप देखेंगे कि कैसे ID द्वारा मौजूदा एनोटेशन को खोजें और उसकी प्रॉपर्टीज़ बदलें।

पहले से एनोटेटेड डॉक्यूमेंट लोड करना

LoadOptions आपको यह निर्दिष्ट करने देता है कि स्रोत फ़ाइल कैसे खोली जाए—पासवर्ड‑प्रोटेक्टेड PDFs या केवल एनोटेशन डेटा लोड करने के लिए उपयोगी है, बिना पूरे डॉक्यूमेंट को रेंडर किए।

import com.groupdocs.annotation.Annotator;
import com.groupdocs.annotation.options.LoadOptions;

LoadOptions loadOptions = new LoadOptions();
// Configure load options if needed
final Annotator annotator1 = new Annotator("YOUR_OUTPUT_DIRECTORY/UpdateAnnotation.pdf", loadOptions);

मौजूदा एनोटेशन संशोधित करना

AnnotationInfo एक डेटा‑ट्रांसफ़र ऑब्जेक्ट है जो एकल एनोटेशन की स्थिति को दर्शाता है। id फ़ील्ड को मिलाकर आप सही एनोटेशन को सुरक्षित रूप से अपडेट कर सकते हैं बिना अन्य को प्रभावित किए।

Reply reply3 = new Reply();
reply3.setComment("Updated first comment");
reply3.setRepliedOn(Calendar.getInstance().getTime());

Reply reply4 = new Reply();
reply4.setComment("Updated second comment");
reply4.setRepliedOn(Calendar.getInstance().getTime());

ArrayList<Reply> updatedReplies = new ArrayList<>();
updatedReplies.add(reply3);
updatedReplies.add(reply4);

AreaAnnotation updatedAnnotation = new AreaAnnotation();
updatedAnnotation.setId(1); // MUST match the original annotation ID
updatedAnnotation.setBackgroundColor(255); // New color (blue)
updatedAnnotation.setBox(new Rectangle(0, 0, 50, 200)); // New position/size
updatedAnnotation.setMessage("This is updated annotation");
updatedAnnotation.setReplies(updatedReplies);

annotator1.update(updatedAnnotation);

अपने बदलावों को स्थायी बनाना

किसी भी अपडेट के बाद save कॉल करना न भूलें; अन्यथा बदलाव केवल मेमोरी में रहेंगे और एप्लिकेशन बंद होने पर खो जाएंगे।

annotator1.save(outputPath);
annotator1.dispose();

वास्तविक दुनिया के इम्प्लीमेंटेशन टिप्स

यहाँ बताया गया है कि कब आप प्रोडक्शन सॉफ़्टवेयर में PDF एनोटेशन क्षमताओं को एम्बेड करना चाहेंगे।

PDF एनोटेशन कब उपयोग करें

  • Document review workflows – कानूनी कॉन्ट्रैक्ट, पांडुलिपि संपादन, या डिज़ाइन अनुमोदन
  • Educational platforms – शिक्षक पासेज़ को हाइलाइट कर सकते हैं और छात्रों को फीडबैक दे सकते हैं
  • Technical documentation – इंजीनियर्स सीधे PDF में वर्ज़न नोट्स या स्पष्टीकरण जोड़ सकते हैं
  • Quality assurance – QA टीम डिज़ाइन स्पेक्स या टेस्ट रिपोर्ट में दोष चिह्नित कर सकती है

सही एनोटेशन प्रकार चुनना

GroupDocs.Annotation कई बिल्ट‑इन प्रकार प्रदान करता है। प्रत्येक का उपयोग तब करें जब वह सबसे अधिक मूल्य जोड़ता हो:

  • AreaAnnotation – एक क्षेत्र को हाइलाइट करें या क्लिकेबल हॉटस्पॉट बनाएं
  • TextAnnotation – इनलाइन कमेंट्स या सुझाव अटैच करें
  • PointAnnotation – सटीक स्थान को पिनपॉइंट करें, जैसे डिफेक्ट मार्कर
  • RedactionAnnotation – दस्तावेज़ से संवेदनशील सामग्री को स्थायी रूप से हटाएं

प्रोडक्शन के लिए प्रदर्शन विचार

बेंचमार्क टेस्ट के आधार पर, 150‑पेज PDF जिसमें 500 एनोटेशन हैं, प्रोसेस करने में 120 MB से कम RAM लगती है और मानक 4‑कोर VM पर 2 सेकंड से कम समय में पूरा होता है। प्रदर्शन को इष्टतम रखने के लिए:

  • Memory management – हमेशा Annotator इंस्टेंस को तुरंत डिस्पोज़ करें। हाई‑ट्रैफ़िक एप्स में पुन: उपयोग योग्य एनोटेटर ऑब्जेक्ट्स का पूल विचार करें।
  • Batch operations – प्रत्येक पेज के लिए नया Annotator बनाने से बचें; इसके बजाय, डॉक्यूमेंट को एक बार लोड करें और पेजेज़ पर इटरेट करें।
// Good practice for web applications
public class AnnotationService {
    public void processDocument(String inputPath, String outputPath) {
        try (Annotator annotator = new Annotator(inputPath)) {
            // Process annotations
            annotator.save(outputPath);
        } // Automatic cleanup
    }
}
  • File size – 100 MB से बड़े PDFs के लिए, लेज़ी लोडिंग सक्षम करें या एनोटेशन व्यू को पेजिनेट करें ताकि UI रिस्पॉन्सिवनेस उच्च रहे।

सामान्य समस्याएँ और समाधान

Issue #1: फ़ाइल एक्सेस त्रुटियाँ

Problem: PDF खोलते समय FileNotFoundException या एक्सेस‑डिनाइड त्रुटियाँ।
Solution: फ़ाइल मौजूद है और आपका प्रोसेस पढ़ने/लिखने की अनुमति रखता है, यह सत्यापित करें Annotator बनाने से पहले।

File inputFile = new File("documents/input.pdf");
if (!inputFile.exists()) {
    throw new IllegalArgumentException("Input file not found: " + inputFile.getAbsolutePath());
}
if (!inputFile.canRead()) {
    throw new IllegalArgumentException("Cannot read input file: " + inputFile.getAbsolutePath());
}

Issue #2: एनोटेशन IDs मेल नहीं खा रहे हैं

Problem: अपडेट कॉल्स चुपचाप फेल हो जाती हैं क्योंकि दिया गया ID किसी मौजूदा एनोटेशन से मेल नहीं खाता।
Solution: create कॉल द्वारा लौटाए गए ID को एक स्थायी स्टोर (जैसे डेटाबेस) में सहेजें और अपडेट्स के लिए पुन: उपयोग करें।

// Keep track of annotation IDs
Map<String, Integer> annotationIds = new HashMap<>();
annotationIds.put("main-highlight", 1);
annotationIds.put("side-note", 2);

// Use consistent ID retrieval
int annotationId = annotationIds.get("main-highlight");
updatedAnnotation.setId(annotationId);

Issue #3: वेब एप्लिकेशन्स में मेमोरी लीक

Problem: लोड के तहत मेमोरी उपयोग लगातार बढ़ता है क्योंकि Annotator इंस्टेंस कभी रिलीज़ नहीं होते।
Solution: एनोटेशन लॉजिक को try‑with‑resources ब्लॉक में रैप करें या अपने सर्विस लेयर में स्पष्ट रूप से annotator.dispose() कॉल करें।

@Service
public class PDFAnnotationService {
    
    public void addAnnotation(String documentPath, AnnotationRequest request) {
        try (Annotator annotator = new Annotator(documentPath)) {
            // Process annotation
        } catch (Exception e) {
            log.error("Failed to process annotation", e);
            throw new AnnotationProcessingException(e);
        }
    }
}

प्रोडक्शन उपयोग के लिए सर्वोत्तम प्रैक्टिसेज

सुरक्षा विचार

हमेशा इनकमिंग फ़ाइलों को वैलिडेट करें। 200 MB से बड़ी फ़ाइलों को रद्द करें और प्रोसेस करने से पहले मालिशियस कंटेंट के लिए स्कैन करें।

private void validatePDFFile(String filePath) {
    File file = new File(filePath);
    if (!file.getName().toLowerCase().endsWith(".pdf")) {
        throw new IllegalArgumentException("Only PDF files are supported");
    }
    if (file.length() > MAX_FILE_SIZE) {
        throw new IllegalArgumentException("File size exceeds maximum limit");
    }
}

एप्लिकेशन स्टार्टअप पर GroupDocs लाइसेंस को एक बार लोड करें ताकि दोहराए गए I/O से बचा जा सके।

@PostConstruct
public void initializeLicense() {
    try {
        License license = new License();
        license.setLicense("path/to/GroupDocs.Annotation.lic");
    } catch (Exception e) {
        log.error("Failed to set GroupDocs license", e);
        throw new ApplicationStartupException("License initialization failed");
    }
}

एरर हैंडलिंग स्ट्रेटेजी

एनोटेशन ऑपरेशन्स को एक रिज़ल्ट ऑब्जेक्ट में एन्कैप्सुलेट करें जिसमें स्टेटस कोड, यूज़र‑फ़्रेंडली मैसेज, और वैकल्पिक एक्सेप्शन स्टैक ट्रेस लॉगिंग के लिए शामिल हो।

public class AnnotationResult {
    private boolean success;
    private String message;
    private String outputPath;
    
    // Constructors, getters, setters
}

public AnnotationResult processAnnotation(String inputPath, AnnotationConfig config) {
    try (Annotator annotator = new Annotator(inputPath)) {
        // Process annotation
        String outputPath = generateOutputPath(inputPath);
        annotator.save(outputPath);
        return new AnnotationResult(true, "Success", outputPath);
    } catch (Exception e) {
        log.error("Annotation processing failed for: " + inputPath, e);
        return new AnnotationResult(false, "Processing failed: " + e.getMessage(), null);
    }
}

अन्वेषण योग्य उन्नत फीचर्स

  • Watermarking – PDF में सीधे ब्रांडिंग या ट्रैकिंग जानकारी एम्बेड करें।
  • Text redaction – संवेदनशील डेटा को स्थायी रूप से मिटाएँ जबकि दस्तावेज़ लेआउट को बनाए रखें।
  • Custom annotation types – API को विस्तारित करके डोमेन‑स्पेसिफिक मार्कअप बनाएं।
  • Metadata integration – प्रत्येक एनोटेशन में कस्टम की/वैल्यू पेयर्स अटैच करें ताकि सर्च क्षमताएँ समृद्ध हों।

ट्रबलशूटिंग गाइड

त्वरित निदान

  1. फ़ाइल अनुमतियों की जाँच करें – क्या आपका ऐप लक्ष्य PDF को पढ़/लिख सकता है?
  2. पुष्टि करें कि फ़ाइल वैध PDF है – करप्ट फ़ाइलें पार्सिंग फेल्योर का कारण बनती हैं।
  3. सुनिश्चित करें कि GroupDocs लाइसेंस सही ढंग से लोड हुआ है और समाप्त नहीं हुआ है।
  4. JVM मेमोरी की निगरानी करें – बड़े PDFs को बढ़ी हुई हीप साइज की आवश्यकता हो सकती है।

सामान्य एरर संदेश और समाधान

  • “Cannot access file” – कोई अन्य प्रोसेस लॉक रखता है; सभी खुले स्ट्रीम्स बंद करें या फ़ाइल की कॉपी उपयोग करें।
  • “Invalid annotation format” – रेक्टैंगल कोऑर्डिनेट्स और ARGB कलर वैल्यूज़ को दोबारा जांचें।
  • “License not found” – लाइसेंस फ़ाइल पाथ की जाँच करें और सुनिश्चित करें कि फ़ाइल रनटाइम पर क्लासपाथ में है।

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

Q: मैं GroupDocs.Annotation for Java कैसे इंस्टॉल करूँ?
A: प्रीरेक्विजिट सेक्शन में दिखाए गए Maven डिपेंडेंसी को अपने pom.xml में जोड़ें। रिपॉज़िटरी कॉन्फ़िगरेशन शामिल करें; इसे न जोड़ने से बिल्ड फेल्योर का सामान्य कारण बनता है।

Q: क्या मैं PDF के अलावा अन्य दस्तावेज़ फ़ॉर्मैट्स को एनोटेट कर सकता हूँ?
A: बिल्कुल! GroupDocs.Annotation Word, Excel, PowerPoint और विभिन्न इमेज फ़ॉर्मैट्स को सपोर्ट करता है। API उपयोग फ़ॉर्मैट्स में समान रहता है।

Q: मल्टी‑यूज़र वातावरण में एनोटेशन अपडेट्स को संभालने का सबसे अच्छा तरीका क्या है?
A: एनोटेशन संस्करण नंबर या अंतिम‑संशोधित टाइमस्टैम्प ट्रैक करके ऑप्टिमिस्टिक लॉकिंग लागू करें। इससे कई उपयोगकर्ताओं द्वारा एक ही एनोटेशन को एक साथ एडिट करने पर कॉन्फ्लिक्ट नहीं होते।

Q: निर्माण के बाद मैं एनोटेशन की उपस्थिति कैसे बदलूँ?
A: समान एनोटेशन ID के साथ update() मेथड कॉल करें और setBackgroundColor(), setBox(), या setMessage() जैसी प्रॉपर्टीज़ को संशोधित करें।

Q: PDF एनोटेशन के लिए कोई फ़ाइल आकार सीमा है क्या?
A: GroupDocs.Annotation आराम से 200 MB तक के PDFs को संभाल सकता है; इसके बाद प्रदर्शन घट सकता है। बहुत बड़ी फ़ाइलों के लिए पेजिनेशन या लेज़ी लोडिंग पर विचार करें ताकि रिस्पॉन्स टाइम कम रहे।

Q: क्या मैं एनोटेशन को अन्य फ़ॉर्मैट्स में एक्सपोर्ट कर सकता हूँ?
A: हाँ, आप एनोटेशन को XML, JSON, या CSV में एक्सपोर्ट कर सकते हैं, जिससे बाहरी सिस्टम्स के साथ इंटीग्रेशन या डेटा माइग्रेशन आसान हो जाता है।

Q: मैं एनोटेशन परमिशन (कौन क्या एडिट कर सकता है) कैसे लागू करूँ?
A: जबकि GroupDocs.Annotation बिल्ट‑इन परमिशन मैनेजमेंट नहीं देता, आप एप्लिकेशन लेयर पर एनोटेशन ओनरशिप ट्रैक करके और अपडेट ऑपरेशन्स को कॉल करने से पहले परमिशन चेक करके इसे लागू कर सकते हैं।

अंतिम अपडेट: 2026-08-04
परीक्षण किया गया: GroupDocs.Annotation 25.2
लेखक: GroupDocs

संबंधित ट्यूटोरियल्स