Εφαρμογή Υδατογράφημα σε Όλες τις Σελίδες – Οδηγός Υδατογραφήματος PDF σε Java
Σε αυτό το ολοκληρωμένο tutorial θα μάθετε πώς να εφαρμόζετε υδατογράφημα σε όλες τις σελίδες σε ένα έγγραφο PDF χρησιμοποιώντας Java και GroupDocs.Annotation. Είτε χρειάζεστε να προστατεύσετε εμπιστευτικές αναφορές, να προωθήσετε PDFs μάρκετινγκ, ή να προσθέσετε μια σήμανση «CONFIDENTIAL» σε ολόκληρο το αρχείο, τα παρακάτω βήματα σας καθοδηγούν από τη ρύθμιση του Maven μέχρι την προχωρημένη προσαρμογή—ώστε να υλοποιήσετε μια αξιόπιστη λύση σε λίγα λεπτά.
Γρήγορες Απαντήσεις
- Ποια βιβλιοθήκη μπορεί να προσθέσει υδατογράφημα PDF σε πολλές σελίδες σε Java; GroupDocs.Annotation for Java.
- Χρειάζομαι άδεια; Ναι, μια δωρεάν δοκιμή λειτουργεί για ανάπτυξη· απαιτείται πλήρης άδεια για παραγωγή.
- Μπορώ να βάλω υδατογράφημα σε όλες τις σελίδες ταυτόχρονα; Ναι – δημιουργήστε μια σημείωση υδατογραφήματος για κάθε σελίδα σε βρόχο.
- Ποια έκδοση Java απαιτείται; JDK 8+ (συνιστάται JDK 11+).
- Πώς ελέγχω τη διαφάνεια; Χρησιμοποιήστε
setOpacity(double)όπου 0.0 είναι πλήρως διαφανές και 1.0 πλήρως αδιαφανές.
Γιατί Χρειάζεστε Υδατογραφήματα PDF (Και Πώς η Java το Κάνει Εύκολο)
Έχετε ποτέ ανησυχηθεί ότι ένα εμπιστευτικό PDF μπορεί να διανεμηθεί χωρίς την άδειά σας; Ή χρειάζεστε έναν γρήγορο τρόπο να προσαρμόσετε κάθε σελίδα ενός φυλλαδίου πωλήσεων; Η προσθήκη υδατογραφημάτων προγραμματιστικά εξαλείφει την χειροκίνητη εργασία, εγγυάται τη συνέπεια και ενισχύει την ασφάλεια του εγγράφου. Με τη Java και το GroupDocs.Annotation—μία από τις πιο ισχυρές βιβλιοθήκες java add watermark pdf—αποκτάτε λεπτομερή έλεγχο της τοποθέτησης, περιστροφής, χρώματος και διαφάνειας, ενώ διαχειρίζεστε μεγάλα αρχεία αποδοτικά.
Τι θα κατακτήσετε μέχρι το τέλος αυτού του οδηγού:
- Ρύθμιση του GroupDocs.Annotation για υδατογραφήματα Java
- Δημιουργία προσαρμοσμένων σημειώσεων υδατογραφήματος που εφαρμόζονται σε όλες τις σελίδες
- Διαχείριση μεγάλων PDF χωρίς εξάντληση μνήμης
- Επίλυση κοινών προβλημάτων και βελτιστοποίηση απόδοσης
Τι είναι ένα Υδατογράφημα PDF και γιατί να το χρησιμοποιήσετε σε Πολλές Σελίδες;
Ένα υδατογράφημα PDF είναι μια επικάλυψη που εμφανίζεται πάνω από το περιεχόμενο του εγγράφου χωρίς να τροποποιεί το υποκείμενο κείμενο ή τις εικόνες. Η εφαρμογή υδατογραφήματος σε όλες τις σελίδες εξασφαλίζει ότι κάθε σελίδα φέρει το ίδιο branding ή την ειδοποίηση εμπιστευτικότητας, αποτρέποντας τυχαία διανομή σελίδων χωρίς σήμανση.
Προαπαιτούμενα
Απαραίτητα Απαιτούμενα
- Περιβάλλον Java: JDK 8 ή νεότερο (συνιστάται JDK 11+), Maven 3.6+, οποιοδήποτε IDE (IntelliJ, Eclipse, VS Code).
- Προαπαιτούμενες Γνώσεις: Βασική σύνταξη Java, I/O αρχείων, διαχείριση εξαρτήσεων Maven.
- Δικαιώματα Έργου: Πρόσβαση εγγραφής στον φάκελο εξόδου και επαρκής RAM για μεγάλα PDF (≥ 4 GB συνιστάται για αρχεία > 200 σελίδων).
Ρύθμιση του Περιβάλλοντος Υδατογραφήματος PDF σε Java
Προσθήκη του GroupDocs.Annotation στο Έργο σας
Αρχικά, προσθέστε το Maven artifact του GroupDocs.Annotation. Αυτή η εξάρτηση φέρνει όλα τα απαιτούμενα binaries και τις διαμεταβιβαστικές βιβλιοθήκες.
Ορισμός: Το στοιχείο Maven <dependency> δηλώνει τη βιβλιοθήκη GroupDocs.Annotation για το έργο σας, επιτρέποντας στον μεταγλωττιστή να εντοπίσει τα αρχεία JAR κατά τη διάρκεια της κατασκευής.
<!-- Maven dependency for GroupDocs.Annotation -->
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-annotation</artifactId>
<version>25.2</version>
</dependency>
<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>
Συμβουλή: Χρησιμοποιείτε πάντα την πιο πρόσφατη έκδοση (το παράδειγμα δείχνει 25.2, η πιο πρόσφατη μέχρι το 2025) για να επωφεληθείτε από διορθώσεις σφαλμάτων και βελτιώσεις απόδοσης.
Απόκτηση Άδειας
Χρειάζεστε έγκυρη άδεια για παραγωγικές εγκαταστάσεις. Επιλέξτε την επιλογή που ταιριάζει στο χρονοδιάγραμμά σας:
- Δωρεάν Δοκιμή: Ιδανική για ανάπτυξη και δοκιμές. Κατεβάστε από GroupDocs Downloads
- Προσωρινή Άδεια: Πλήρες σύνολο λειτουργιών για αξιολόγηση. Αποκτήστε την από τη Temporary License Page
- Πλήρης Άδεια: Απαιτείται για εμπορική χρήση. Αγοράστε μέσω της GroupDocs Purchase Page
Βασική Ρύθμιση που Λειτουργεί Πραγματικά
Μετά την προσθήκη της εξάρτησης και την απόκτηση του αρχείου άδειας, αρχικοποιήστε το αντικείμενο Annotator. Αυτό το αντικείμενο φορτώνει το PDF στη μνήμη και παρέχει το API για δημιουργία σημειώσεων.
Ορισμός: Annotator είναι το κύριο σημείο εισόδου του GroupDocs.Annotation· διαχειρίζεται τη φόρτωση PDF, τη δημιουργία σημειώσεων και την αποθήκευση.
// Initialize Annotator with a license and input PDF
Annotator annotator = new Annotator("input.pdf", "GroupDocs.Annotation.lic");
import com.groupdocs.annotation.Annotator;
public class WatermarkSetup {
public static void main(String[] args) {
String inputFilePath = "YOUR_DOCUMENT_DIRECTORY/input.pdf";
Annotator annotator = new Annotator(inputFilePath);
// Your watermark code goes here...
// Always remember to dispose!
annotator.dispose();
}
}
Κοινό λάθος προς αποφυγή: Να ξεχάσετε να καλέσετε annotator.dispose() μετά την επεξεργασία· αυτό μπορεί να προκαλέσει διαρροές μνήμης, ειδικά όταν διαχειρίζεστε πολλά έγγραφα σε παρτίδα.
Πώς να Εφαρμόσετε Υδατογράφημα σε Όλες τις Σελίδες σε Java
Για να εφαρμόσετε υδατογράφημα σε κάθε σελίδα, δημιουργείτε ένα WatermarkAnnotation, ορίζετε τις οπτικές του ιδιότητες, και στη συνέχεια προσθέτετε ένα ξεχωριστό αντίγραφο αυτής της σημείωσης σε κάθε σελίδα μέσα σε βρόχο. Ο βρόχος χρησιμοποιεί τον αριθμό σελίδων του εγγράφου, ορίζει τον σωστό αριθμό σελίδας και τέλος αποθηκεύει το τροποποιημένο PDF.
Κατανόηση των Υδατογραφημάτων Σημειώσεων
Ένα WatermarkAnnotation αντιπροσωπεύει μια επικάλυψη που μπορεί να περιέχει κείμενο, προσαρμοσμένα χρώματα, περιστροφή και διαφάνεια. Σε αντίθεση με μια απλή προσθήκη κειμένου, αποθηκεύεται ως σημείωση, καθιστώντας το δυνατόν να αφαιρεθεί ή να επεξεργαστεί αργότερα.
Ορισμός: WatermarkAnnotation είναι μια κλάση στο GroupDocs.Annotation που περιλαμβάνει όλες τις οπτικές ιδιότητες μιας επικάλυψης υδατογραφήματος.
WatermarkAnnotation watermark = new WatermarkAnnotation();
import com.groupdocs.annotation.Annotator;
import com.groupdocs.annotation.models.Reply;
import com.groupdocs.annotation.models.Rectangle;
import com.groupdocs.annotation.models.annotationmodels.WatermarkAnnotation;
import java.util.ArrayList;
import java.util.Calendar;
Βήμα 1: Εισαγωγή των Απαιτούμενων Κλάσεων
Πριν χρησιμοποιήσετε το API, εισάγετε τις απαραίτητες κλάσεις.
Ορισμός: Οι δηλώσεις import φέρνουν τις απαραίτητες κλάσεις του GroupDocs.Annotation στο τρέχον αρχείο Java, επιτρέποντάς σας να τις αναφέρετε χωρίς πλήρη ονομασία.
import com.groupdocs.annotation.Annotator;
import com.groupdocs.annotation.models.annotation.WatermarkAnnotation;
import com.groupdocs.annotation.models.common.Rectangle;
import com.groupdocs.annotation.models.annotation.Reply;
String inputFilePath = "YOUR_DOCUMENT_DIRECTORY/input.pdf";
String outputPath = "YOUR_OUTPUT_DIRECTORY/AddWatermarkAnnotation.pdf";
final Annotator annotator = new Annotator(inputFilePath);
Βήμα 2: Φόρτωση του PDF Εγγράφου
Δημιουργήστε το αντικείμενο Annotator που δείχνει στο πηγαίο PDF.
Ορισμός: Ο κατασκευαστής Annotator φορτώνει το αρχείο PDF σε ένα διαχειρίσιμο αντικείμενο, προετοιμάζοντάς το για λειτουργίες σημειώσεων.
Annotator annotator = new Annotator("sample.pdf");
Reply reply1 = new Reply();
reply1.setComment("First comment");
reply1.setRepliedOn(Calendar.getInstance().getTime());
Reply reply2 = new Reply();
reply2.setComment("Second comment");
reply2.setRepliedOn(Calendar.getInstance().getTime());
Συμβουλή: Για PDF μεγαλύτερα από 50 MB, εξετάστε την αύξηση του heap της JVM (
-Xmx4g) και την επεξεργασία αρχείων διαδοχικά για να διατηρήσετε τη χρήση μνήμης χαμηλή.
Βήμα 3: (Προαιρετικό) Προετοιμασία Μεταδεδομένων Απάντησης
Εάν χρειάζεται να επισυνάψετε σχόλια ή σημειώσεις έγκρισης στο υδατογράφημα, δημιουργήστε ένα αντικείμενο Reply.
Ορισμός: Reply αποθηκεύει σχόλια χρήστη που συνοδεύουν μια σημείωση, χρήσιμο για ίχνη ελέγχου.
Reply reply = new Reply();
reply.setComment("Confidential – Internal Use Only");
ArrayList<Reply> replies = new ArrayList<>();
replies.add(reply1);
replies.add(reply2);
WatermarkAnnotation watermark = new WatermarkAnnotation();
watermark.setAngle(75.0); // Set the angle of the watermark.
watermark.setBox(new Rectangle(200, 200, 100, 50)); // Define position and size with a rectangle.
watermark.setCreatedOn(Calendar.getInstance().getTime());
watermark.setText("Watermark");
watermark.setFontColor(65535); // Yellow color in ARGB format
watermark.setFontSize(12.0);
watermark.setMessage("This is a watermark annotation");
watermark.setOpacity(0.7);
watermark.setPageNumber(0);
watermark.setReplies(replies);
Βήμα 4: Διαμόρφωση της Εμφάνισης του Υδατογραφήματος
Ορίστε τις οπτικές ιδιότητες όπως κείμενο, χρώμα, περιστροφή, μέγεθος και διαφάνεια.
Ορισμός: Οι παρακάτω μέθοδοι setter προσαρμόζουν την εμφάνιση και τη θέση του υδατογραφήματος σε κάθε σελίδα.
watermark.setText("CONFIDENTIAL");
watermark.setAngle(75.0); // Diagonal orientation
watermark.setBox(new Rectangle(200, 200, 300, 100)); // Position & size
watermark.setFontColor(65535); // Yellow (ARGB)
watermark.setOpacity(0.7); // 70% opacity
watermark.setReply(reply); // Attach the optional reply
annotator.add(watermark);
annotator.save(outputPath);
annotator.dispose();
Βήμα 5: Βρόχος σε Όλες τις Σελίδες και Εφαρμογή του Υδατογραφήματος
Για εφαρμογή υδατογραφήματος σε όλες τις σελίδες, επαναλάβετε τον αριθμό σελίδων του εγγράφου και αναθέστε τη σημείωση σε κάθε σελίδα.
Ορισμός: annotator.getPageCount() επιστρέφει το συνολικό αριθμό σελίδων, επιτρέποντας έναν βρόχο που δημιουργεί ξεχωριστό WatermarkAnnotation ανά σελίδα.
int pageCount = annotator.getPageCount();
for (int i = 0; i < pageCount; i++) {
WatermarkAnnotation pageWatermark = watermark.clone(); // Duplicate settings
pageWatermark.setPageNumber(i); // Zero‑based index
annotator.add(pageWatermark); // Add to current page
}
// Get total page count first
int pageCount = annotator.getDocument().getPages().size();
for (int i = 0; i < pageCount; i++) {
WatermarkAnnotation watermark = new WatermarkAnnotation();
// Reuse the same configuration or customize per page
watermark.setAngle(45.0);
watermark.setText("CONFIDENTIAL");
watermark.setFontColor(16711680); // Red
watermark.setOpacity(0.3);
watermark.setFontSize(24.0);
watermark.setBox(new Rectangle(100, 300, 400, 100));
watermark.setPageNumber(i);
annotator.add(watermark);
}
annotator.save(outputPath);
annotator.dispose();
Βήμα 6: Αποθήκευση του Υδατογραφημένου PDF
Τέλος, γράψτε τις αλλαγές σε νέο αρχείο. Το αρχικό PDF παραμένει αμετάβλητο.
Ορισμός: annotator.save("output.pdf") αποθηκεύει όλες τις προστιθέμενες σημειώσεις σε νέο αρχείο PDF.
annotator.save("output_watermarked.pdf");
annotator.dispose(); // Release resources
// Better error handling approach
try {
File inputFile = new File(inputFilePath);
if (!inputFile.exists()) {
throw new FileNotFoundException("Input PDF not found: " + inputFilePath);
}
Annotator annotator = new Annotator(inputFilePath);
// ... your watermark code
} catch (Exception e) {
System.err.println("Error processing PDF: " + e.getMessage());
}
Αυτή είναι η πλήρης ροή για εφαρμογή υδατογραφήματος σε όλες τις σελίδες χρησιμοποιώντας το GroupDocs.Annotation για Java.
Συνηθισμένα Προβλήματα και Πώς να Τα Διορθώσετε
Σφάλματα «Αρχείο Δεν Βρέθηκε»
// Example of handling missing file paths
File inputFile = new File("nonexistent.pdf");
if (!inputFile.exists()) {
throw new IllegalArgumentException("Input PDF not found at: " + inputFile.getAbsolutePath());
}
WatermarkAnnotation confidentialWatermark = new WatermarkAnnotation();
confidentialWatermark.setAngle(45.0);
confidentialWatermark.setText("CONFIDENTIAL");
confidentialWatermark.setFontColor(16711680); // Red
confidentialWatermark.setOpacity(0.3); // Subtle but visible
confidentialWatermark.setFontSize(24.0);
confidentialWatermark.setBox(new Rectangle(100, 300, 400, 100));
- Επαληθεύστε τις απόλυτες διαδρομές και βεβαιωθείτε ότι το αρχείο υπάρχει.
- Ελέγξτε τα δικαιώματα ανάγνωσης/εγγραφής και στους φακέλους εισόδου και εξόδου.
- Δημιουργήστε τον φάκελο εξόδου εκ των προτέρων εάν δεν υπάρχει.
Προβλήματα Μνήμης με Μεγάλα PDF
- Πάντα καλέστε
annotator.dispose()μετά την επεξεργασία. - Επεξεργαστείτε τα PDF ένα‑ένα· αποφύγετε παράλληλα streams εκτός εάν η βιβλιοθήκη είναι αποδεδειγμένα thread‑safe.
- Αυξήστε το heap της JVM (
-Xmx4gή μεγαλύτερο) για αρχεία που ξεπερνούν τις 200 σελίδες.
Η Τοποθέτηση του Υδατογραφήματος Δεν Είναι Όπως Αναμένεται
- Το σημείο προέλευσης των συντεταγμένων PDF είναι κάτω‑αριστερά· προσαρμόστε τις τιμές του
Rectangleανάλογα. - Δοκιμάστε με διαφορετικά μεγέθη σελίδας (A4 vs. Letter) επειδή οι διαστάσεις επηρεάζουν τη θέση.
- Χρησιμοποιήστε
setOpacity(0.5)εάν το υδατογράφημα φαίνεται πολύ αχνό σε φόντο υψηλής αντίθεσης.
Προβλήματα Χρώματος Γραμματοσειράς
Το GroupDocs.Annotation αναμένει τιμές ARGB ακέραιους. Συνηθισμένα χρώματα:
- Κόκκινο:
16711680 - Μπλε:
255 - Πράσινο:
65280 - Μαύρο:
0 - Άσπρο:
16777215 - Κίτρινο:
65535(χρησιμοποιείται στο παράδειγμα)
Πραγματικές Περιπτώσεις Χρήσης Υδατογραφημάτων PDF σε Java
Προστασία Επαγγελματικών Εγγράφων
// Apply a corporate logo watermark across all pages of a contract
watermark.setText("© Acme Corp – Confidential");
WatermarkAnnotation brandWatermark = new WatermarkAnnotation();
brandWatermark.setText("© YourCompany 2025");
brandWatermark.setFontColor(0); // Black
brandWatermark.setOpacity(0.6);
brandWatermark.setFontSize(10.0);
brandWatermark.setBox(new Rectangle(400, 50, 150, 30));
Branding Υλικών Μάρκετινγκ
// Use a semi‑transparent brand slogan as a watermark
watermark.setText("Acme Marketing 2026");
watermark.setOpacity(0.4);
WatermarkAnnotation versionWatermark = new WatermarkAnnotation();
versionWatermark.setText("DRAFT - v2.1");
versionWatermark.setFontColor(255); // Blue
versionWatermark.setOpacity(0.8);
versionWatermark.setBox(new Rectangle(50, 750, 100, 30));
Έλεγχος Εκδόσεων για Έγγραφα
// Append version number dynamically
watermark.setText("Version 3.2 – Reviewed");
public void processMultiplePDFs(List<String> pdfPaths) {
for (String path : pdfPaths) {
Annotator annotator = null;
try {
annotator = new Annotator(path);
// Add your watermark logic here
annotator.save(path.replace(".pdf", "_watermarked.pdf"));
} finally {
if (annotator != null) {
annotator.dispose(); // Always dispose, even if exceptions occur
}
}
}
}
Συμβουλές Βελτιστοποίησης Απόδοσης
Καλές Πρακτικές Διαχείρισης Μνήμης
// Explicitly release resources after each document
annotator.dispose();
System.gc(); // Hint to the JVM (optional)
public class WatermarkTemplates {
public static WatermarkAnnotation createConfidentialWatermark() {
WatermarkAnnotation watermark = new WatermarkAnnotation();
watermark.setAngle(45.0);
watermark.setText("CONFIDENTIAL");
watermark.setFontColor(16711680);
watermark.setOpacity(0.3);
watermark.setFontSize(24.0);
return watermark;
}
public static WatermarkAnnotation createBrandWatermark(String companyName) {
WatermarkAnnotation watermark = new WatermarkAnnotation();
watermark.setText("© " + companyName + " 2025");
watermark.setFontColor(0);
watermark.setOpacity(0.6);
watermark.setFontSize(10.0);
return watermark;
}
}
- Επεξεργαστείτε τα έγγραφα διαδοχικά για να διατηρήσετε το αποτύπωμα heap χαμηλό.
- Χρησιμοποιήστε ένδειξη προόδου για εργασίες παρτίδας ώστε να παρακολουθείτε τη χρήση μνήμης.
- Αποφύγετε τη φόρτωση ολόκληρου του PDF στη μνήμη όταν χρειάζεται υδατογράφημα μόνο σε υποσύνολο σελίδων· η βιβλιοθήκη υποστηρίζει φόρτωση ανά σελίδα.
Συμβουλές Οργάνωσης Κώδικα
- Απομονώστε τη δημιουργία υδατογραφήματος σε μια βοηθητική μέθοδο:
createWatermark(String text, double opacity, int angle). - Διατηρήστε τη διαμόρφωση (χρώματα, γραμματοσειρές, διαφάνεια) εξωτερική σε αρχείο properties για εύκολη ρύθμιση σε διαφορετικά περιβάλλοντα.
Συχνές Ερωτήσεις
Ε: Πώς προσθέτω υδατογραφήματα σε πολλές σελίδες ενός PDF;
Α: Επαναλάβετε τον αριθμό σελίδων του εγγράφου, κλωνοποιήστε ένα διαμορφωμένο WatermarkAnnotation για κάθε σελίδα, ορίστε setPageNumber(i) και προσθέστε το με annotator.add().
Ε: Μπορώ να χρησιμοποιήσω προσαρμοσμένες γραμματοσειρές για τα υδατογραφήματά μου;
Α: Το GroupDocs.Annotation χρησιμοποιεί γραμματοσειρές που είναι εγκατεστημένες στο λειτουργικό σύστημα του κεντρικού υπολογιστή. Καθορίστε μια οικογένεια γραμματοσειρών που υπάρχει στον διακομιστή· η βιβλιοθήκη επιστρέφει σε προεπιλογή εάν η γραμματοσειρά δεν βρεθεί.
Ε: Ποια ρύθμιση διαφάνειας είναι η καλύτερη για επαγγελματικά υδατογραφήματα;
Α: Μεταξύ 0.3 και 0.7 παρέχει ισορροπία—αρκετά ορατό για να παρατηρηθεί, αλλά επιτρέπει την ανάγνωση του υποκείμενου περιεχομένου.
Ε: Πώς πρέπει να διαχειριστώ πολύ μεγάλα αρχεία PDF;
Α: Αυξήστε το heap της JVM (-Xmx4g ή περισσότερο), επεξεργαστείτε τα αρχεία ένα‑ένα, και πάντα καλέστε dispose() μετά από κάθε έγγραφο για να ελευθερώσετε τους εγγενείς πόρους.
Ε: Είναι δυνατόν να αφαιρέσετε ή να τροποποιήσετε υπάρχοντα υδατογραφήματα;
Α: Ναι—ανακτήστε τις σημειώσεις με annotator.get(), φιλτράρετε για WatermarkAnnotation, έπειτα επεξεργαστείτε ή διαγράψτε όπως χρειάζεται:
List<AnnotationBase> watermarks = annotator.get().stream()
.filter(a -> a instanceof WatermarkAnnotation)
.collect(Collectors.toList());
annotator.delete(watermarks.get(0)); // Example: delete first watermark
// Get existing annotations
List<AnnotationBase> annotations = annotator.get();
// Filter and modify as needed
Πρόσθετοι Πόροι
- Τεκμηρίωση: GroupDocs Annotation Java Docs
- Πλήρης Αναφορά API: GroupDocs Annotation Java API
- Λήψη Τελευταίας Έκδοσης: GroupDocs Downloads
- Εμπορική Άδεια: Purchase GroupDocs
- Υποστήριξη Κοινότητας: GroupDocs Forums
Τελευταία Ενημέρωση: 2026-07-30
Δοκιμάστηκε Με: GroupDocs.Annotation 25.2
Συγγραφέας: GroupDocs