Java pdf ok ek açıklamaları – eksiksiz öğretici ve en iyi uygulamalar (2025)

Giriş

PDF belgelerinin incelemeleri sırasında ekibinizin belirli bölümlere odaklanmasını sağlamakta zorlandınız mı? Tek başınıza 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 hayal kırıklığı yaratabilir.

İşte çözüm: GroupDocs.Annotation API kullanarak Java PDF ok ek açıklamaları. Bu güçlü yaklaşım, add arrow to pdf dosyalarına programatik olarak ok eklemenizi sağlar, iş birliğini sorunsuz ve profesyonel hâle getirir. Deneme sürümünü GroupDocs geçici‑lisans sayfasından alabilirsiniz.

Hızlı cevaplar

  • Java’da pdf’ye ok eklemek için hangi kütüphane? GroupDocs.Annotation for Java.
  • Üretim için lisansa ihtiyacım var mı? Evet, ticari lisans su işaretlerini kaldırır ve tam özellik setini açar. Ayrıntılar için GroupDocs pricing page sayfasına bakın.
  • Hangi Java sürümü önerilir? JDK 11 en iyi performansı ve uzun vadeli desteği sunar.
  • Tek bir belgede birden fazla ok ekleyebilir miyim? Kesinlikle – sadece birden fazla ArrowAnnotation nesnesi oluşturup aynı Annotator içine ekleyin.
  • Toplu işleme destekleniyor mu? Evet, belgeler arasında döngü kurabilir ve uygun şekilde imha ettikten sonra aynı Annotator örneğini yeniden kullanabilirsiniz.

PDF’ye ok ekleme nedir?

add arrow to pdf işlemi, belirli bir bölgeyi vurgulamak veya işaretlemek için PDF sayfasına yönlü bir işaretçi çizer. Ok ek açıklamaları PDF nesneleri olarak saklanır, bu yüzden standart‑uyumlu herhangi bir görüntüleyicide görünür ve daha sonra düzenlenebilir veya yanıtlanabilir.

Neden GroupDocs.Annotation’ı Java PDF ok ek açıklamaları için seçmelisiniz?

GroupDocs.Annotation, zengin bir ek açıklama tipi seti, kurumsal‑düzey destek ve tekrarlayan kodu azaltan basit bir Java API sunar. Alternatiflerle karşılaştırıldığında 50+ giriş ve çıkış formatı işleyebilir ve 500‑sayfalık PDF’leri 200 MB altında yığın belleği ile işleyebilir; bu, akış mimarisi sayesinde mümkün olur.

Önkoşullar - aslında ihtiyacınız olanlar

Gerekli kütüphaneler ve bağımlılıklar

İlk olarak, GroupDocs.Annotation Maven bağımlılığını ekleyin. Aşağıdaki snippet tam olarak ihtiyacınız olan koordinatları gösterir; sürüm yer tutucusunu en son kararlı sürümle değiştirin.

<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: En yeni sürüm numarası için GroupDocs sürüm sayfasını kontrol edin. Yeni sürümler genellikle performans yamaları ve ek ek açıklama stilleri içerir.

Baş ağrısına neden olmayan ortam kurulumu

  • JDK 8 veya üzeri – Gelişmiş çöp toplayıcı ve modül sistemi nedeniyle JDK 11 önerilir.
  • Maven 3.6+ – Eski Maven sürümleri geçişli bağımlılıklarla zorlanabilir.
  • IDE – IntelliJ IDEA veya Eclipse, Java kütüphaneleri için en iyi hata ayıklama deneyimini sunar.
  • Memory – 100 sayfadan büyük PDF’lerle çalışırken en az 2 GB yığın tahsis edin.

Bilgi önkoşulları (kendinize dürüst olun)

Aşağıdakilerle rahat olmalısınız:

  • Temel Java koleksiyonları ve istisna yönetimi.
  • Maven bağımlılık yönetimi.
  • Temel dosya G/Ç (ikili akışları okuma ve yazma).

Bu alanlardan herhangi biri eksik hissediyorsa, ek açıklama koduna dalmadan önce hızlı bir yenileme yapın.

GroupDocs.Annotation’ı kurmak - doğru yol

Adım 1: Maven yapılandırması (sorun giderme ile)

