GroupDocs"

Make sure to keep the markdown separators.

Now produce final output with all translations.

Check that we didn’t translate any code block placeholders. Keep them unchanged.

Also ensure we didn’t translate URLs.

Now produce final answer.# Java PDF Arrow Annotations - Hướng Dẫn Đầy Đủ & Thực Hành Tốt Nhất (2025)

Giới thiệu

Bạn đã bao giờ gặp khó khăn khi khiến đội ngũ của mình tập trung vào các phần cụ thể của tài liệu PDF trong quá trình xem xét chưa? Bạn không phải là người duy nhất. Dù bạn đang quản lý tài liệu kỹ thuật, hợp đồng pháp lý, hay các thông số dự án, việc chỉ ra các khu vực cụ thể để thảo luận có thể gây bối rối nếu không có công cụ phù hợp.

Đây là giải pháp: Java PDF arrow annotations sử dụng GroupDocs.Annotation API. Cách tiếp cận mạnh mẽ này cho phép bạn lập trình add arrow to pdf các tệp, làm cho việc cộng tác trở nên liền mạch và chuyên nghiệp.

Trong hướng dẫn toàn diện này, bạn sẽ khám phá cách triển khai các annotation mũi tên thực sự hoạt động trong môi trường sản xuất. Chúng tôi sẽ đề cập đến mọi thứ từ cài đặt cơ bản đến tùy chỉnh nâng cao, cùng các kịch bản thực tế mà bạn sẽ gặp (và cách xử lý chúng).

Điều gì làm cho hướng dẫn này khác biệt? Bạn sẽ nhận được những hiểu biết thực tiễn từ người đã triển khai nó trong các ứng dụng doanh nghiệp, bao gồm những lưu ý mà tài liệu không đề cập.

Câu trả lời nhanh

  • Thư viện nào cho phép tôi add arrow to pdf trong Java? GroupDocs.Annotation for Java.
  • Tôi có cần giấy phép cho môi trường sản xuất không? Có, giấy phép thương mại sẽ loại bỏ watermark.
  • Phiên bản Java nào được khuyến nghị? JDK 11 cung cấp hiệu năng tốt nhất.
  • Tôi có thể thêm nhiều mũi tên trong một tài liệu không? Chắc chắn – chỉ cần tạo nhiều đối tượng ArrowAnnotation.
  • Xử lý hàng loạt có được hỗ trợ không? Có, xử lý tài liệu trong vòng lặp và giải phóng các đối tượng Annotator.

add arrow to pdf là gì?

Thêm một annotation mũi tên có nghĩa là vẽ một dấu chỉ hướng trên trang PDF một cách lập trình. Nó giúp người xem chỉ ra các phần, làm nổi bật vấn đề, hoặc hướng dẫn người đọc qua quy trình mà không cần chỉnh sửa thủ công tệp.

Tại sao chọn GroupDocs.Annotation cho Java PDF Arrow Annotations?

Trước khi đi sâu vào mã, hãy giải quyết vấn đề quan trọng: tại sao lại dùng GroupDocs khi có các thư viện annotation PDF khác?

So sánh trung thực:

  • iText: Tốt cho các annotation cơ bản, nhưng tùy chỉnh mũi tên bị hạn chế
  • PDFBox: Miễn phí và mạnh mẽ, nhưng yêu cầu nhiều mã mẫu hơn
  • GroupDocs.Annotation: Cân bằng tốt nhất giữa tính năng và dễ sử dụng (mặc dù là thương mại)

GroupDocs tỏa sáng khi bạn cần:

  • Nhiều loại annotation trong một dự án
  • Hỗ trợ và tài liệu cấp doanh nghiệp
  • Triển khai nhanh với ít mã
  • Tính năng cộng tác tích hợp (như trả lời)

Cảnh báo: Nó không miễn phí. Nhưng nếu bạn đang xây dựng ứng dụng thương mại nơi thời gian đưa ra thị trường quan trọng, khoản đầu tư thường tự bù đắp bằng việc giảm thời gian phát triển.

Các yêu cầu trước - Những gì bạn thực sự cần

Hãy thực tế về những gì bạn cần trước khi bắt đầu. Tôi đã thấy quá nhiều nhà phát triển lao vào mà không có cấu hình đúng và lãng phí hàng giờ cho các vấn đề cấu hình.

Thư viện và phụ thuộc cần thiết

Đầu tiên, bạn cần thêm GroupDocs.Annotation vào dự án Maven của mình. Đây là cấu hình thực sự hoạt động (tôi đã kiểm tra trên nhiều dự án):

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

