Java PDF Ok İşaretlemeleri - Tam Kılavuz & En İyi Uygulamalar (2025)
Giriş
PDF belgelerinin incelemeleri sırasında ekibinizin belirli bölümlere odaklanmasını sağlamakta zorlandınız mı? Yalnız değilsiniz. Teknik dokümantasyon, yasal sözleşmeler veya proje spesifikasyonları yönetiyor olun, tartışma için kesin alanları işaretlemek doğru araçlar olmadan can sıkıcı olabilir.
İşte çözüm: Java PDF ok işaretlemeleri GroupDocs.Annotation API kullanarak. Bu güçlü yaklaşım, PDF dosyalarına programlı olarak ok eklemenizi sağlar, iş birliğini sorunsuz ve profesyonel hâle getirir.
Bu kapsamlı rehberde, üretim ortamlarında gerçekten çalışan ok işaretlemelerini nasıl uygulayacağınızı keşfedeceksiniz. Temel kurulumdan ileri düzey özelleştirmeye, ayrıca karşılaşacağınız gerçek‑dünya senaryolarına (ve bunları nasıl yöneteceğinize) kadar her şeyi ele alacağız.
Bu kılavuzu farklı kılan nedir? Kurumsal uygulamalarda bunu uygulamış birinden pratik içgörüler alacaksınız; belgelerde bulunmayan tuzakları da öğreneceksiniz.
Hızlı Yanıtlar
- Hangi kütüphane Java’da PDF’ye ok eklememe izin verir? GroupDocs.Annotation for Java.
- Üretim için lisansa ihtiyacım var mı? Evet, ticari lisans su işaretlerini kaldırır.
- Hangi Java sürümü önerilir? JDK 11 en iyi performansı sunar.
- Tek bir belgede birden fazla ok ekleyebilir miyim? Kesinlikle – sadece birden fazla ArrowAnnotation nesnesi oluşturun.
- Toplu işleme destekleniyor mu? Evet, döngülerde belgeleri işleyin ve Annotator nesnelerini serbest bırakın.
PDF’ye ok eklemek nedir?
Ok işaretlemesi eklemek, bir PDF sayfasına programlı olarak yön gösteren bir işaretçi çizmektir. İnceleyenlerin bölümleri işaretlemesine, sorunları vurgulamasına veya okuyucuları bir iş akışı içinde yönlendirmesine yardımcı olur; dosyayı manuel olarak düzenlemeniz gerekmez.
Neden GroupDocs.Annotation’ı Java PDF Ok İşaretlemeleri İçin Seçmelisiniz?
Kodun içine dalmadan önce, odadaki fili ele alalım: neden GroupDocs, başka PDF işaretleme kütüphaneleri mevcutken tercih edilmeli?
Dürüst karşılaştırma:
- iText: Temel işaretlemeler için harika, ancak ok özelleştirmesi sınırlıdır
- PDFBox: Ücretsiz ve yetenekli, ancak daha fazla şablon kodu gerektirir
- GroupDocs.Annotation: Özellikler ve kullanım kolaylığı arasında en iyi denge (ticaridir)
GroupDocs, şu durumlarda öne çıkar:
- Tek bir projede birden fazla işaretleme türü
- Kurumsal düzeyde destek ve dokümantasyon
- Minimum kodla hızlı uygulama
- Yerleşik iş birliği özellikleri (yanıtlar gibi)
Dürüst uyarı: Ücretsiz değildir. Ancak zaman‑pazara çıkma süresinin önemli olduğu ticari bir uygulama geliştiriyorsanız, yatırım genellikle geliştirme süresindeki tasarrufla kendini amorti eder.
Ön Koşullar - Gerçekten İhtiyacınız Olanlar
Pratik olarak neye ihtiyacınız olduğunu netleştirelim. Çok fazla geliştiricinin doğru kurulum olmadan işe koyulup konfigürasyon sorunlarıyla saatler harcadığını gördüm.
Gerekli Kütüphaneler ve Bağımlılıklar
İlk olarak, Maven projenize GroupDocs.Annotation eklemeniz gerekir. İşte gerçekten çalışan yapılandırma (birçok projede test ettim):
<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 ipucu: Her zaman en yeni sürümü sürüm sayfasından kontrol edin. Bu yazı itibarıyla 25.2 sürümü güncel, ancak daha yeni sürümler genellikle önemli hata düzeltmeleri içerir.
Sorun Çıkarmaz Ortam Kurulumu
Sorunsuz bir geliştirme deneyimi için şunlara ihtiyacınız var:
- JDK 8 veya üzeri (daha iyi performans için JDK 11 öneririm)
- Maven 3.6+ (eski sürümler bazen bağımlılık çözümleme sorunları yaşar)
- IDE: IntelliJ IDEA veya Eclipse (VS Code da çalışır, ancak hata ayıklama özel Java IDE’leriyle daha kolaydır)
- Bellek: JVM’nizin büyük PDF’leri işlemek için en az 2 GB yığın alanına sahip olduğundan emin olun
Bilgi Ön Koşulları (Kendinize Dürüst Olun)
Şu konularda rahat olmalısınız:
- Temel Java programlama (koleksiyonlar, istisna yönetimi)
- Maven bağımlılık yönetimi
- Java’da dosya I/O işlemleri
Bu konularda yeniseniz sorun değil – sadece bu alanlara ekstra zaman ayırmanız gerekecek.
GroupDocs.Annotation Kurulumu - Doğru Yol
GroupDocs.Annotation’ı doğru şekilde kurmanın adımları, dokümantasyonun genellikle atladığı noktalar dahil.
Adım 1: Maven Yapılandırması (Sorun Giderme ile)
Yukarıdaki depoyu ve bağımlılığı ekleyin. Bağımlılık çözümleme sorunlarıyla karşılaşırsanız (bazen olur), pom.xml dosyanıza şunu eklemeyi deneyin:
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
Adım 2: Lisans Kurulumu (Üretim İçin Kritik)
Geliştirme ve test için:
// For evaluation purposes
License license = new License();
// license.setLicense("path/to/license.lic"); // Comment this out for trial
Gerçek kontrol: Deneme sürümü çıktınıza su işareti ekler. Üretim için, GroupDocs üzerinden uygun bir lisans almanız gerekir.
Adım 3: Temel Başlatma Deseni
Annotator’ı başlatmak için her zaman bu deseni kullanın:
Annotator annotator = null;
try {
annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf");
// Your annotation code here
} finally {
if (annotator != null) {
annotator.dispose();
}
}
Neden try‑finally bloğu? Şunu söyleyeyim – GroupDocs nesneleri, özellikle birden fazla belge işlediğinizde, bellek sızıntılarını önlemek için doğru şekilde serbest bırakılmalıdır.
Tam Uygulama Kılavuzu - Sıfırdan Üretime
Gerçek üretimde kullanabileceğiniz bir ok işaretleme uygulaması oluşturalım.
Ok İşaretlemelerinin Bağlamını Anlamak
Ok işaretlemeleri sadece süs değil – iletişim aracıdır. Belge iş akışlarında genellikle şu amaçlarla kullanılır:
- İnceleme geri bildirimi – “Bu bölümün revize edilmesi gerekiyor”
- Referans bağlantısı – “İlgili içeriği burada gör”
- Süreç rehberliği – “İncelemenize bu noktadan başlayın”
- Sorun vurgulama – “Bu alanda sorun tespit edildi”
Bağlamı anlamak, daha iyi işaretleme sistemleri tasarlamanıza yardımcı olur.
Adım 1: İşaretleme Yanıtları Oluşturma (Akıllı Yol)
Yanıtlar, işaretlemelerinizi etkileşimli hâle getirir. İşte anlamlı yanıtlar oluşturmanın yolu:
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());
List<Reply> replies = new ArrayList<>();
replies.add(reply1);
replies.add(reply2);
En iyi uygulama: İş birliği takibini iyileştirmek için yanıtlarınıza kullanıcı bilgilerini ekleyin. Üretimde bu bilgileri genellikle kullanıcı yönetim sisteminizden alırsınız.
Adım 2: Ok İşaretlemesi Oluşturma (Gerçek Dünya Koşullarıyla)
Her parametreye açıklama eklenmiş temel uygulama:
ArrowAnnotation arrow = new ArrowAnnotation();
arrow.setBox(new Rectangle(100, 100, 100, 100)); // Position and size
arrow.setCreatedOn(Calendar.getInstance().getTime()); // Creation time
arrow.setMessage("This is an arrow annotation"); // Annotation message
arrow.setOpacity(0.7); // Opacity level
arrow.setPageNumber(0); // Page number
arrow.setPenColor(65535); // ARGB pen color
arrow.setPenStyle(PenStyle.DOT); // Pen style
arrow.setPenWidth((byte) 3); // Arrow line width
arrow.setReplies(replies); // Attach replies
Zor kısımları birlikte inceleyelim:
- Dikdörtgen koordinatları: (x, y, genişlik, yükseklik) burada x,y sol‑üst köşedir
- PenColor: ARGB formatını kullanır. 65535 parlak mavidir. Özel renkler için çevrimiçi renk dönüştürücüleri kullanın
- PenStyle seçenekleri: DOT, DASH, SOLID, DASHDOT, DASHDOTDOT
- Opacity: 0.0 (şeffaf) ile 1.0 (opak) arasında. 0.7 genellikle görünürlük için mükemmeldir, rahatsız etmez
Adım 3: Ekleme ve Kaydetme (Hata Yönetimi ile)
Üretim‑hazır şekilde işaretlemeleri eklemenin yolu:
try {
annotator.add(arrow);
annotator.save("YOUR_OUTPUT_DIRECTORY/output.pdf");
System.out.println("Arrow annotation added successfully!");
} catch (Exception e) {
System.err.println("Failed to add annotation: " + e.getMessage());
// Log the full stack trace in production
e.printStackTrace();
} finally {
annotator.dispose();
}
Kritik nokta: Dosya işlemleri sırasında her zaman istisna yakalayın. PDF’ler bozulmuş olabilir, yollar geçersiz olabilir ve izinler sorun yaratabilir.
Yaygın Tuzaklar ve Nasıl Kaçınılır
Bu yöntemi birkaç projede uyguladıktan sonra en çok karşılaşılan sorunlar ve çözümleri:
Sorun 1: Koordinatlar Beklenen Konumla Eşleşmiyor
Problem: Ok PDF’de yanlış bir konumda görünüyor.
Çözüm: PDF koordinat sistemleri sol‑alt köşeden başlarken, çoğu işaretleme kütüphanesi sol‑üst köşeyi kullanır. GroupDocs bu dönüşümü yapar, ancak PDF’nizin özelliklerine göre ayarlama yapmanız gerekebilir.
// If arrows appear in wrong positions, try adjusting the Y coordinate
int adjustedY = pageHeight - originalY - annotationHeight;
arrow.setBox(new Rectangle(x, adjustedY, width, height));
Sorun 2: İşaretlemeler Kaydetme Sonrası Kayboluyor
Problem: İşaretlemeler işleme sırasında görünür, ancak son PDF’de yok.
Çözüm: Genellikle lisans sorunu olur. Lisansınızın doğru yüklendiğinden emin olun:
License license = new License();
try {
license.setLicense("GroupDocs.Annotation.lic");
} catch (Exception e) {
System.out.println("License not found, using trial mode");
}
Sorun 3: Toplu İşlemede Bellek Sızıntıları
Problem: Birden fazla belge işlediğinizde uygulama bellek yetersizliği yaşıyor.
Çözüm: Annotator nesnelerini her zaman serbest bırakın ve belgeleri partiler halinde işleyin:
for (String documentPath : documentPaths) {
Annotator annotator = null;
try {
annotator = new Annotator(documentPath);
// Process document
} finally {
if (annotator != null) {
annotator.dispose();
}
}
// Force garbage collection every 10 documents
if (processedCount % 10 == 0) {
System.gc();
}
}
Gelişmiş Özelleştirme Teknikleri
Dinamik Ok Konumlandırma
Etkileşimli uygulamalar için okları kullanıcı girdisine göre konumlandırmanız gerekebilir:
public ArrowAnnotation createArrowAt(int x, int y, String message) {
ArrowAnnotation arrow = new ArrowAnnotation();
// Create arrow pointing to specific coordinates
int arrowLength = 50;
arrow.setBox(new Rectangle(x - arrowLength, y - arrowLength, arrowLength, arrowLength));
arrow.setMessage(message);
arrow.setOpacity(0.8);
arrow.setPenColor(0xFF0000); // Red color
arrow.setPenStyle(PenStyle.SOLID);
arrow.setPenWidth((byte) 2);
return arrow;
}
Farklı Kullanım Durumları İçin Ok Stilini Belirleme
// Error highlighting (red, thick, solid)
public ArrowAnnotation createErrorArrow() {
ArrowAnnotation arrow = new ArrowAnnotation();
arrow.setPenColor(0xFF0000); // Red
arrow.setPenWidth((byte) 4);
arrow.setPenStyle(PenStyle.SOLID);
arrow.setOpacity(0.9);
return arrow;
}
// Suggestion arrows (blue, thin, dashed)
public ArrowAnnotation createSuggestionArrow() {
ArrowAnnotation arrow = new ArrowAnnotation();
arrow.setPenColor(0x0000FF); // Blue
arrow.setPenWidth((byte) 2);
arrow.setPenStyle(PenStyle.DASH);
arrow.setOpacity(0.6);
return arrow;
}
Gerçek Dünya Uygulama Senaryoları
Senaryo 1: Belge İnceleme Sistemi
Birden fazla kullanıcının geri bildirim ekleyebildiği bir sistem inşa ediyorsunuz:
public class DocumentReviewSystem {
public void addReviewArrow(String documentPath, int x, int y,
String reviewComment, String reviewerName) {
Annotator annotator = new Annotator(documentPath);
ArrowAnnotation arrow = new ArrowAnnotation();
arrow.setBox(new Rectangle(x, y, 50, 50));
arrow.setMessage("Review by " + reviewerName);
// Add reviewer's comment as reply
Reply review = new Reply();
review.setComment(reviewComment);
review.setUser(new User(reviewerName));
review.setRepliedOn(new Date());
arrow.setReplies(Arrays.asList(review));
annotator.add(arrow);
annotator.save(documentPath.replace(".pdf", "_reviewed.pdf"));
annotator.dispose();
}
}
Senaryo 2: Otomatik Sorun Tespiti
Analiz araçlarıyla entegrasyon yaparak potansiyel sorunları otomatik vurgulama:
public void highlightDetectedIssues(String documentPath, List<Issue> issues) {
Annotator annotator = new Annotator(documentPath);
for (Issue issue : issues) {
ArrowAnnotation arrow = createArrowForIssue(issue);
annotator.add(arrow);
}
annotator.save(documentPath.replace(".pdf", "_issues_highlighted.pdf"));
annotator.dispose();
}
private ArrowAnnotation createArrowForIssue(Issue issue) {
ArrowAnnotation arrow = new ArrowAnnotation();
arrow.setBox(new Rectangle(issue.getX(), issue.getY(), 40, 40));
arrow.setMessage("Issue detected: " + issue.getType());
// Color‑code by severity
switch (issue.getSeverity()) {
case HIGH:
arrow.setPenColor(0xFF0000); // Red
break;
case MEDIUM:
arrow.setPenColor(0xFFA500); // Orange
break;
case LOW:
arrow.setPenColor(0xFFFF00); // Yellow
break;
}
return arrow;
}
Performans Optimizasyon İpuçları
Bellek Yönetimi En İyi Uygulamaları
Büyük belgeler ya da çok sayıda dosya işlediğinizde:
- Use try‑with‑resources pattern (if your version supports it):
try (Annotator annotator = new Annotator(“document.pdf”)) { // Your annotation code } // Automatically disposed
2. **Process in batches**:
```java
public void processBatch(List<String> documents, int batchSize) {
for (int i = 0; i < documents.size(); i += batchSize) {
List<String> batch = documents.subList(i,
Math.min(i + batchSize, documents.size()));
processBatchInternal(batch);
// Allow GC between batches
System.gc();
Thread.sleep(100);
}
}
- Monitor memory usage:
Runtime runtime = Runtime.getRuntime(); long memoryBefore = runtime.totalMemory() - runtime.freeMemory();
// Your annotation processing
long memoryAfter = runtime.totalMemory() - runtime.freeMemory(); System.out.println(“Memory used: " + (memoryAfter - memoryBefore) + " bytes”);
### CPU Performans Düşünceleri
- Döngülerde gereksiz nesne oluşturmayı önleyin
- Mümkün olduğunda renk ve stil nesnelerini yeniden kullanın
- Bağımsız belgeler için paralel işleme düşünün (ancak bellek kullanımına dikkat edin)
## Sorun Giderme Kılavuzu - Gerçek Problemlere Çözümler
### Sorun: İşaretlemeler Adobe Reader'da Görünmüyor
**Belirtiler**: Uygulamanızda işaretlemeler görünür ama Adobe Reader ya da diğer PDF görüntüleyicilerde yok.
**Çözümler**:
1. PDF'yi doğru standartlarla kaydettiğinizden emin olun:
```java
// Try different save options if available
SaveOptions saveOptions = new SaveOptions();
saveOptions.setAnnotationType(AnnotationType.All);
annotator.save(outputPath, saveOptions);
- PDF sürüm uyumluluğunu kontrol edin – eski PDF sürümleri tüm işaretleme özelliklerini desteklemeyebilir.
Sorun: Büyük PDF’lerde Düşük Performans
Belirtiler: Büyük belgelerle uygulama yavaşlıyor ya da yanıt vermiyor.
Çözümler:
- Process pages individually instead of the entire document:
// Process specific pages LoadOptions loadOptions = new LoadOptions(); loadOptions.setLoadCharts(false); // Skip charts if not needed Annotator annotator = new Annotator(documentPath, loadOptions);
2. **Use streaming when possible** for very large files.
3. **Increase JVM heap size**:
```bash
java -Xmx4g -jar your-application.jar
Sorun: Renk İşleme Sorunları
Belirtiler: Son PDF’de renkler beklenenden farklı görünüyor.
Çözüm: Doğru renk uzayı tanımlamalarını kullanın:
// Use hex values for consistent colors
int red = 0xFFFF0000; // ARGB format
int blue = 0xFF0000FF;
int green = 0xFF00FF00;
// Or convert from RGB
public int rgbToArgb(int r, int g, int b) {
return (0xFF << 24) | (r << 16) | (g << 8) | b;
}
Uygulamanızı Test Etme
Ok İşaretlemeleri Birim Testi
Pratik bir test yapısı:
@Test
public void testArrowAnnotationCreation() {
// Arrange
String inputPath = "test-documents/sample.pdf";
String outputPath = "test-output/annotated.pdf";
// Act
Annotator annotator = new Annotator(inputPath);
ArrowAnnotation arrow = new ArrowAnnotation();
arrow.setBox(new Rectangle(100, 100, 50, 50));
arrow.setMessage("Test annotation");
annotator.add(arrow);
annotator.save(outputPath);
annotator.dispose();
// Assert
assertTrue("Output file should exist", new File(outputPath).exists());
// Verify annotation was added
Annotator verifyAnnotator = new Annotator(outputPath);
List<AnnotationInfo> annotations = verifyAnnotator.get();
assertEquals("Should have one annotation", 1, annotations.size());
verifyAnnotator.dispose();
}
Entegrasyon Testi
Farklı PDF tipleri ve boyutlarıyla test ederek uygulamanızın çeşitli senaryolarda çalıştığından emin olun.
Sonuç
Artık GroupDocs.Annotation kullanarak Java PDF ok işaretlemeleri uygulamak için eksiksiz bir araç setine sahipsiniz. Bu sadece PDF’lere ok eklemekten ibaret değil; üretimde gerçekten çalışan sağlam belge iş birliği özellikleri inşa etmek demektir.
Bu kılavuzdan ana çıkarımlar:
- Her zaman kaynakları doğru yönetin (try‑finally blokları kullanın)
- Çeşitli PDF tipleri ve boyutlarıyla test edin
- Toplu işleme için bellek yönetimini düşünün
- Üretim kullanımı için uygun hata yönetimini uygulayın
- İşaretlemeleri amaçlarına uygun şekilde stilize edin
Sonraki adımlarınız: Temel uygulama ile basit bir prototip oluşturun, ardından gereksinimleriniz geliştikçe dinamik konumlandırma ve özel stil gibi ileri özellikleri ekleyin.
Daha ileri gitmeye hazır mısınız? Metin işaretlemeleri, alan işaretlemeleri ve su işaretleri gibi diğer GroupDocs.Annotation özelliklerini keşfedin. Burada öğrendikleriniz tüm işaretleme türlerine uygulanabilir.
Sık Sorulan Sorular
S: Şifre‑korumalı PDF’lere ok işaretlemesi ekleyebilir miyim?
C: Evet, ancak Annotator oluştururken şifreyi sağlamanız gerekir:
LoadOptions loadOptions = new LoadOptions();
loadOptions.setPassword("your-password");
Annotator annotator = new Annotator("protected.pdf", loadOptions);
S: Birden fazla belgeyi verimli şekilde toplu işlemek nasıl yapılır?
C: Belgeleri küçük partiler halinde işleyin ve kaynakları doğru şekilde serbest bırakın:
for (String doc : documents) {
try (Annotator annotator = new Annotator(doc)) {
// Add annotations
annotator.save(doc.replace(".pdf", "_annotated.pdf"));
}
if (processedCount % 10 == 0) {
System.gc(); // Encourage garbage collection
}
}
S: Bir belgede maksimum kaç işaretleme olabilir?
C: GroupDocs’tan kesin bir sınır yoktur, ancak pratik limitler bellek, PDF görüntüleyici yetenekleri ve performans gereksinimlerine bağlıdır. 1000+ işaretleme için burada anlatılan performans‑optimizasyon tekniklerini uygulayın.
S: Standart seçeneklerin ötesinde ok şekillerini özelleştirebilir miyim?
C: GroupDocs.Annotation standart ok şekilleri sunar. Özel şekiller için alan işaretlemeleri kullanabilir, birden fazla basit işaretlemeyi birleştirebilir veya daha özel bir grafik kütüphanesine geçebilirsiniz.
S: Farklı PDF koordinat sistemleriyle nasıl başa çıkılır?
C: GroupDocs genellikle koordinat dönüşümünü otomatik yapar. Sorun yaşarsanız:
// Get page info for coordinate calculations
PageInfo pageInfo = annotator.getDocument().getPages().get(pageNumber);
int pageHeight = pageInfo.getHeight();
// Adjust Y coordinate if needed
int adjustedY = pageHeight - originalY;
S: Üretim kullanımı için lisans maliyeti nedir?
C: GroupDocs çeşitli lisans modelleri (Developer, Site, OEM) sunar. En güncel fiyatlar için GroupDocs fiyat sayfasını inceleyin.
S: Bu özelliği Spring Boot uygulamalarıyla nasıl entegre ederim?
C: İşaretleme işlemleri için bir servis sınıfı oluşturun:
@Service
public class AnnotationService {
public void addArrowAnnotation(String inputPath, String outputPath,
int x, int y, String message) {
try (Annotator annotator = new Annotator(inputPath)) {
ArrowAnnotation arrow = new ArrowAnnotation();
arrow.setBox(new Rectangle(x, y, 50, 50));
arrow.setMessage(message);
annotator.add(arrow);
annotator.save(outputPath);
}
}
}
S: PDF’lerden mevcut ok işaretlemelerini çıkarabilir miyim?
C: Evet, mevcut işaretlemeleri almak için get() metodunu kullanın:
Annotator annotator = new Annotator("document.pdf");
List<AnnotationInfo> annotations = annotator.get();
for (AnnotationInfo annotation : annotations) {
if (annotation instanceof ArrowAnnotation) {
ArrowAnnotation arrow = (ArrowAnnotation) annotation;
System.out.println("Arrow message: " + arrow.getMessage());
}
}
Ek Kaynaklar
- Documentation: GroupDocs.Annotation for Java Documentation
- API Reference: Complete API Reference
- Download Latest Version: GroupDocs Releases
- Purchase License: Buy GroupDocs License
- Free Trial: Download Free Trial
- Temporary License: Request Temporary License
- Community Support: GroupDocs Forum
- Professional Support: Paid licenses include priority assistance
Last Updated: 2026-02-21
Tested With: GroupDocs.Annotation 25.2 for Java
Author: GroupDocs