Samouczek adnotacji odległości w Javie: Jak dodać pomiar do obrazu przy użyciu GroupDocs

W tym obszernym przewodniku dowiesz się, jak dodać pomiar do obrazów, plików PDF i innych typów dokumentów przy użyciu GroupDocs.Annotation dla Javy. Niezależnie od tego, czy tworzysz przeglądarkę CAD, narzędzie do przeglądu architektonicznego, czy platformę dokumentacji technicznej, adnotacje odległości dają użytkownikom wyraźny, interaktywny linijkę, na której mogą polegać. Po zakończeniu samouczka będziesz posiadać gotowe do produkcji rozwiązanie, które rysuje precyzyjne pomiary, dostosowuje ich wygląd i płynnie integruje się z istniejącą bazą kodu Java.

Jak dodać pomiar do obrazu w Javie?

Załaduj docelowy dokument przy użyciu Annotator, utwórz DistanceAnnotation, skonfiguruj jego właściwości wizualne, dodaj go do wybranej strony i w końcu zapisz plik. W zaledwie czterech linijkach kodu otrzymujesz w pełni funkcjonalną linijkę, którą użytkownicy końcowi mogą edytować w dowolnym zgodnym podglądzie. To podejście działa dla PDF‑ów, plików Word, prezentacji PowerPoint, arkuszy Excel oraz popularnych formatów obrazów, takich jak PNG, JPEG i TIFF.

Szybkie odpowiedzi

  • Jaki jest najprostszy sposób na dodanie pomiaru do obrazu w Javie? Użyj klasy DistanceAnnotation z GroupDocs.Annotation.
  • Jakie formaty są obsługiwane? PDF, Word, PowerPoint, Excel oraz popularne typy obrazów (PNG, JPEG, TIFF).
  • Czy potrzebna jest licencja do rozwoju? Do testów wystarczy darmowa wersja próbna lub tymczasowa licencja; do produkcji wymagana jest licencja komercyjna.
  • Czy mogę dostosować wygląd linii linijki? Tak – możesz ustawić kolor, styl, szerokość i przezroczystość.
  • Jak uniknąć wycieków pamięci? Zawsze zwalniaj instancję Annotator lub używaj try‑with‑resources.

Co to są adnotacje odległości (i dlaczego są potrzebne)?

Adnotacje odległości to interaktywne elementy wizualne wyświetlające zmierzoną długość pomiędzy dwoma punktami w dokumencie. Działają jak cyfrowe linijki, które można umieścić w dowolnym miejscu, przeciągać i edytować w czasie rzeczywistym, dając użytkownikom natychmiastową informację zwrotną bez ręcznych obliczeń.

Te adnotacje wnoszą wizualną przejrzystość, interaktywną informację zwrotną oraz profesjonalny wygląd do każdego dokumentu technicznego. Są szczególnie cenne w rysunkach architektonicznych, schematach inżynierskich, obrazach medycznych i planach nieruchomości, gdzie precyzyjne wymiary są kluczowe.

Najlepsze praktyki pomiaru dokumentów

Zanim zaczniesz kodować, pamiętaj o sprawdzonych zasadach:

  1. Indeksowanie stron od zerapageNumber = 0 odnosi się do pierwszej strony, co odpowiada wewnętrznemu modelowi GroupDocs.Annotation.
  2. Kolory o wysokim kontraście – Wybieraj kolory linijki, które wyróżniają się na tle dokumentu (np. jasny żółty na ciemnych schematach).
  3. Dostosowanie przezroczystości – Przezroczystość 0.7 zapewnia równowagę między widocznością a szczegółami tła; podnieś do 1.0 w krytycznych pomiarach.
  4. Grupowanie powiązanych adnotacji – Używaj odpowiedzi lub komentarzy, aby utrzymać dyskusje wokół konkretnego pomiaru.
  5. Szybkie zwalnianie zasobów – Zawsze wywołuj annotator.dispose() lub używaj try‑with‑resources, aby zwolnić pamięć natywną, szczególnie przy dużych plikach.

Wymagania wstępne: Co będzie potrzebne przed rozpoczęciem

Wymagania środowiska programistycznego

  • Java Development Kit (JDK): wersja 8 lub wyższa (zalecany JDK 11+).
  • Maven lub Gradle: Przykłady używają Maven, ale te same zależności działają z Gradle.
  • IDE: Dowolne środowisko Java (IntelliJ IDEA, Eclipse, VS Code itp.).

