บทเรียนการทำ Annotation ระยะทางใน Java: วิธีเพิ่มการวัดลงในภาพด้วย GroupDocs

วิธีเพิ่มการวัดลงในภาพใน Java?

Load the target document with Annotator, create a DistanceAnnotation, configure its visual properties, add it to the desired page, and finally save the file. In just four lines of code you get a fully functional ruler that can be edited by end‑users in any compliant viewer. This approach works for PDFs, Word files, PowerPoint decks, Excel sheets, and common image formats such as PNG, JPEG, and TIFF.

คำตอบสั้น

  • วิธีที่ง่ายที่สุดในการเพิ่มการวัดลงในภาพใน Java คืออะไร? Use GroupDocs.Annotation’s DistanceAnnotation class.
  • รูปแบบใดที่รองรับ? PDFs, Word, PowerPoint, Excel, and common image types (PNG, JPEG, TIFF).
  • ฉันต้องการไลเซนส์สำหรับการพัฒนาหรือไม่? A free trial or temporary license works for testing; a commercial license is required for production.
  • ฉันสามารถปรับแต่งลักษณะของเส้นไม้บรรทัดได้หรือไม่? Yes – you can set color, style, width, and opacity.
  • ฉันจะหลีกเลี่ยงการรั่วไหลของหน่วยความจำได้อย่างไร? Always dispose of the Annotator instance or use try‑with‑resources.

Annotation ระยะทางคืออะไร (และทำไมคุณถึงต้องการมัน?)

Distance annotations are interactive visual elements that display the measured length between two points in a document. They act like digital rulers that can be placed anywhere, dragged, and edited in real time, giving users instant visual feedback without manual calculations.

These annotations bring visual clarity, interactive feedback, and a professional appearance to any technical document. They are especially valuable for architectural drawings, engineering schematics, medical imaging, and real‑estate floor plans where precise dimensions are critical.

แนวทางปฏิบัติที่ดีที่สุดสำหรับการวัดเอกสาร

Before you start coding, keep these proven practices in mind:

  1. การจัดหน้าโดยเริ่มจากศูนย์pageNumber = 0 หมายถึงหน้าที่หนึ่ง, ซึ่งสอดคล้องกับโมเดลภายในของ GroupDocs.Annotation.
  2. สีคอนทราสต์สูง – เลือกสีของไม้บรรทัดที่โดดเด่นต่อพื้นหลังของเอกสาร (เช่น สีเหลืองสว่างบนแผนภาพมืด).
  3. การปรับความทึบแสง – ความทึบแสง 0.7 ให้สมดุลระหว่างการมองเห็นและรายละเอียดพื้นหลัง; เพิ่มเป็น 1.0 สำหรับการวัดที่สำคัญมาก.
  4. จัดกลุ่ม annotation ที่เกี่ยวข้อง – ใช้ replies หรือ comments เพื่อจัดระเบียบการสนทนารอบการวัดเฉพาะ.
  5. ทำการ dispose อย่างทันท่วงที – เรียก annotator.dispose() เสมอหรือใช้ try‑with‑resources เพื่อปลดปล่อยหน่วยความจำเนทีฟ, โดยเฉพาะเมื่อจัดการไฟล์ขนาดใหญ่.

ข้อกำหนดเบื้องต้น: สิ่งที่คุณต้องมีก่อนเริ่ม

ความต้องการของสภาพแวดล้อมการพัฒนา

  • Java Development Kit (JDK): เวอร์ชัน 8 หรือสูงกว่า (แนะนำ JDK 11+).
  • Maven หรือ Gradle: ตัวอย่างใช้ Maven แต่ dependencies เดียวกันทำงานกับ Gradle.
  • IDE: IDE Java ใดก็ได้ (IntelliJ IDEA, Eclipse, VS Code ฯลฯ) ก็ใช้ได้.

ความรู้เบื้องต้นที่จำเป็น