Mẹo chuyên nghiệp: Luôn kiểm tra phiên bản mới nhất trên trang phát hành của họ. Phiên bản 25.2 là hiện tại tại thời điểm viết, nhưng các phiên bản mới hơn thường bao gồm các bản sửa lỗi quan trọng.

Cài đặt môi trường không gây rắc rối

  • JDK 8 trở lên (tôi khuyên dùng JDK 11 để hiệu năng tốt hơn)
  • Maven 3.6+ (các phiên bản cũ đôi khi gặp vấn đề giải quyết phụ thuộc)
  • IDE: IntelliJ IDEA hoặc Eclipse (VS Code cũng được, nhưng việc gỡ lỗi dễ hơn với các IDE Java chuyên dụng)
  • Bộ nhớ: Đảm bảo JVM của bạn có ít nhất 2 GB heap cho việc xử lý các PDF lớn

Kiến thức tiên quyết (Hãy trung thực với bản thân)

Bạn nên thoải mái với:

  • Lập trình Java cơ bản (collections, xử lý ngoại lệ)
  • Quản lý phụ thuộc Maven
  • Các thao tác File I/O trong Java

Nếu bạn mới với bất kỳ mục nào trong số này, không sao – chỉ cần chuẩn bị dành thêm thời gian cho những khía cạnh đó.

Cài đặt GroupDocs.Annotation - Cách đúng

Đây là cách thiết lập GroupDocs.Annotation đúng cách, bao gồm các bước mà tài liệu thường bỏ qua.

Bước 1: Cấu hình Maven (kèm khắc phục sự cố)

Thêm repository và dependency từ trên. Nếu gặp vấn đề giải quyết phụ thuộc (đôi khi xảy ra), thử thêm đoạn này vào pom.xml của bạn:

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

Bước 2: Cài đặt giấy phép (quan trọng cho môi trường sản xuất)

Cho phát triển và thử nghiệm:

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

Thực tế: Phiên bản dùng thử sẽ thêm watermark vào kết quả của bạn. Đối với môi trường sản xuất, bạn cần giấy phép hợp lệ từ GroupDocs.

Bước 3: Mẫu khởi tạo cơ bản

Luôn sử dụng mẫu này để khởi tạo annotator:

Annotator annotator = null;
try {
    annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf");
    // Your annotation code here
} finally {
    if (annotator != null) {
        annotator.dispose();
    }
}

Tại sao cần khối try‑finally? Tin tôi đi – các đối tượng GroupDocs cần được giải phóng đúng cách để tránh rò rỉ bộ nhớ, đặc biệt khi xử lý nhiều tài liệu.

Hướng dẫn triển khai đầy đủ - Từ đầu đến sản xuất

Hãy xây dựng một triển khai annotation mũi tên thực tế mà bạn có thể sử dụng trong môi trường sản xuất.

Hiểu về Arrow Annotations trong ngữ cảnh

Arrow annotations không chỉ để trang trí – chúng là công cụ giao tiếp. Trong quy trình tài liệu, chúng thường phục vụ các mục đích sau:

  1. Phản hồi đánh giá – “Phần này cần sửa đổi”
  2. Liên kết tham chiếu – “Xem nội dung liên quan ở đây”
  3. Hướng dẫn quy trình – “Bắt đầu đánh giá từ điểm này”
  4. Nổi bật vấn đề – “Vấn đề được xác định ở khu vực này”

Hiểu ngữ cảnh giúp bạn thiết kế hệ thống annotation tốt hơn.

Bước 1: Xây dựng trả lời cho Annotation (Cách thông minh)

Trả lời làm cho annotation của bạn tương tác. Đây là cách tạo các trả lời có ý nghĩa:

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

Thực hành tốt: Bao gồm thông tin người dùng trong trả lời để theo dõi cộng tác tốt hơn. Trong môi trường sản xuất, bạn thường lấy thông tin này từ hệ thống quản lý người dùng.

Bước 2: Tạo Arrow Annotation (Với các cân nhắc thực tế)

Đây là triển khai cốt lõi với giải thích cho mỗi tham số:

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

Hãy phân tích các phần khó khăn:

  • Tọa độ Rectangle: (x, y, width, height) trong đó x,y là góc trên‑trái
  • PenColor: Sử dụng định dạng ARGB. 65535 là màu xanh sáng. Dùng công cụ chuyển đổi màu trực tuyến cho màu tùy chỉnh
  • Tùy chọn PenStyle: DOT, DASH, SOLID, DASHDOT, DASHDOTDOT
  • Opacity: 0.0 (transparent) đến 1.0 (opaque). 0.7 thường là mức hoàn hảo cho độ nhìn thấy mà không gây phiền nhiễu