Daha önce gösterilen depo ve bağımlılığı ekleyin. Maven artefaktı çözümleyemezse, pom.xml içinde GroupDocs genel deposunun tanımlı olduğundan emin olun:

<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>

Adım 2: Lisans kurulumu (üretim için kritik)

Geliştirme aşamasında geçici bir deneme lisansı kullanabilirsiniz:

// For evaluation purposes
License license = new License();
// license.setLicense("path/to/license.lic"); // Comment this out for trial

Gerçeklik kontrolü: Deneme, kaydedilen her PDF’e görünür bir su işareti ekler. Üretim lisansı bu su işaretini kaldırır ve tam ek açıklama özellik setini açar.

Adım 3: Temel başlatma deseni

Annotator, bir PDF belgesini yüklemek ve ek açıklamalar uygulamak için birincil sınıftır.
Kaynakların hızlıca serbest bırakılması için Annotator‘ı her zaman bir try‑finally bloğuna sarı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? GroupDocs, PDF ayrıştırması için yerel bellek tahsis eder; Annotator‘ı serbest bırakmazsanız, özellikle toplu işlerde birçok belge işlediğinizde bellek sızıntılarına yol açabilir.

Tam uygulama rehberi - sıfırdan üretime

Bağlamda ok ek açıklamalarını anlama

Ok ek açıklamaları, belge‑inceleme iş akışlarında görsel ipuçları görevi görür. Tipik kullanım senaryoları şunlardır:

  1. İnceleme geri bildirimi – “Bu madde açıklamaya ihtiyaç duyuyor.”
  2. Referans bağlantısı – “Sayfa 12’deki diyagrama bakın.”
  3. Süreç rehberliği – “Denetimi burada başlatın.”
  4. Sorun vurgulama – “Bu paragrafta olası bir yazım hatası.”

Bu senaryolara göre ek açıklama UI’nızı tasarlamak, kullanıcıların aracı daha hızlı benimsemesini sağlar.

Adım 1: Ek açıklama yanıtları oluşturma (akıllı yol)

Yanıtlar, statik bir oku etkileşimli bir tartışma noktasına dönüştürür. Reply sınıfını ilk kez tanıttığınızda, kısa bir tanım ekleyin:

Tanım bağlantısı: Reply, bir ek açıklamaya eklenmiş metin yorumunu temsil eder, yazar bilgisi ve zaman damgası içerir.

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);

Pro tip: Yanıt meta verisine kullanıcının kimliğini ve rolünü kaydedin; bu, yorumları daha sonra filtrelemeyi kolaylaştırır.

Adım 2: Ok ek açıklamasını oluşturma (gerçek dünya koşullarıyla)

Tanım bağlantısı: ArrowAnnotation, PDF sayfasına yönlü bir ok çizen GroupDocs nesnesidir.

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

Açıklanan ana parametreler:

  • Rectangle coordinates – (x, y, width, height); (x, y) sınırlayıcı kutunun sol‑üst köşesidir.
  • PenColor – ARGB tamsayısı kullanır; 65535 canlı bir mavi verir. Özel renkler için çevrimiçi dönüştürücü kullanın.
  • PenStyle – Seçenekler: DOT, DASH, SOLID, DASHDOT, DASHDOTDOT. Çoğu senaryo için SOLID seçin.
  • Opacity – 0.0 (şeffaf) ile 1.0 (opak) arasında değişir. 0.7 değeri, görünürlük ile alt içerik okunabilirliği arasında denge kurar.

Adım 3: Ekleyip kaydetme (hata yönetimi ile)

Tanım bağlantısı: Annotator.save, bekleyen tüm ek açıklama değişikliklerini hedef PDF dosyasına kalıcı hâle getirir.

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();
}

IOException ve AnnotationException‘ı her zaman yakalayarak bozuk dosyalar, geçersiz yollar veya izin sorunlarını ele alın. Yığın izini (stack trace) kaydetmek, üretimde sorunları teşhis etmenize yardımcı olur.

Yaygın tuzaklar ve nasıl kaçınılır

Sorun 1: Koordinatlar beklenen konumla eşleşmiyor

Problem: Ok, hedeflenen noktadan kaymış olarak görünür.