You should already be comfortable with:

  • แนวคิดพื้นฐานของ Java (คลาส, อ็อบเจ็กต์, เมธอด).
  • การเพิ่มไลบรารีภายนอกผ่าน Maven/Gradle.
  • การทำงานพื้นฐานกับไฟล์ I/O และการจัดการเส้นทาง.

เอกสารทดสอบ

Prepare a few sample files:

  • หนึ่งหรือหลายหน้า PDF.
  • ภาพ PNG/JPEG/TIFF สำหรับการทดสอบแบบแรสเตอร์.
  • ไฟล์ CAD ทางเลือก หากคุณต้องการทดลองกับแบบแผนวิศวกรรม.

การตั้งค่า GroupDocs.Annotation สำหรับ Java

Integrating GroupDocs.Annotation is a breeze. Below we show the Maven coordinates you need to add to your project.

การรวม Maven

Add the following configuration to your pom.xml file:

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

### ทำความเข้าใจข้อกำหนดไลเซนส์

GroupDocs.Annotation offers three licensing models:

1. **Free Trial** – เหมาะสำหรับการประเมิน; มีฟีเจอร์ทั้งหมดพร้อมข้อจำกัดการใช้งานเล็กน้อย.  
2. **Temporary License** – ยกเลิกข้อจำกัดของการทดลองสำหรับการพัฒนาและทดสอบ.  
3. **Commercial License** – การใช้งานเต็มรูปแบบพร้อมสำหรับการผลิตโดยไม่มีข้อจำกัด.

Start with the free trial, then upgrade once you’re ready for production.

### การเริ่มต้นพื้นฐาน

The `Annotator` class is the entry point for all annotation operations. It loads a document, provides editing APIs, and writes the result back to disk.

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

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

**เคล็ดลับ:** ห่อ `Annotator` ด้วยบล็อก try‑with‑resources หรือเรียก `dispose()` อย่างชัดเจนเพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำเนทีฟ.

## คู่มือการทำตามขั้นตอน

Now let’s walk through a complete, production‑ready workflow for adding distance annotations.

### ขั้นตอนที่ 1: สร้าง Replies แบบโต้ตอบ (ไม่บังคับแต่แนะนำ)

Replies let collaborators attach comments directly to a measurement, turning a simple ruler into a discussion thread.

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

**เมื่อใดควรใช้ replies:** ในรอบการตรวจสอบหลายผู้ใช้, เมื่อคุณต้องอธิบายเหตุผลที่เลือกมิติหรือขอคำชี้แจงจากทีมเมมเบอร์.

### ขั้นตอนที่ 2: กำหนดค่า Distance Annotation ของคุณ

The `DistanceAnnotation` class is GroupDocs.Annotation's top‑level object that represents a ruler measurement. You can customize its geometry, visual style, and attached message.

`Rectangle` defines the annotation's bounding box on the page. `PenStyle` enumerates line styles such as solid, dash, and dot.

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

**ตัวเลือกการกำหนดค่าหลัก**  
- `setBox()` – ตั้งค่ากล่องสี่เหลี่ยมของ annotation บนหน้า.  
- `setOpacity()` – ควบคุมความโปร่งแสง (`0.0` = ไม่มองเห็น, `1.0` = ทึบเต็ม).  
- `setPenColor()` – สี RGB สำหรับเส้นการวัด.  
- `setPenStyle()` – สไตล์ของเส้น (`DOT`, `DASH`, `SOLID`).  
- `setPenWidth()` – ความหนาของเส้นเป็นจุด.

### ขั้นตอนที่ 3: นำ Annotation ไปใช้และบันทึก

Once the annotation is ready, add it to the document and persist the changes.

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

**สำคัญ:** เรียก `dispose()` เสมอหลังจากบันทึก, โดยเฉพาะเมื่อประมวลผลหลายเอกสารในงานแบตช์.

## ตัวอย่างการทำงานเต็มรูปแบบ

Putting everything together, here is a full end‑to‑end example that loads a PDF, adds a distance annotation, and saves the result.

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

Run the snippet, open the output file in any PDF viewer that supports annotations, and you’ll see a fully functional ruler ready for interaction.