Wymagania wiedzy

Powinieneś już być zaznajomiony z:

  • Podstawowymi koncepcjami Javy (klasy, obiekty, metody).
  • Dodawaniem zewnętrznych bibliotek poprzez Maven/Gradle.
  • Podstawowym I/O plików i obsługą ścieżek.

Dokumenty testowe

Przygotuj kilka przykładowych plików:

  • Jedną lub więcej stron PDF.
  • Obrazy PNG/JPEG/TIFF do testów rastrowych.
  • Opcjonalnie pliki CAD, jeśli chcesz eksperymentować z rysunkami inżynierskimi.

Konfiguracja GroupDocs.Annotation dla Javy

Integracja GroupDocs.Annotation jest bardzo prosta. Poniżej pokazujemy współrzędne Maven, które musisz dodać do projektu.

Integracja Maven

Dodaj następującą konfigurację do pliku pom.xml:

```xml
<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>

### Zrozumienie wymagań licencyjnych

GroupDocs.Annotation oferuje trzy modele licencjonowania:

1. **Free Trial** – Idealny do oceny; zawiera wszystkie funkcje z niewielkimi limitami użycia.  
2. **Temporary License** – Usuwa ograniczenia wersji próbnej dla rozwoju i testów.  
3. **Commercial License** – Pełna funkcjonalność, gotowa do produkcji, bez limitów.

Zacznij od wersji próbnej, a następnie przejdź na licencję komercyjną, gdy będziesz gotowy do wdrożenia.

### Podstawowa inicjalizacja

Klasa `Annotator` jest punktem wejścia dla wszystkich operacji adnotacji. Ładuje dokument, udostępnia API edycji i zapisuje wynik na dysku.

```java
```java
import com.groupdocs.annotation.Annotator;

// Initialize annotator with the input file path
final Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf");

**Pro tip:** Umieść `Annotator` w bloku try‑with‑resources lub wywołaj `dispose()` ręcznie, aby uniknąć wycieków pamięci natywnej.

## Przewodnik krok po kroku

Teraz przejdźmy przez kompletny, gotowy do produkcji przepływ pracy dodawania adnotacji odległości.

### Krok 1: Tworzenie interaktywnych odpowiedzi (opcjonalnie, ale zalecane)

Odpowiedzi pozwalają współpracownikom dołączać komentarze bezpośrednio do pomiaru, zamieniając prostą linijkę w wątek dyskusyjny.

```java
```java
import com.groupdocs.annotation.models.Reply;
import java.util.ArrayList;
import java.util.Calendar;

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

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

**Kiedy używać odpowiedzi:** W cyklach przeglądu wieloużytkownikowego, gdy trzeba wyjaśnić, dlaczego wybrano konkretny wymiar lub poprosić o wyjaśnienie od współpracownika.

### Krok 2: Konfiguracja adnotacji odległości

Klasa `DistanceAnnotation` jest głównym obiektem GroupDocs.Annotation reprezentującym pomiar linijki. Możesz dostosować jej geometrię, styl wizualny oraz dołączoną wiadomość.

`Rectangle` definiuje prostokąt ograniczający adnotację na stronie. `PenStyle` wylicza style linii, takie jak ciągła, przerywana i kropkowana.

```java
```java
import com.groupdocs.annotation.models.Rectangle;
import com.groupdocs.annotation.models.PenStyle;
import com.groupdocs.annotation.models.annotationmodels.DistanceAnnotation;

DistanceAnnotation distance = new DistanceAnnotation();
distance.setBox(new Rectangle(200, 150, 200, 30)); // Set the annotation's position and size
distance.setCreatedOn(Calendar.getInstance().getTime()); 
distance.setMessage("This is a distance annotation");
distance.setOpacity(0.7);
distance.setPageNumber(0); 
distance.setPenColor(65535);
distance.setPenStyle(PenStyle.DOT);
distance.setPenWidth((byte) 3);

distance.setReplies(replies); // Attach replies

**Kluczowe opcje konfiguracji**  
- `setBox()` – Ustawia prostokąt ograniczający adnotację na stronie.  
- `setOpacity()` – Kontroluje przezroczystość (`0.0` = niewidoczna, `1.0` = w pełni nieprzezroczysta).  
- `setPenColor()` – Kolor RGB linii pomiaru.  
- `setPenStyle()` – Styl linii (`DOT`, `DASH`, `SOLID`).  
- `setPenWidth()` – Grubość linii w punktach.

### Krok 3: Zastosowanie adnotacji i zapis

Gdy adnotacja jest gotowa, dodaj ją do dokumentu i zapisz zmiany.

```java
```java
annotator.add(distance);
annotator.save("YOUR_OUTPUT_DIRECTORY/output.pdf");
annotator.dispose();

**Ważne:** Zawsze wywołuj `dispose()` po zapisaniu, szczególnie przy przetwarzaniu wielu dokumentów w trybie wsadowym.

## Kompletny działający przykład

Łącząc wszystkie elementy, oto pełny przykład od początku do końca, który ładuje PDF, dodaje adnotację odległości i zapisuje wynik.

```java
```java
import com.groupdocs.annotation.Annotator;
import com.groupdocs.annotation.models.Reply;
import com.groupdocs.annotation.models.Rectangle;
import com.groupdocs.annotation.models.PenStyle;
import com.groupdocs.annotation.models.annotationmodels.DistanceAnnotation;
import java.util.ArrayList;
import java.util.Calendar;

public class DistanceAnnotationExample {
    public static void main(String[] args) {
        try (Annotator annotator = new Annotator("input.pdf")) {
            // Create replies for the annotation
            ArrayList<Reply> replies = new ArrayList<>();
            Reply reply = new Reply();
            reply.setComment("Measurement verified by engineering team");
            reply.setRepliedOn(Calendar.getInstance().getTime());
            replies.add(reply);

            // Configure the distance annotation
            DistanceAnnotation distance = new DistanceAnnotation();
            distance.setBox(new Rectangle(100, 100, 300, 50));
            distance.setCreatedOn(Calendar.getInstance().getTime());
            distance.setMessage("Wall length: 12 feet");
            distance.setOpacity(0.8);
            distance.setPageNumber(0);
            distance.setPenColor(0xFF0000); // Red color
            distance.setPenStyle(PenStyle.SOLID);
            distance.setPenWidth((byte) 2);
            distance.setReplies(replies);

            // Add and save
            annotator.add(distance);
            annotator.save("output_with_distance_annotation.pdf");
            
            System.out.println("Distance annotation added successfully!");
        } catch (Exception e) {
            System.err.println("Error adding distance annotation: " + e.getMessage());
        }
    }
}

Uruchom fragment, otwórz plik wyjściowy w dowolnym podglądzie PDF obsługującym adnotacje i zobacz w pełni funkcjonalną linijkę gotową do interakcji.

## Typowe przypadki użycia i zastosowania w rzeczywistym świecie

Zrozumienie, gdzie adnotacje odległości naprawdę błyszczą, pomaga zdecydować, jak je wbudować w produkt.

### Dokumentacja techniczna i podręczniki
- Podkreślanie wymiarów komponentów w przewodnikach montażowych.  
- Pokazywanie stref marginesowych w podręcznikach instalacyjnych.  
- Dostarczanie szybkich odniesień wymiarowych dla list kontrolnych jakości.

### Projekty architektoniczne i inżynieryjne
- Wyświetlanie rozmiarów pomieszczeń na planach.  
- Indykowanie odstępów elementów konstrukcyjnych.  
- Oznaczanie odległości linii użyteczności i stref bezpieczeństwa.

### Zastosowania medyczne i naukowe
- Pomiar struktur anatomicznych w obrazach radiologicznych.  
- Dodawanie pasków skali do slajdów mikroskopowych.  
- Dokumentowanie wymiarów próbek w raportach badawczych.

### Nieruchomości i zarządzanie nieruchomościami
- Wizualizacja granic działki i linii własności.  
- Pokazywanie wymiarów pomieszczeń w ogłoszeniach.  
- Oznaczanie rozmiarów miejsc parkingowych i elementów zagospodarowania terenu.

## Rozwiązywanie typowych problemów

Nawet dobrze napisana próbka może napotkać trudności. Poniżej najczęstsze problemy i ich rozwiązania.

### Problem: „File not found” lub problemy ze ścieżką
**Objawy:** Wyjątek rzucany przy tworzeniu `Annotator`.  
**Rozwiązanie:** Podczas rozwoju używaj ścieżki bezwzględnej, sprawdź, czy plik istnieje i upewnij się, że proces ma uprawnienia do odczytu.

```java
```java
// Better path handling
String inputPath = new File("documents/input.pdf").getAbsolutePath();
final Annotator annotator = new Annotator(inputPath);

### Problem: Adnotacja niewidoczna
**Objawy:** Kod działa bez błędów, ale linijka nie pojawia się.  
**Typowe przyczyny:** Nieprawidłowy indeks strony (pamiętaj, że strony zaczynają się od 0), umieszczenie adnotacji poza widocznym obszarem lub zbyt niska przezroczystość.

**Szybkie poprawki:**

```java
```java
distance.setPageNumber(0); // First page
distance.setOpacity(1.0);  // Fully opaque
distance.setBox(new Rectangle(50, 50, 200, 30)); // Visible position

### Problem: Problemy z pamięcią przy dużych dokumentach
**Objawy:** `OutOfMemoryError` lub spowolnienie przy plikach wielostronicowych.  
**Rozwiązania:**  
- Zwalniaj każdą instancję `Annotator` natychmiast po zakończeniu.  
- Przetwarzaj dokumenty sekwencyjnie, a nie jednocześnie.  
- Zwiększ przydział pamięci JVM (`-Xmx4g` lub więcej) przy bardzo dużych wejściach.

```java
```java
// Good practice - use try-with-resources
try (Annotator annotator = new Annotator("large-document.pdf")) {
    // Your annotation code here
} // Automatic disposal

### Problem: Błędy związane z licencją
**Objawy:** Ostrzeżenia o ograniczeniach wersji próbnej lub niepowodzenia weryfikacji licencji.  
**Rozwiązania:**  
- Sprawdź, czy ścieżka do pliku licencji jest poprawna i plik jest czytelny.  
- Upewnij się, że wersja licencji odpowiada wersji biblioteki GroupDocs.Annotation, której używasz.  
- Zweryfikuj, czy tymczasowa licencja nie wygasła.

## Wskazówki optymalizacji wydajności

Przechodząc od prototypu do produkcji, pamiętaj o następujących aspektach wydajności.

### Najlepsze praktyki zarządzania pamięcią
- **Zawsze zwalniaj**: Preferuj try‑with‑resources lub wywołanie `dispose()`.  
- **Operacje wsadowe**: Grupuj wiele zmian adnotacji w jednej sesji `Annotator`, aby zmniejszyć narzut.  
- **Profilowanie**: Korzystaj z profilerów Javy (VisualVM, YourKit) w celu monitorowania zużycia pamięci natywnej.

### Optymalizacja przetwarzania plików
- **Cache'uj często używane dokumenty** w pamięci, gdy są tylko do odczytu.  
- **Preferuj PDF** zamiast wysokiej rozdzielczości obrazów dla szybszego renderowania; PDF‑y są średnio o 30‑40 % mniejsze przy tej samej zawartości wizualnej.  
- **Dostosuj rozdzielczość obrazu**: Redukuj obrazy do maksymalnie 150 DPI, chyba że wymagana jest wyższa jakość.

### Rozważania przy przetwarzaniu równoległym
Jeśli Twój serwis obsługuje wiele plików jednocześnie, stosuj się do poniższych zasad:

```java
```java
// Example of efficient batch processing
public void processMultipleDocuments(List<String> filePaths) {
    for (String path : filePaths) {
        try (Annotator annotator = new Annotator(path)) {
            // Add multiple annotations per document
            addDistanceAnnotation(annotator, config1);
            addDistanceAnnotation(annotator, config2);
            // Save once with all annotations
            annotator.save(getOutputPath(path));
        }
    }
}

- Każdy wątek musi tworzyć własną instancję `Annotator`.  
- Używaj ograniczonego puli wątków, aby nie wyczerpać zasobów systemowych.  
- Monitoruj zużycie CPU i pamięci pod obciążeniem; w razie potrzeby skaluj horyzontalnie.

## Zaawansowane opcje konfiguracji

Gdy opanujesz podstawy, wypróbuj te zaawansowane funkcje, aby dopracować adnotacje.

### Niestandardowe opcje stylizacji

```java
```java
// Advanced pen styling
distance.setPenStyle(PenStyle.DASH_DOT);
distance.setPenWidth((byte) 4);
distance.setPenColor(0x00FF00); // Hex color codes work too

// Custom opacity for different emphasis levels
distance.setOpacity(0.6); // Subtle background measurements
// vs
distance.setOpacity(1.0); // Prominent foreground measurements

Możesz zdefiniować własny obiekt `Pen`, zastosować wypełnienia gradientowe lub nawet osadzić znaczniki SVG na końcach linii linijki.

### Dynamiczne pozycjonowanie

```java
```java
// Calculate position based on document dimensions or content
Rectangle dynamicBox = calculateOptimalPosition(documentWidth, documentHeight);
distance.setBox(dynamicBox);

Wykorzystaj współrzędne względne względem strony, aby adnotacja automatycznie przemieszczała się przy powiększaniu lub obracaniu dokumentu.

### Warunkowe adnotacje

```java
```java
// Add annotations based on document content or user preferences
if (document.getType() == DocumentType.ARCHITECTURAL_PLAN) {
    distance.setMessage("Room dimension");
    distance.setPenStyle(PenStyle.SOLID);
} else if (document.getType() == DocumentType.ENGINEERING_DRAWING) {
    distance.setMessage("Component spacing");
    distance.setPenStyle(PenStyle.DOT);
}

Dodaj logikę, która tworzy adnotację odległości tylko wtedy, gdy spełniony jest określony warunek (np. gdy komponent przekracza dopuszczalny próg tolerancji).

## Integracja z innymi systemami

Adnotacje odległości nie działają w izolacji — naturalnie wpasowują się w szersze ekosystemy zarządzania dokumentami.

### Integracja z bazą danych

`AnnotationRecord` to własny model danych służący do przechowywania metadanych adnotacji w bazie danych.

```java
```java
// Save annotation details to database
AnnotationRecord record = new AnnotationRecord();
record.setDocumentId(documentId);
record.setAnnotationType("distance");
record.setMeasurement(distance.getMessage());
record.setCreatedDate(distance.getCreatedOn());

Przechowuj metadane adnotacji (autor, znacznik czasu, wartość pomiaru) w relacyjnej bazie danych w celu raportowania i wyszukiwania.

### Integracja z aplikacją webową

`DistanceAnnotationRequest` to DTO przenoszący parametry adnotacji z klienta do serwera.

```java
```java
@PostMapping("/documents/{id}/annotations/distance")
public ResponseEntity<String> addDistanceAnnotation(
    @PathVariable String id,
    @RequestBody DistanceAnnotationRequest request) {
    // Process the annotation request
    // Return success/failure response
}

Udostępnij endpoint REST, który przyjmuje plik, dodaje adnotację odległości na podstawie ładunku JSON i zwraca dokument z adnotacją.

### Integracja z przechowywaniem w chmurze

```java
```java
// Download from cloud, process, upload result
byte[] documentBytes = cloudStorageService.download(documentPath);
// Process with GroupDocs.Annotation
byte[] annotatedDocument = processAnnotations(documentBytes);
cloudStorageService.upload(outputPath, annotatedDocument);

Odczytuj i zapisuj pliki bezpośrednio z AWS S3, Azure Blob Storage lub Google Cloud Storage przy użyciu odpowiednich SDK, a następnie przekazuj strumienie do `Annotator`.

## Najczęściej zadawane pytania

**P: Jakie formaty dokumentów obsługują adnotacje odległości?**  
O: GroupDocs.Annotation obsługuje PDF‑y, dokumenty Word, prezentacje PowerPoint, arkusze Excel oraz popularne formaty obrazów (PNG, JPEG, TIFF, BMP). Funkcjonalność działa konsekwentnie we wszystkich ponad 50 obsługiwanych formatach.

**P: Czy mogę dostosować wygląd linii pomiarowych?**  
O: Oczywiście! Masz pełną kontrolę nad kolorem pióra, stylem linii (ciągła, kropkowana, przerywana), szerokością i przezroczystością. Możesz także definiować własne symbole zakończeń dla specjalistycznych standardów inżynieryjnych.

**P: Jak obsługiwać pomiary w różnych jednostkach?**  
O: Sama adnotacja wyświetla tekst ustawiony w właściwości `message`. Przeprowadź konwersję jednostek (np. cale ↔ milimetry) w kodzie Java przed przypisaniem wiadomości.

**P: Czy użytkownicy mogą interaktywnie korzystać z adnotacji odległości po ich dodaniu?**  
O: Tak. W kompatybilnych podglądach (GroupDocs.Viewer, Adobe Acrobat lub własny podgląd webowy) użytkownicy mogą klikać, przeciągać i edytować linijkę. Odpowiedzi i komentarze pozostają przyłączone do pomiaru, umożliwiając współpracę.

**P: Jaki wpływ na wydajność ma dodawanie dużej liczby adnotacji?**  
O: Dodanie do kilku setek adnotacji na dokument ma znikomy wpływ (< 5 % obciążenia CPU). Po przekroczeniu 1 000 adnotacji czasy ładowania mogą nieco wzrosnąć, ale biblioteka pozostaje stabilna i responsywna.

## Podsumowanie i dalsze kroki

Masz teraz kompletną, gotową do produkcji mapę drogową **jak dodać pomiar** do obrazów i innych dokumentów w Javie przy użyciu GroupDocs.Annotation. Wykorzystując adnotacje odległości, możesz przekształcić statyczne rysunki w interaktywne, bogate w dane zasoby, które usprawniają współpracę i redukują błędy.

**Kluczowe wnioski**  
- Adnotacje odległości zapewniają precyzyjne, wizualne pomiary w ponad 50 formatach plików.  
- Implementacja jest zwięzła: załaduj, skonfiguruj, dodaj, zapisz.  
- Wydajność jest solidna dla dokumentów średniej wielkości; stosuj wskazówki dotyczące zarządzania pamięcią przy dużych plikach.  
- Punkty integracji (baza danych, REST, chmura) pozwalają osadzić adnotacje w dowolnym przepływie pracy.

### Zalecane dalsze kroki
1. **Prototyp**: Sklonuj pełny przykład, uruchom go na własnych PDF‑ach lub obrazach i zweryfikuj, czy linijka pojawia się prawidłowo.  
2. **Zbadaj inne typy adnotacji**: Adnotacje podświetlenia, tekstu i pieczęci mogą uzupełniać pomiary odległości.  
3. **Zbuduj interfejs UI**: Zaprojektuj interfejs „przeciągnij‑i‑upuść”, który pozwoli użytkownikom końcowym umieszczać linijki bezpośrednio w przeglądarce lub aplikacji desktopowej.  
4. **Planuj skalowanie**: Jeśli spodziewasz się tysięcy jednoczesnych użytkowników, wdroż strategię puli wątków i monitoruj zużycie pamięci, jak opisano w sekcji wydajności.

---

**Ostatnia aktualizacja:** 2026-06-16  
**Testowane z:** GroupDocs.Annotation 25.2 for Java  
**Autor:** GroupDocs  

**Powiązane zasoby:**  
- [GroupDocs.Annotation Documentation](https://docs.groupdocs.com/annotation/java/) - Kompleksowa dokumentacja API  
- [API Reference](https://reference.groupdocs.com/annotation/java/) - Szczegółowe odniesienia do metod i klas  
- [Download Page](https://releases.groupdocs.com/annotation/java/) - Najnowsze wersje i notatki wydania  
- [Support Forum](https://forum.groupdocs.com/c/annotation/) - Społecznościowe wsparcie i dyskusje  
- [Purchase Options](https://purchase.groupdocs.com/buy) - Informacje o licencjonowaniu komercyjnym  
- [Free Trial](https://releases.groupdocs.com/annotation/java/) - Wypróbuj przed zakupem  
- [Temporary License](https://purchase.groupdocs.com/temporary-license/) - Rozszerzona licencja ewaluacyjna

## Powiązane samouczki

- [How to add arrow to pdf with Java – Complete Tutorial & Best Practices](/annotation/java/graphical-annotations/add-arrow-annotations-java-groupdocs/)  
- [Java PDF Image Annotation - Complete GroupDocs Tutorial](/annotation/java/image-annotations/annotate-pdfs-java-groupdocs-image-annotations/)  
- [Edit PDF Annotations Java - Complete GroupDocs Tutorial](/annotation/java/annotation-management/groupdocs-annotation-java-modify-pdf-annotations/)