Bước 3: Thêm và Lưu (kèm xử lý lỗi)

Đây là cách sẵn sàng cho sản xuất để thêm annotation:

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

Điểm quan trọng: Luôn xử lý ngoại lệ khi làm việc với các thao tác file. PDF có thể bị hỏng, đường dẫn có thể không hợp lệ, và quyền truy cập có thể gây vấn đề.

Những bẫy thường gặp và cách tránh

Sau khi triển khai trong một số dự án, đây là các vấn đề bạn có thể gặp nhất:

Vấn đề 1: Tọa độ không khớp vị trí mong muốn

Vấn đề: Mũi tên của bạn xuất hiện ở vị trí sai trên PDF.

Giải pháp: Hệ thống tọa độ PDF bắt đầu từ góc dưới‑trái, nhưng hầu hết các thư viện annotation dùng góc trên‑trái. GroupDocs xử lý chuyển đổi này, nhưng bạn có thể cần điều chỉnh dựa trên đặc điểm PDF của mình.

// If arrows appear in wrong positions, try adjusting the Y coordinate
int adjustedY = pageHeight - originalY - annotationHeight;
arrow.setBox(new Rectangle(x, adjustedY, width, height));

Vấn đề 2: Annotation biến mất sau khi lưu

Vấn đề: Annotation hiển thị trong quá trình xử lý nhưng biến mất trong PDF cuối cùng.

Giải pháp: Thường là vấn đề giấy phép. Đảm bảo giấy phép của bạn được tải đúng:

License license = new License();
try {
    license.setLicense("GroupDocs.Annotation.lic");
} catch (Exception e) {
    System.out.println("License not found, using trial mode");
}

Vấn đề 3: Rò rỉ bộ nhớ trong xử lý hàng loạt

Vấn đề: Ứng dụng hết bộ nhớ khi xử lý nhiều tài liệu.

Giải pháp: Luôn giải phóng các đối tượng annotator và cân nhắc xử lý tài liệu theo lô:

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

Kỹ thuật tùy chỉnh nâng cao

Định vị mũi tên động

Đối với các ứng dụng tương tác, bạn có thể cần định vị mũi tên dựa trên đầu vào của người dùng:

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

Định dạng mũi tên cho các trường hợp sử dụng khác nhau

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

Kịch bản triển khai thực tế

Kịch bản 1: Hệ thống đánh giá tài liệu

Bạn đang xây dựng hệ thống đánh giá tài liệu nơi nhiều người dùng có thể thêm phản hồi:

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

Kịch bản 2: Phát hiện vấn đề tự động

Tích hợp với công cụ phân tích để tự động làm nổi bật các vấn đề tiềm năng:

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

Mẹo tối ưu hiệu năng

Thực hành tốt quản lý bộ nhớ

Khi xử lý tài liệu lớn hoặc nhiều tệp:

  1. Sử dụng mẫu try‑with‑resources (nếu phiên bản của bạn hỗ trợ):
try (Annotator annotator = new Annotator("document.pdf")) {
    // Your annotation code
} // Automatically disposed
  1. Xử lý theo lô:
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);
    }
}
  1. Giám sát việc sử dụng bộ nhớ:
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");

Các cân nhắc về hiệu năng CPU

  • Tránh tạo đối tượng không cần thiết trong vòng lặp
  • Tái sử dụng các đối tượng màu và kiểu khi có thể
  • Xem xét xử lý song song cho các tài liệu độc lập (nhưng chú ý tới việc sử dụng bộ nhớ)

Hướng dẫn khắc phục - Giải pháp cho các vấn đề thực tế

Vấn đề: Annotation không hiển thị trong Adobe Reader

Triệu chứng: Annotation hiển thị trong ứng dụng của bạn nhưng không trong Adobe Reader hoặc các trình xem PDF khác.

Giải pháp:

  1. Đảm bảo bạn đang lưu với tiêu chuẩn PDF đúng:
// Try different save options if available
SaveOptions saveOptions = new SaveOptions();
saveOptions.setAnnotationType(AnnotationType.All);
annotator.save(outputPath, saveOptions);
  1. Kiểm tra tính tương thích phiên bản PDF – các phiên bản PDF cũ hơn có thể không hỗ trợ tất cả các tính năng annotation.

Vấn đề: Hiệu năng kém với PDF lớn

Triệu chứng: Ứng dụng chậm hoặc không phản hồi khi làm việc với tài liệu lớn.