## กรณีการใช้งานทั่วไปและการประยุกต์ใช้ในโลกจริง

Understanding where distance annotations shine helps you decide how to embed them in your product.

### เอกสารเทคนิคและคู่มือ
- เน้นมิติของส่วนประกอบในคู่มือการประกอบ.  
- แสดงโซนระยะห่างในคู่มือการติดตั้ง.  
- ให้การอ้างอิงมิติอย่างรวดเร็วสำหรับรายการตรวจสอบคุณภาพ.

### โครงการสถาปัตยกรรมและวิศวกรรม
- แสดงขนาดห้องบนแผนผัง.  
- ระบุระยะห่างขององค์ประกอบโครงสร้าง.  
- ทำเครื่องหมายระยะทางของสายยูทิลิตี้และระยะปลอดภัย.

### การประยุกต์ใช้ทางการแพทย์และวิทยาศาสตร์
- วัดโครงสร้างกายภาพในภาพรังสีวิทยา.  
- เพิ่มสเกลบาร์บนสไลด์จุลทรรศน์.  
- บันทึกมิติของตัวอย่างในรายงานการวิจัย.

### อสังหาริมทรัพย์และการจัดการทรัพย์สิน
- แสดงขอบเขตของที่ดินและเส้นแบ่งทรัพย์สิน.  
- แสดงขนาดห้องสำหรับรายการขาย.  
- ระบุขนาดที่จอดรถและการวัดการจัดสวน.

## การแก้ไขปัญหาทั่วไป

Even a well‑written example can hit snags. Below are the most frequent problems and how to resolve them.

### ปัญหา: “File not found” หรือปัญหาเส้นทาง

**อาการ:** มีข้อยกเว้นเกิดขึ้นเมื่อสร้าง `Annotator`.

**วิธีแก้:** ใช้เส้นทางแบบ absolute ระหว่างการพัฒนา, ตรวจสอบว่าไฟล์มีอยู่, และให้แน่ใจว่ากระบวนการมีสิทธิ์อ่าน.

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

### ปัญหา: Annotation ไม่แสดง

**อาการ:** โค้ดทำงานโดยไม่มีข้อผิดพลาด, แต่ไม่มีไม้บรรทัดปรากฏ.

**สาเหตุทั่วไป:** ดัชนีหน้าผิด (จำไว้หน้าตั้งแต่ 0), annotation อยู่ด้านนอกของ canvas ที่มองเห็น, หรือความทึบแสงตั้งค่าต่ำเกินไป.

**วิธีแก้เร็ว:**  

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

### ปัญหา: ปัญหาหน่วยความจำกับเอกสารขนาดใหญ่

**อาการ:** `OutOfMemoryError` หรือประสิทธิภาพช้าในไฟล์หลายร้อยหน้า.

**วิธีแก้:**  
- ทำการ dispose อินสแตนซ์ `Annotator` แต่ละตัวทันทีที่เสร็จ.  
- ประมวลผลเอกสารต่อเนื่องแทนการโหลดทั้งหมดพร้อมกัน.  
- เพิ่ม heap ของ JVM (`-Xmx4g` หรือสูงกว่า) สำหรับอินพุตขนาดใหญ่มาก.

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

### ปัญหา: ข้อผิดพลาดที่เกี่ยวกับไลเซนส์

**อาการ:** คำเตือนเกี่ยวกับข้อจำกัดของการทดลองหรือการตรวจสอบไลเซนส์ล้มเหลว.

**วิธีแก้:**  
- ยืนยันว่าเส้นทางไฟล์ไลเซนส์ถูกต้องและไฟล์สามารถอ่านได้.  
- ตรวจสอบว่าเวอร์ชันไลเซนส์ตรงกับเวอร์ชันของไลบรารี GroupDocs.Annotation ที่คุณใช้.  
- ตรวจสอบว่าไลเซนส์ชั่วคราวยังไม่หมดอายุ.

## เคล็ดลับการเพิ่มประสิทธิภาพ