Solution: PDF koordinat orijini sol‑alt, GroupDocs ise sol‑üst bekler. UI koordinatlarınızı buna göre dönüştürün veya yerleşik convertToPdfCoordinates yardımcı metodunu kullanın:

// 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: Kaydedildikten sonra ek açıklamalar kayboluyor

Problem: İşleme sırasında oklar görünür, ancak son PDF’te yoktur.

Solution: Bu neredeyse daima bir lisans sorunu olduğunu gösterir. Herhangi bir Annotator örneği oluşturulmadan önce lisans dosyasının yüklendiğini doğrulayın:

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 işleme sırasında bellek sızıntıları

Problem: Yüzlerce PDF işlenirken JVM yığın belleği tükenir.

Solution: Bir belgeyle işiniz bittiğinde her Annotator‘ı imha edin ve bellek kullanımını öngörülebilir tutmak için dosyaları küçük 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

Okların bir web UI’da kullanıcı tıklamalarını takip etmesi gerektiğinde, dikdörtgeni istemci tarafında hesaplayıp koordinatları backend’e gönderin. Backend, bu değerlerle bir ArrowAnnotation örneği oluşturabilir.

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ı için okları stilize etme

PenColor ve PenStyle‘ı değiştirerek anlam katabilirsiniz—örneğin kritik sorunlar için kırmızı kesikli oklar, onaylı bölümler için yeşil katı oklar.

// 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 inceleme sistemi

Çok‑kullanıcılı bir inceleme portalında, her inceleyen bir ArrowAnnotation oluşturur ve bir Reply ekler. Sistem, yanıtları ilişkisel bir veritabanında saklayarak her ek açıklama üzerinde dallanmış tartışma imkanı sunar.

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

Bir analiz motoru, uyumluluk ihlallerini tarar ve otomatik olarak problemli maddelere kırmızı oklar ekler.

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 ipuçları

Bellek yönetimi en iyi uygulamaları

  1. Use try‑with‑resources (Java 7+) to auto‑close Annotator objects:

try (Annotator annotator = new Annotator(“document.pdf”)) { // Your annotation code } // Automatically disposed


2. **Process pages individually** instead of loading the entire document into memory.  

3. **Monitor heap usage** with tools like VisualVM or JConsole during large‑scale batch runs.

### CPU performans düşünceleri

- Tüm oklar için tek bir `Color` örneği yeniden kullanın, gereksiz nesne tahsisinden kaçının.  
- Aynı `PenStyle` nesnelerini tekrar tekrar oluşturan iç içe döngülerden kaçının.  
- Birçok bağımsız PDF'niz varsa bir iş parçacığı havuzu (thread pool) düşünün, ancak aynı anda çalışan `Annotator` örnek sayısını sınırlayarak bellek tüketimini kontrol altında tutun.

## Sorun giderme rehberi – gerçek sorunlara çözümler

### Sorun: Ek açıklamalar Adobe Reader'da görünmüyor

**Symptoms**: Oklar özel görüntüleyicinizde görünür ancak Adobe Acrobat'ta yok.

**Solutions**:

1. PDF'i PDF/A‑1b uyumluluğu ile kaydedin, böylece en yüksek görüntüleyici uyumluluğu sağlanır:  

   ```java
// Try different save options if available
SaveOptions saveOptions = new SaveOptions();
saveOptions.setAnnotationType(AnnotationType.All);
annotator.save(outputPath, saveOptions);
  1. PDF sürümünün en az 1.7 olduğundan emin olun; daha eski sürümler yeni ek açıklama tiplerini atabilir.

Sorun: Büyük PDF’lerde düşük performans

Symptoms: 200 sayfadan büyük PDF’lerle çalışırken uygulama takılıyor veya yanıt vermiyor.

Solutions:

  1. Process pages individually rather than loading the whole file:

// Process specific pages LoadOptions loadOptions = new LoadOptions(); loadOptions.setLoadCharts(false); // Skip charts if not needed Annotator annotator = new Annotator(documentPath, loadOptions);


2. **Enable streaming** in the `Annotator` constructor if your version supports it.  

3. Çok büyük belgeler için JVM yığınını (`-Xmx4g`) artırın.

### Sorun: Renk renderleme sorunları

**Symptoms**: Ok gri ya da tamamen şeffaf görünüyor.

**Solution**: Rengi ARGB formatında tanımlayın ve PDF'in renk uzayının **DeviceRGB** olarak ayarlandığından emin olun:

```java
// 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 ek açıklamaları birim testi

Sağlam bir birim testi, örnek bir PDF yükler, bir ArrowAnnotation ekler, dosyayı kaydeder ve ardından ek açıklama sayısını ve özelliklerini doğrulamak için yeniden açar:

@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

Aynı test paketini farklı boyutlardaki PDF’lerde (10 sayfa, 100 sayfa, 500 sayfa) ve farklı görüntüleyicilerde (Adobe Reader, Foxit, Chrome) çalıştırarak tutarlı renderlama garantileyin.

Sonuç

Artık GroupDocs.Annotation kullanarak Java PDF ok ek açıklamaları uygulamak için eksiksiz bir araç setine sahipsiniz. Şunu unutmayın:

  • Annotator nesnelerini zamanında imha edin.
  • Çeşitli PDF sürümleri ve boyutlarıyla test edin.
  • Toplu işlerde ölçeklenirken performans ipuçlarını uygulayın.
  • Yorumların anlamsal anlamına uygun şekilde okları stilize edin.

Sonraki adımlar: TextAnnotation, AreaAnnotation ve WatermarkAnnotation gibi diğer ek açıklama tiplerini keşfedin. Aynı başlatma ve imha desenleri geçerlidir, böylece tam özellikli bir belge iş birliği platformu oluşturabilirsiniz.

Sıkça sorulan sorular

Q: Parola korumalı PDF’lere ok ek açıklamaları ekleyebilir miyim?
A: Evet, Annotator örneğini oluştururken şifreyi sağlayın:

LoadOptions loadOptions = new LoadOptions();
loadOptions.setPassword("your-password");
Annotator annotator = new Annotator("protected.pdf", loadOptions);

Q: Birden fazla belgeyi verimli şekilde toplu işleme nasıl yaparım?
A: Belgeleri küçük partiler halinde işleyin, her dosya için tek bir Annotator yeniden kullanın ve her kaydın ardından dispose() çağırı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
    }
}