Giải pháp:

  1. Xử lý từng trang riêng lẻ thay vì toàn bộ tài liệu:
// Process specific pages
LoadOptions loadOptions = new LoadOptions();
loadOptions.setLoadCharts(false); // Skip charts if not needed
Annotator annotator = new Annotator(documentPath, loadOptions);
  1. Sử dụng streaming khi có thể cho các tệp rất lớn.

  2. Tăng kích thước heap JVM:

java -Xmx4g -jar your-application.jar

Vấn đề: Vấn đề hiển thị màu

Triệu chứng: Màu sắc xuất hiện khác so với mong đợi trong PDF cuối cùng.

Giải pháp: Sử dụng định nghĩa không gian màu đúng:

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

Kiểm thử triển khai của bạn

Kiểm thử đơn vị Arrow Annotations

Đây là cấu trúc kiểm thử thực tế:

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

Kiểm thử tích hợp

Kiểm thử với các loại và kích thước PDF khác nhau để đảm bảo triển khai của bạn hoạt động trong mọi kịch bản.

Kết luận

Bây giờ bạn đã có bộ công cụ hoàn chỉnh để triển khai Java PDF arrow annotations bằng GroupDocs.Annotation. Điều này không chỉ là thêm mũi tên vào PDF – mà còn là xây dựng các tính năng cộng tác tài liệu mạnh mẽ, thực sự hoạt động trong môi trường sản xuất.

Những điểm chính từ hướng dẫn này:

  • Luôn xử lý tài nguyên đúng cách (sử dụng khối try‑finally)
  • Kiểm thử với các loại và kích thước PDF khác nhau
  • Xem xét quản lý bộ nhớ cho xử lý hàng loạt
  • Triển khai xử lý lỗi thích hợp cho môi trường sản xuất
  • Định dạng annotation phù hợp với mục đích

Bước tiếp theo của bạn: Bắt đầu với một prototype đơn giản sử dụng triển khai cơ bản, sau đó dần dần thêm các tính năng nâng cao như định vị động và tùy chỉnh kiểu dáng khi yêu cầu của bạn phát triển.

Sẵn sàng tiến xa hơn? Khám phá các tính năng khác của GroupDocs.Annotation như annotation văn bản, annotation vùng, và watermark. Các mẫu bạn đã học ở đây áp dụng cho mọi loại annotation.

Câu hỏi thường gặp

Q: Tôi có thể thêm arrow annotation vào PDF được bảo mật bằng mật khẩu không?
A: Có, nhưng bạn cần cung cấp mật khẩu khi tạo Annotator:

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

Q: Làm thế nào để xử lý hàng loạt nhiều tài liệu một cách hiệu quả?
A: Xử lý tài liệu theo các lô nhỏ và giải phóng tài nguyên đúng cách:

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: Số lượng annotation tối đa cho mỗi tài liệu là bao nhiêu?
A: GroupDocs không có giới hạn cứng, nhưng giới hạn thực tế phụ thuộc vào bộ nhớ, khả năng của trình xem PDF và yêu cầu hiệu năng. Đối với số lượng lớn (1000+), áp dụng các kỹ thuật tối ưu hiệu năng đã thảo luận ở trên.

Q: Tôi có thể tùy chỉnh hình dạng mũi tên vượt quá các tùy chọn tiêu chuẩn không?
A: GroupDocs.Annotation cung cấp các hình dạng mũi tên tiêu chuẩn. Đối với hình dạng tùy chỉnh, bạn có thể cần sử dụng area annotation, kết hợp nhiều annotation đơn giản, hoặc chuyển sang thư viện đồ họa chuyên biệt hơn.

Q: Làm sao để xử lý các hệ thống tọa độ PDF khác nhau?
A: GroupDocs thường tự động xử lý chuyển đổi tọa độ. Nếu gặp vấn đề:

// 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: Chi phí giấy phép cho môi trường sản xuất là bao nhiêu?
A: GroupDocs cung cấp nhiều mô hình giấy phép (Developer, Site, OEM). Kiểm tra mức giá mới nhất trên trang giá của GroupDocs.

Q: Làm sao tích hợp điều này với ứng dụng Spring Boot?
A: Tạo một lớp service cho các thao tác annotation:

@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: Tôi có thể trích xuất các arrow annotation hiện có từ PDF không?
A: Có, sử dụng phương thức get() để lấy các annotation hiện có:

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

Tài nguyên bổ sung


Cập nhật lần cuối: 2026-02-21
Đã kiểm tra với: GroupDocs.Annotation 25.2 for Java
Tác giả: GroupDocs