When you move from a prototype to production, keep these performance considerations in mind.

### แนวทางปฏิบัติที่ดีที่สุดในการจัดการหน่วยความจำ

- **Always dispose**: Prefer try‑with‑resources or explicit `dispose()`.  
- **Batch operations**: Group multiple annotation changes in a single `Annotator` session to reduce overhead.  
- **Profiling**: Use Java profilers (VisualVM, YourKit) to monitor native memory usage.

### การเพิ่มประสิทธิภาพการประมวลผลไฟล์

- **Cache เอกสารที่เข้าถึงบ่อย** in memory when read‑only.  
- **แนะนำ PDF** มากกว่าภาพความละเอียดสูงเพื่อการเรนเดอร์ที่เร็วขึ้น; PDF มีขนาดเล็กกว่าประมาณ 30‑40 % เฉลี่ยสำหรับเนื้อหาเดียวกัน.  
- **ปรับความละเอียดของภาพ**: ลดขนาดภาพต้นฉบับลงไม่เกิน 150 DPI หากไม่ต้องการความละเอียดสูง.

### ข้อควรพิจารณาการประมวลผลพร้อมกัน

If your service processes many files in parallel, follow these rules:

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

- แต่ละเธรดต้องสร้างอินสแตนซ์ `Annotator` ของตนเอง.  
- ใช้ thread pool ที่จำกัดเพื่อหลีกเลี่ยงการใช้ทรัพยากรระบบจนหมด.  
- ตรวจสอบการใช้ CPU และ heap ภายใต้โหลด; ปรับขนาดแนวนอนหากจำเป็น.

## ตัวเลือกการกำหนดค่าขั้นสูง

Once you’ve mastered the basics, explore these advanced features to fine‑tune your annotations.

### ตัวเลือกการสไตล์แบบกำหนดเอง

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

You can define a custom `Pen` object, apply gradient fills, or even embed SVG markers at the ends of the ruler line.

### การกำหนดตำแหน่งแบบไดนามิก

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

Leverage page‑relative coordinates so the annotation automatically repositions when the document is zoomed or rotated.

### Annotation แบบมีเงื่อนไข

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

Add logic that only creates a distance annotation when a certain condition is met (e.g., when a component exceeds a tolerance threshold).

## การรวมกับระบบอื่น

Distance annotations are not isolated—they fit naturally into broader document‑management ecosystems.

### การรวมกับฐานข้อมูล

`AnnotationRecord` is a custom data model for persisting annotation metadata in a database.

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

Store annotation metadata (author, timestamp, measurement value) in a relational database for reporting and search.

### การรวมกับเว็บแอปพลิเคชัน

`DistanceAnnotationRequest` is a DTO that carries annotation parameters from the client to the server.

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

Expose a REST endpoint that accepts a file, adds a distance annotation based on JSON payload, and returns the annotated document.

### การรวมกับคลาวด์สตอเรจ

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

Read and write files directly from AWS S3, Azure Blob Storage, or Google Cloud Storage using the respective SDKs, then pass the streams to `Annotator`.

## คำถามที่พบบ่อย

**Q: เอกสารรูปแบบใดสนับสนุน distance annotations?**  
A: GroupDocs.Annotation supports PDFs, Word documents, PowerPoint presentations, Excel spreadsheets, and common image formats (PNG, JPEG, TIFF, BMP). The feature works consistently across all 50+ supported formats.

**Q: ฉันสามารถปรับแต่งลักษณะของเส้นการวัดได้หรือไม่?**  
A: Absolutely! You have full control over pen color, line style (solid, dotted, dashed), line width, and opacity. You can also define custom end‑cap symbols for specialized engineering standards.

**Q: ฉันจะจัดการการวัดในหน่วยต่าง ๆ อย่างไร?**  
A: The annotation itself displays the text you set in the `message` property. Perform any unit conversion (e.g., inches ↔ millimeters) in your Java code before assigning the message.