Q: Bir belgede maksimum kaç ek açıklama olabilir?
A: GroupDocs kesin bir sınır koymaz, ancak pratik performans, 500‑sayfalık bir PDF’de yaklaşık 1.000 ek açıklamadan sonra düşer; bu durumda burada anlatılan bellek‑yönetim tekniklerini uygulamanız gerekir.

Q: Standart seçeneklerin ötesinde ok şekillerini özelleştirebilir miyim?
A: Kütüphane standart ok başları sağlar. Tamamen özel şekiller için birden fazla AreaAnnotation birleştirebilir veya vektör yollarını destekleyen grafik‑odaklı bir kütüphane kullanabilirsiniz.

Q: Farklı PDF koordinat sistemleriyle nasıl başa çıkılır?
A: GroupDocs, UI koordinatlarını (sol‑üst) PDF koordinatlarına (sol‑alt) otomatik dönüştürür. Eşleşme sorunları yaşarsanız, istemci tarafında ekstra bir dönüşüm katmanı uygulamadığınızdan emin olun.

// 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;

Q: Üretim kullanımı için lisans maliyeti nedir?
A: GroupDocs, Geliştirici, Site ve OEM lisansları sunar. Fiyatlar, geliştirici başına yılda $699‘dan başlar. En güncel rakamlar için GroupDocs pricing page’i ziyaret edin.

Q: Bunu Spring Boot uygulamalarıyla nasıl entegre ederim?
A: Ek açıklama mantığını kapsülleyen bir @Service bean’i oluşturun, kontrolcülere enjekte edin ve bir PDF akışı kabul edip ek açıklamalı PDF döndüren bir REST uç noktası sunun.

@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);
        }
    }
}

Q: PDF’lerden mevcut ok ek açıklamalarını çıkarabilir miyim?
A: Evet, bir Annotator örneğinde getAnnotations() metodunu çağırın ve sonuçları AnnotationType.Arrow ile filtreleyin.

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

Son Güncelleme: 2026-08-14
Tested With: GroupDocs.Annotation 25.2 for Java
Author: GroupDocs

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);
    }
}
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");
java -Xmx4g -jar your-application.jar

İlgili Öğreticiler