Βιβλιοθήκη Java PDF Annotation: δημιουργία απάντησης σχολίου java
Αν χρειάζεστε create annotation reply java για PDFs—είτε χτίζετε μια πύλη ανασκόπησης συμβάσεων, ένα σύστημα e‑learning ή μια γραμμή επεξεργασίας μαζικών δεδομένων—αυτός ο οδηγός σας δείχνει ακριβώς πώς να το κάνετε με το GroupDocs.Annotation για Java. Θα περάσουμε από τη ρύθμιση, τη δημιουργία squiggly annotation, τη δημιουργία νήματος απαντήσεων και τη βελτιστοποίηση απόδοσης, ώστε να παραδώσετε μια αξιόπιστη λύση σε ημέρες, όχι εβδομάδες.
Γρήγορες Απαντήσεις
- Ποιος είναι ο κύριος σκοπός του GroupDocs.Annotation; Επιτρέπει τη προγραμματιστική δημιουργία, τροποποίηση και εξαγωγή σχολίων PDF σε Java.
- Πώς προσθέτω μια squiggly annotation; Δημιουργήστε ένα αντικείμενο
SquigglyAnnotation, ορίστε τη γεωμετρία και το στυλ του, και στη συνέχεια καλέστεannotator.add(...). - Μπορώ να συνδέσω απαντήσεις σε ένα annotation; Ναι—δημιουργήστε αντικείμενα
Reply, ορίστε τον συγγραφέα και το κείμενο, και συνδέστε τα με το γονικό annotation. - Χρειάζομαι άδεια για παραγωγή; Απόλυτα· χωρίς έγκυρη άδεια το αποτέλεσμα θα περιέχει υδατογραφήματα.
- Είναι κατάλληλο για επεξεργασία δέσμης; Ναι—χρησιμοποιήστε try‑with‑resources για να ανοίξετε κάθε έγγραφο, να το σχολιάσετε και να το κλείσετε, διατηρώντας τη χρήση μνήμης χαμηλή.
Γιατί οι προγραμματιστές Java χρειάζονται βιβλιοθήκες PDF Annotation
Η χειροκίνητη σήμανση PDFs είναι χρονοβόρα και επιρρεπής σε σφάλματα, ειδικά όταν πρέπει να ελέγξετε εκατοντάδες συμβάσεις ή εξεταστικές εργασίες. Μια βιβλιοθήκη Java PDF annotation αυτοματοποιεί αυτή τη δουλειά, επιτρέποντάς σας να ενσωματώσετε επισημάνσεις, squiggly υπογραμμίσεις και νήματα σχολίων απευθείας στο αρχείο. Το αποτέλεσμα είναι ένα αναζητήσιμο, φορητό έγγραφο που διατηρεί όλες τις σημειώσεις χωρίς να χρειάζεται ξεχωριστός προβολέας.
Τι θα μάθετε σε αυτόν τον οδηγό
- Εγκατάσταση και αδειοδότηση του GroupDocs.Annotation σε ένα έργο Maven
- Δημιουργία squiggly annotations που μοιάζουν με τις εγγενείς υπογραμμίσεις του Word
- Προσθήκη νήματος απαντήσεων σε οποιοδήποτε annotation για συνεργατική ανασκόπηση
- Βελτιστοποίηση χρήσης μνήμης και CPU κατά την επεξεργασία μεγάλων PDFs
- Ανάπτυξη της λύσης σε Spring Boot, μικρο‑υπηρεσίες ή εφαρμογές επιφάνειας εργασίας
Είτε χτίζετε ένα σύστημα νομικής ανασκόπησης εγγράφων, ένα εκπαιδευτικό εργαλείο βαθμολόγησης, είτε μια αυτοματοποιημένη γραμμή ελέγχου ποιότητας, οι παρακάτω τεχνικές θα σας προσφέρουν μια βάση έτοιμη για παραγωγή.
Τι είναι το create annotation reply java;
create annotation reply java είναι η προγραμματιστική διαδικασία σύνδεσης ενός νήματος σχολίων (Reply) σε ένα υπάρχον PDF annotation χρησιμοποιώντας Java. Οι απαντήσεις επιτρέπουν σε πολλούς αξιολογητές να συζητήσουν μια συγκεκριμένη σημείωση χωρίς να αφήσουν το έγγραφο, επιτρέποντας αδιάσπαστη, ενσωματωμένη συνεργασία. Αυτή η δυνατότητα μετατρέπει ένα στατικό PDF σε μια διαδραστική πλατφόρμα συζήτησης, διατηρώντας το πλαίσιο και τα αρχεία ελέγχου απευθείας μέσα στο αρχείο.
Προαπαιτούμενα: Προετοιμασία του Περιβάλλοντος
Πριν βουτήξουμε στον κώδικα, βεβαιωθείτε ότι ο σταθμός εργασίας σας πληροί τις παρακάτω προδιαγραφές:
- JDK 8 ή νεότερο (συνιστάται JDK 11 + για καλύτερη απόδοση συλλογής απορριμμάτων)
- Maven ή Gradle για διαχείριση εξαρτήσεων (τα παραδείγματα χρησιμοποιούν Maven)
- Ένα IDE με υποστήριξη Maven (IntelliJ IDEA, Eclipse ή VS Code)
- Τουλάχιστον 2 GB ελεύθερης μνήμης RAM για το IDE και τις δοκιμές
- Δείγμα αρχεία PDF για πειραματισμό (μπορείτε να δημιουργήσετε απλά PDFs με οποιονδήποτε επεξεργαστή PDF)
Το GroupDocs.Annotation λειτουργεί εξ ολοκλήρου εντός διεργασίας· δεν απαιτούνται εξωτερικοί προβολείς PDF ή εγγενείς βιβλιοθήκες.
Ρύθμιση του GroupDocs.Annotation για Java
Η ενσωμάτωση της βιβλιοθήκης είναι μια διαδικασία με λίγα βήματα, αλλά μερικές κρυφές παγίδες μπορούν να προκαλέσουν σφάλματα χρόνου εκτέλεσης αν τις παραλείψετε.
Διαμόρφωση Εξαρτήσεων Maven
Προσθέστε το αποθετήριο και την εξάρτηση στο pom.xml. Τοποθετήστε το στοιχείο <repositories> πριν το <dependencies> για να διασφαλίσετε ότι το Maven μπορεί να επιλύσει το artefact.
<repositories>
<repository>
<id>groupdocs-repo</id>
<url>https://repo.groupdocs.com/repo</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-annotation</artifactId>
<version>25.2</version>
</dependency>
</dependencies>
Συμβουλή: Ελέγξτε τη σελίδα εκδόσεων του GroupDocs για την τελευταία έκδοση. Οι νέες εκδόσεις συχνά περιλαμβάνουν υποστήριξη για νέες προδιαγραφές PDF και βελτιώσεις απόδοσης.
Ρύθμιση Άδειας (Μην το παραλείψετε!)
Το GroupDocs.Annotation απαιτεί αρχείο άδειας για χρήση σε παραγωγή. Χωρίς αυτό, κάθε παραγόμενο PDF θα περιέχει υδατογράφημα.
- Δωρεάν Δοκιμή – Πλήρες σύνολο λειτουργιών για 30 ημέρες, ιδανικό για αξιολόγηση.
- Προσωρινή Άδεια – Καλή για ανάπτυξη και εσωτερικές δοκιμές.
- Πλήρης Άδεια – Απαιτείται για οποιαδήποτε εμπορική ανάπτυξη.
Τοποθετήστε το αρχείο GroupDocs.Annotation.lic στο φάκελο resources και φορτώστε το κατά την εκκίνηση:
License license = new License();
license.setLicense("GroupDocs.Annotation.lic");
Συνηθισμένο πρόβλημα: Η παράλειψη του βήματος άδειας οδηγεί σε PDFs με υδατογράφημα και κλήσεις API που αποτυγχάνουν σιωπηρά. Πάντα επικυρώστε την άδεια νωρίς στη διαδικασία εκκίνησης.
Πλήρης Οδηγός Υλοποίησης: Προσθήκη Squiggly Annotations
Παρακάτω είναι ένας βήμα‑βήμα οδηγός που δείχνει πώς να create annotation reply java ενώ δημιουργείτε μια squiggly annotation. Κάθε βήμα περιλαμβάνει μια σύντομη εξήγηση, ώστε να κατανοήσετε το «γιατί» πίσω από κάθε γραμμή.
Βήμα 1: Εισαγωγή Όλων των Απαιτούμενων Κλάσεων
import com.groupdocs.annotation.Annotator;
import com.groupdocs.annotation.models.Point;
import com.groupdocs.annotation.models.annotation.SquigglyAnnotation;
import com.groupdocs.annotation.models.annotation.Reply;
import com.groupdocs.annotation.options.SaveOptions;
Annotatorείναι το σημείο εισόδου για όλες τις λειτουργίες σε επίπεδο εγγράφου.Pointαντιπροσωπεύει μια συντεταγμένη σε μια σελίδα (X και Y μετρημένα από την πάνω‑αριστερή γωνία).SquigglyAnnotationορίζει την κυματιστή υπογράμμιση που χρησιμοποιείται για επισήμανση σφαλμάτων.Replyαποθηκεύει νήματα σχολίων συνδεδεμένα σε ένα annotation.SaveOptionsσας επιτρέπει να ελέγχετε τη μορφή εξόδου και τη συμπίεση.
Βήμα 2: Δημιουργία και Διαμόρφωση της Squiggly Annotation
SquigglyAnnotation squiggly = new SquigglyAnnotation();
squiggly.setPageNumber(1);
squiggly.setColor(0xFFFF0000); // ARGB red
squiggly.setOpacity(0.7);
squiggly.setPoints(Arrays.asList(
new Point(100, 200),
new Point(300, 200)
));
Η SquigglyAnnotation είναι μια κλάση που δημιουργεί μια κυματιστή υπογράμμιση για την επισήμανση σφαλμάτων σε ένα PDF.
- Σύστημα συντεταγμένων: Τα σημεία ξεκινούν από την πάνω‑αριστερή γωνία. Τα δύο σημεία παραπάνω σχεδιάζουν μια οριζόντια κυματιστή γραμμή από (100, 200) έως (300, 200).
- Διαφάνεια 0.7 σημαίνει ότι το annotation είναι 70 % αδιαφανές, επιτρέποντας το κείμενο κάτω να παραμένει αναγνώσιμο.
Βήμα 3: Προσθήκη Διαδραστικών Απαντήσεων (Προαιρετικό αλλά Ισχυρό)
Reply reply1 = new Reply();
reply1.setComment("Please double‑check this clause.");
reply1.setAuthor("Alice");
reply1.setCreatedOn(new Date());
Reply reply2 = new Reply();
reply2.setComment("I think the wording is correct.");
reply2.setAuthor("Bob");
reply2.setCreatedOn(new Date());
squiggly.setReplies(Arrays.asList(reply1, reply2));
Η Reply είναι μια κλάση που αντιπροσωπεύει ένα νήμα σχολίων συνδεδεμένο σε ένα annotation.
- Οι απαντήσεις δημιουργούν μια νυμφική συζήτηση απευθείας στο annotation, αντικατοπτρίζοντας την εμπειρία των σύγχρονων αναθεωρητών PDF.
- Κάθε απάντηση αποθηκεύει πληροφορίες συγγραφέα και χρονική σήμανση, τις οποίες μπορείτε αργότερα να φιλτράρετε ή να εμφανίσετε σε UI.
Βήμα 4: Εφαρμογή Annotation και Αποθήκευση Εγγράφου
try (Annotator annotator = new Annotator("input.pdf")) {
annotator.add(squiggly);
SaveOptions options = new SaveOptions();
options.setOutputPath("output.pdf");
annotator.save(options);
}
- Η δομή try‑with‑resources κλείνει αυτόματα το
Annotator, απελευθερώνοντας χειριστές αρχείων και εγγενείς buffers. - Η
saveγράφει το τροποποιημένο PDF στοoutput.pdf.
Σημείωση μνήμης: Το
Annotatorφορτώνει μόνο τις σελίδες που επεξεργάζεστε. Για PDFs με εκατοντάδες σελίδες, αυτή η προσέγγιση διατηρεί τη χρήση heap κάτω από 150 MB σε έναν τυπικό διακομιστή.
Προχωρημένες Επιλογές Διαμόρφωσης
Προσαρμογή Εμφάνισης Annotation
Μπορείτε να ρυθμίσετε λεπτομερώς το οπτικό στυλ ώστε να ταιριάζει με τις οδηγίες της μάρκας σας:
squiggly.setBorderWidth(2);
squiggly.setColor(0xFF00FF00); // ARGB green
squiggly.setOpacity(0.5);
- Πλάτος περιγράμματος ελέγχει το πάχος της γραμμής (σε points).
- Μορφή ARGB περιλαμβάνει κανάλι άλφα για διαφάνεια.
Ακριβής Τοποθέτηση Annotations
Η σωστή λήψη των συντεταγμένων μπορεί να είναι δύσκολη σε PDFs με διαφορετικά μεγέθη σελίδας. Ακολουθήστε αυτή τη συστηματική προσέγγιση:
- Ανοίξτε το PDF σε έναν προβολέα (π.χ., Adobe Acrobat) και σημειώστε τις τιμές του χάρακα για την επιλεγμένη περιοχή.
- Μετατρέψτε τις τιμές του χάρακα σε points (1 point = 1/72 inch).
- Χρησιμοποιήστε
annotator.getPageInfo(pageIndex)για να λάβετε το πλάτος και το ύψος της σελίδας, και στη συνέχεια υπολογίστε τις σχετικές θέσεις.
Συνηθισμένα Προβλήματα και Λύσεις
Πρόβλημα: Τα Annotations Δεν Εμφανίζονται
Πιθανότερες αιτίες
- Τα σημεία βρίσκονται εκτός των ορίων της σελίδας
- Η άδεια δεν φορτώθηκε (το υδατογράφημα κρύβει το annotation)
- Λάθος αριθμός σελίδας (οι σελίδες είναι μηδενικής βάσης στο API)
Solution checklist
- Verify page dimensions with annotator.getPageInfo(pageIndex)
- Ensure all Point X/Y values are within [0, pageWidth] and [0, pageHeight]
- Confirm license file path and that license.setLicense() returns true
- Check that squiggly.setPageNumber(pageIndex) uses zero‑based indexing
Πρόβλημα: Κακή Απόδοση με Μεγάλα Αρχεία
Η φόρτωση ενός PDF 500 σελίδων στη μνήμη μπορεί να καθυστερήσει την υπηρεσία σας. Αντιμετωπίστε το με:
- Επεξεργασία μιας σελίδας τη φορά – ανοίξτε το έγγραφο, σχολιάστε μία σελίδα, αποθηκεύστε, και μετά προχωρήστε στην επόμενη.
- Streaming – χρησιμοποιήστε το streaming API του
Annotatorγια να αποφύγετε την πλήρη αποθήκευση του εγγράφου στη μνήμη. - Caching – αποθηκεύστε συχνά προσπελάσιμα PDFs σε γρήγορη κρυφή μνήμη (π.χ., Redis) και σχολιάστε το αντίγραφο στην κρυφή μνήμη.
Πρόβλημα: Οι Τιμές Χρώματος Δεν Λειτουργούν
Το GroupDocs αναμένει ARGB (Alpha, Red, Green, Blue) αντί για απλό RGB. Μια τιμή ARGB 0xFFFF0000 σημαίνει πλήρως αδιαφανές κόκκινο. Αν δώσετε 0xFF0000 η βιβλιοθήκη το ερμηνεύει λανθασμένα, με αποτέλεσμα ένα μαύρο annotation.
int argbRed = 0xFFFF0000; // Alpha=255, Red=255, Green=0, Blue=0
squiggly.setColor(argbRed);
Βέλτιστες Πρακτικές Απόδοσης
Διαχείριση Μνήμης
Κατά την επισήμανση δεκάδων PDFs σε μια εργασία δέσμης, τυλίξτε κάθε αρχείο σε το δικό του μπλοκ try‑with‑resources:
for (String filePath : pdfList) {
try (Annotator annotator = new Annotator(filePath)) {
// add annotations
annotator.save(new SaveOptions().setOutputPath(filePath.replace(".pdf", "_annotated.pdf")));
}
}
- Αυτό το μοτίβο εγγυάται ότι οι εγγενείς buffers απελευθερώνονται μετά από κάθε επανάληψη, αποτρέποντας OutOfMemoryError σε μακροχρόνιες διεργασίες.
Βελτιστοποίηση Επεξεργασίας Δέσμης
Για περιβάλλοντα υψηλής απόδοσης, εξετάστε παράλληλες ροές συνδυασμένες με περιορισμένο thread pool:
ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
pdfList.parallelStream().forEach(path -> executor.submit(() -> annotateDocument(path)));
executor.shutdown();
executor.awaitTermination(1, TimeUnit.HOURS);
- Περιορισμένο pool αποτρέπει την έκρηξη των νήματων, ενώ οι παράλληλες ροές κρατούν τους πυρήνες CPU απασχολημένους.
Σκέψεις για το Μέγεθος Αρχείου
Τα μεγάλα PDFs (> 100 MB) μπορούν να μειώσουν την απόδοση. Εφαρμόστε αυτές τις στρατηγικές:
- Προ‑συμπίεση του πηγαίου PDF με εργαλείο όπως το Ghostscript πριν την επισήμανση.
- Επισήμανση μόνο των απαραίτητων σελίδων – παραλείψτε τις σελίδες που δεν χρειάζονται σημειώσεις.
- Διαίρεση του εγγράφου σε λογικές ενότητες (π.χ., ανά κεφάλαιο) και επεξεργασία κάθε τμήματος ανεξάρτητα.
Πραγματικές Εφαρμογές
Συστήματα Ανασκόπησης Εγγράφων
Οι νομικές εταιρείες συχνά χρειάζονται να επισημάνουν προβληματικές ρήτρες. Οι squiggly annotations συνδυασμένες με νήματα απαντήσεων επιτρέπουν σε πολλούς δικηγόρους να συζητήσουν μια παράγραφο χωρίς να αφήσουν το PDF:
- Δικηγόρος A προσθέτει μια κόκκινη squiggly κάτω από μια ρήτρα και γράφει «Ασαφής διατύπωση».
- Δικηγόρος B απαντά «Προσθέστε ορισμό για ‘υλική παραβίαση’».
- Η ολόκληρη συζήτηση παραμένει ενσωματωμένη, αναζητήσιμη και ελεγκτή.
Ενσωμάτωση με Υπάρχοντα Συστήματα
Το GroupDocs.Annotation λειτουργεί ομαλά με δημοφιλή πλαίσια Java:
- Spring Boot – εκθέστε ένα REST endpoint
/api/annotateπου δέχεται ένα multipart upload PDF, προσθέτει annotations, και επιστρέφει το αποτέλεσμα σε ροή. - JSF – συνδέστε ενέργειες annotation με UI components για άμεση σήμανση σε web view.
- Microservices – το μικρό αποτύπωμα της βιβλιοθήκης (< 15 MB) σας επιτρέπει να το κοντεϊνεράρετε με Docker και να το κλιμακώσετε οριζόντια.
Αυτοματοποίηση Ροής Εργασίας
Συνδυάστε την επισήμανση με άλλα προϊόντα GroupDocs (π.χ., GroupDocs.Signature) για να δημιουργήσετε πλήρεις pipelines:
1. Upload contract → 2. Auto‑apply squiggly for missing signatures → 3. Add reviewer replies → 4. Route to signing service.
Πότε να Χρησιμοποιήσετε Squiggly Annotations έναντι Εναλλακτικών
| Περίπτωση Χρήσης | Συνιστώμενο annotation |
|---|---|
| Σήμανση ορθογραφικών ή γραμματικών λαθών | Squiggly – οπτική ένδειξη παρόμοια με επεξεργαστές κειμένου |
| Επισημάνωση σημαντικών τμημάτων χωρίς να υποδηλώνει σφάλμα | Highlight – διαφανές επικάλυμμα |
| Παροχή λεπτομερούς ανάδρασης | Text ή Comment – ελεύθερο πλαίσιο σημειώσεων |
| Έγκριση ή απόρριψη εγγράφου | Stamp – σήμα «Approved» ή «Rejected» |
Συμπέρασμα
Τώρα έχετε μια πλήρη, έτοιμη για παραγωγή συνταγή για create annotation reply java χρησιμοποιώντας το GroupDocs.Annotation. Με την κατάκτηση του API, τη διαχείριση της άδειας και την εφαρμογή των παραπάνω συμβουλών απόδοσης, μπορείτε να:
- Αυτοματοποιήσετε την επισήμανση σφαλμάτων σε χιλιάδες PDFs
- Ενεργοποιήσετε συνεργατικές, νυμφικές συζητήσεις μέσα στο ίδιο το αρχείο
- Διατηρήσετε τη χρήση μνήμης χαμηλή ακόμη και κατά την επεξεργασία τεράστιων εγγράφων
Επόμενα βήματα
- Πειραματιστείτε με άλλους τύπους annotation (highlights, stamps, text).
- Δημιουργήστε μια υπηρεσία REST που λαμβάνει PDFs, τα σχολιάζει, και επιστρέφει το αποτέλεσμα.
- Εξερευνήστε το API εξαγωγής (
annotator.get()) για να αντλήσετε υπάρχοντα σχόλια για αναλύσεις.
Η δύναμη της προγραμματιστικής επισήμανσης PDF έγκειται στην ικανότητά της να αντικαθιστά την επίπονη χειροκίνητη σήμανση με επαναλαμβανόμενο, ελεγκτό κώδικα. Είτε χτίζετε ένα εξειδικευμένο προϊόν legal‑tech είτε μια γενικής χρήσης μηχανή ροής εγγράφων, οι τεχνικές σε αυτόν τον οδηγό σας παρέχουν μια σταθερή βάση για να προχωρήσετε.
Συχνές Ερωτήσεις
Q: Τι κάνει το GroupDocs.Annotation καλύτερο από άλλες βιβλιοθήκες Java PDF;
A: Το GroupDocs.Annotation εστιάζει αποκλειστικά στις ροές εργασίας annotation, προσφέροντας πάνω από 30 τύπους annotation, νυμφικές απαντήσεις, και εγγενή υποστήριξη για 50 + μορφές αρχείων, διατηρώντας το αποτύπωμα μνήμης κάτω από 200 MB για PDFs 500 σελίδων.
Q: Μπορώ να χρησιμοποιήσω αυτή τη βιβλιοθήκη με εφαρμογές Spring Boot;
A: Απόλυτα. Δημιουργήστε ένα @RestController που ενσωματώνει την υπηρεσία Annotator, επεξεργάζεται multipart uploads, και επιστρέφει το σχολιασμένο PDF στον πελάτη. Θυμηθείτε να διαμορφώσετε ένα thread‑pool για ταυτόχρονες αιτήσεις.
Q: Πώς διαχειρίζομαι έγγραφα με διαφορετικά μεγέθη σελίδας;
A: Ερωτήστε τις διαστάσεις κάθε σελίδας μέσω annotator.getPageInfo(pageIndex) και υπολογίστε σχετικές συντεταγμένες (π.χ., ποσοστά) αντί για σκληρή κωδικοποίηση τιμών σε points. Αυτό εξασφαλίζει ότι τα annotations εμφανίζονται σωστά σε σελίδες A4, Letter και προσαρμοσμένου μεγέθους.
Q: Υπάρχει τρόπος να εξάγω υπάρχοντα annotations από PDFs;
A: Ναι. Καλέστε annotator.get() για να λάβετε μια συλλογή όλων των annotations, έπειτα επαναλάβετε για να διαβάσετε ιδιότητες όπως συγγραφέας, σχόλιο και γεωμετρία. Αυτό είναι χρήσιμο για μετανάστευση ή σενάρια ανάλυσης.
Q: Ποια είναι η καλύτερη προσέγγιση για τη διαχείριση δικαιωμάτων annotation σε συστήματα πολλαπλών χρηστών;
A: Εφαρμόστε έλεγχο ταυτότητας στο επίπεδο της εφαρμογής, αποθηκεύστε το ID χρήστη με κάθε Reply, και επιβάλετε επιχειρηματικούς κανόνες (π.χ., μόνο ο συγγραφέας ή ένας διαχειριστής μπορεί να επεξεργαστεί ή να διαγράψει μια απάντηση). Το API από μόνο του δεν επιβάλλει δικαιώματα, δίνοντάς σας πλήρη ευελιξία.
Q: Πώς βελτιστοποιώ τη χρήση μνήμης όταν επεξεργάζομαι εκατοντάδες PDFs;
A: Χρησιμοποιήστε try‑with‑resources για κάθε έγγραφο, επεξεργαστείτε τις σελίδες ξεχωριστά, και εξετάστε ένα περιορισμένο thread pool για να περιορίσετε την ταυτόχρονη κατανάλωση μνήμης. Η παρακολούθηση του heap της JVM με εργαλεία όπως το VisualVM σας βοηθά να ρυθμίσετε ακριβώς τη ρύθμιση -Xmx.
Last Updated: 2026-05-16
Tested With: GroupDocs.Annotation 25.2 for Java
Author: GroupDocs
Additional Resources
{< /blocks/products/pf/tutorial-page-section >} {< /blocks/products/pf/main-container >} {< /blocks/products/pf/main-wrap-class >} {< blocks/products/products-backtop-button >}
<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>
import com.groupdocs.annotation.Annotator;
// Initialize your annotator - this is your entry point to all annotation features
try (Annotator annotator = new Annotator("path/to/your/document.pdf")) {
// All your annotation magic happens here
System.out.println("Annotator initialized successfully!");
}
import com.groupdocs.annotation.Annotator;
import com.groupdocs.annotation.models.Point;
import com.groupdocs.annotation.models.Reply;
import com.groupdocs.annotation.models.annotationmodels.SquigglyAnnotation;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
// Create a new SquigglyAnnotation instance
SquigglyAnnotation squigglyAnnotation = new SquigglyAnnotation();
// Set the creation date of the annotation
squigglyAnnotation.setCreatedOn(new Date());
// Define font and background colors using RGB values
squigglyAnnotation.setFontColor(65535); // Yellow color in ARGB format
squigglyAnnotation.setBackgroundColor(16761035); // Light blue color in ARGB format
// Set a message to display with the annotation
squigglyAnnotation.setMessage("This is squiggly annotation");
// Define opacity (range 0.0 - 1.0)
squigglyAnnotation.setOpacity(0.7);
// Specify the page number for the annotation (zero-based index)
squigglyAnnotation.setPageNumber(0);
// Set squiggly line color specific to Word and PDF documents
squigglyAnnotation.setSquigglyColor(1422623); // Color code for squiggly lines
// Define points marking the start and end of the annotation on the page
List<Point> points = new ArrayList<>();
points.add(new Point(80, 730));
points.add(new Point(240, 730));
points.add(new Point(80, 650));
points.add(new Point(240, 650));
squigglyAnnotation.setPoints(points);
// Create replies to the annotation (optional)
Reply reply1 = new Reply();
reply1.setComment("First comment");
reply1.setRepliedOn(new Date());
Reply reply2 = new Reply();
reply2.setComment("Second comment");
reply2.setRepliedOn(new Date());
List<Reply> replies = new ArrayList<>();
replies.add(reply1);
replies.add(reply2);
// Associate replies with the annotation
squigglyAnnotation.setReplies(replies);
try (Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf")) {
// Add the prepared squiggly annotation to the document
annotator.add(squigglyAnnotation);
// Save the annotated document
annotator.save("YOUR_OUTPUT_DIRECTORY/result_squiggly_annotation.pdf");
}
// Custom color configurations
squigglyAnnotation.setFontColor(0xFF0000); // Red text
squigglyAnnotation.setBackgroundColor(0x00FF00); // Green background
squigglyAnnotation.setSquigglyColor(0x0000FF); // Blue squiggly line
// Transparency effects
squigglyAnnotation.setOpacity(0.3); // Very subtle
// or
squigglyAnnotation.setOpacity(0.9); // Almost opaque
// Verify your points are within page boundaries
System.out.println("Page dimensions: " + annotator.getPageInfo(0));
// Check if your points make sense
List<Point> points = squigglyAnnotation.getPoints();
for (Point point : points) {
System.out.println("Point: (" + point.getX() + ", " + point.getY() + ")");
}
// Wrong: RGB format
int wrongColor = 0xFF0000; // This might not work as expected
// Right: ARGB format
int rightColor = 0xFFFF0000; // Full opacity red
// Good practice: Use try-with-resources
try (Annotator annotator = new Annotator(inputPath)) {
// Process annotations
annotator.add(annotation);
annotator.save(outputPath);
} // Automatic cleanup happens here
// Avoid: Manual resource management
Annotator annotator = new Annotator(inputPath); // Resources might leak
public void processBatch(List<String> documentPaths) {
for (String path : documentPaths) {
try (Annotator annotator = new Annotator(path)) {
// Process each document independently
addAnnotations(annotator);
annotator.save(getOutputPath(path));
} catch (Exception e) {
// Handle individual document failures without stopping the batch
System.err.println("Failed to process: " + path + " - " + e.getMessage());
}
}
}
public class DocumentWorkflow {
public void reviewDocument(String documentPath, ReviewLevel level) {
try (Annotator annotator = new Annotator(documentPath)) {
switch (level) {
case GRAMMAR_CHECK:
addGrammarAnnotations(annotator);
break;
case LEGAL_REVIEW:
addLegalAnnotations(annotator);
break;
case FINAL_PROOF:
addProofreadingAnnotations(annotator);
break;
}
annotator.save(getReviewedPath(documentPath));
}
}
}