**Q: ผู้ใช้สามารถโต้ตอบกับ distance annotations หลังจากที่เพิ่มแล้วได้หรือไม่?**  
A: Yes. In compatible viewers (GroupDocs.Viewer, Adobe Acrobat, or your own web viewer), users can click, drag, and edit the ruler. Replies and comments remain attached to the measurement for collaborative review.

**Q: ผลกระทบต่อประสิทธิภาพของการเพิ่ม annotation จำนวนมากคืออะไร?**  
A: Adding up to several hundred annotations per document has a negligible impact (< 5 % CPU overhead). When you exceed 1,000 annotations, loading times may increase modestly, but the library remains stable and responsive.

## สรุปและขั้นตอนต่อไป

You now have a complete, production‑ready roadmap for **how to add measurement** to images and other documents in Java using GroupDocs.Annotation. By leveraging distance annotations you can turn static drawings into interactive, data‑rich assets that improve collaboration and reduce errors.

**ประเด็นสำคัญ**
- Distance annotations ให้การวัดที่แม่นยำและเป็นภาพในไฟล์กว่า 50+ รูปแบบ.  
- การทำงานสั้นกระชับ: โหลด, กำหนดค่า, เพิ่ม, บันทึก.  
- ประสิทธิภาพมั่นคงสำหรับเอกสารขนาดกลาง; ปฏิบัติตามเคล็ดลับการจัดการหน่วยความจำสำหรับไฟล์ขนาดใหญ่.  
- จุดรวม (DB, REST, cloud) ช่วยให้คุณฝัง annotation ลงในกระบวนการใดก็ได้.

### ขั้นตอนต่อไปที่แนะนำ
1. **Prototype**: คัดลอกตัวอย่างเต็ม, รันกับ PDF หรือภาพของคุณ, และตรวจสอบว่าไม้บรรทัดปรากฏตามคาด.  
2. **สำรวจประเภท annotation อื่น**: Highlight, text, และ stamp annotation สามารถเสริม distance measurement.  
3. **สร้าง UI**: ออกแบบอินเทอร์เฟซ drag‑and‑drop ที่ให้ผู้ใช้วางไม้บรรทัดโดยตรงในเบราว์เซอร์หรือคลายเอนต์.  
4. **วางแผนสำหรับการขยายขนาด**: หากคาดว่าจะมีผู้ใช้พร้อมกันหลายพัน, ใช้กลยุทธ์ thread‑pool และตรวจสอบการใช้ heap ตามที่อธิบายในส่วนประสิทธิภาพ.

---

**Last Updated:** 2026-06-16  
**Tested With:** GroupDocs.Annotation 25.2 for Java  
**Author:** GroupDocs  

**Related Resources:**  
- [GroupDocs.Annotation Documentation](https://docs.groupdocs.com/annotation/java/) - Comprehensive API documentation  
- [API Reference](https://reference.groupdocs.com/annotation/java/) - Detailed method and class references  
- [Download Page](https://releases.groupdocs.com/annotation/java/) - Latest versions and release notes  
- [Support Forum](https://forum.groupdocs.com/c/annotation/) - Community support and discussions  
- [Purchase Options](https://purchase.groupdocs.com/buy) - Commercial licensing information  
- [Free Trial](https://releases.groupdocs.com/annotation/java/) - Try before you buy  
- [Temporary License](https://purchase.groupdocs.com/temporary-license/) - Extended evaluation license

## บทเรียนที่เกี่ยวข้อง
- [วิธีเพิ่มลูกศรลงใน PDF ด้วย Java – คู่มือครบถ้วนและแนวปฏิบัติที่ดีที่สุด](/annotation/java/graphical-annotations/add-arrow-annotations-java-groupdocs/)
- [Java PDF Image Annotation - คู่มือครบถ้วนของ GroupDocs](/annotation/java/image-annotations/annotate-pdfs-java-groupdocs-image-annotations/)
- [Edit PDF Annotations Java - คู่มือครบถ้วนของ GroupDocs](/annotation/java/annotation-management/groupdocs-annotation-java-modify-pdf-annotations/)