Làm việc với chú thích PDF

Làm việc với chú thích PDF

Lấm việc với chú thích PDF

Các chú thích PDF trong Aspose.PDF FOSS cho C++ được biểu diễn bởi lớp cộn Annotation và các loại con cụ thể của nó (TextAnnotation, LinkAnnotation, HighlightAnnotation, FreeTextAnnotation, CircleAnnotation, WatermarkAnnotation, WidgetAnnotation, và các loại khác). Mỗi trang cung cấp các chú thích của mình thông qua Page.Annotations(), trả về một AnnotationCollection. Hướng dẫn này bao gồm việc thêm chú thích vào một trang, duyệt và xóa chúng, đọc chú thích từ tài liệu hiện có, gắn các hành động liên kết, tùy chỉnh giao diện và lập phẳng các chú thích.


Thêm chú thích vào một trang

Tạo một thể hiện chú thích cụ thể, đặt vị trí cho nó bằng Rectangle, và thêm nó vào bộ sưu tập của trang bằng AnnotationCollection.Add(). TextAnnotation đại diện cho một bình luận kiểu ghi chú dán được neo vào một điểm trên trang:

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>
#include <aspose/pdf/rectangle.hpp>

int main() {
    Aspose::Pdf::Document doc("input.pdf");
    auto& page = doc.Pages()[1];

    Aspose::Pdf::Annotations::TextAnnotation note(doc);
    note.Rect(Aspose::Pdf::Rectangle(100.0, 700.0, 200.0, 720.0, false));
    note.Contents("Reviewed and approved");

    page.Annotations().Add(note);
    doc.Save("annotated.pdf");
}

Annotation.Contents() / Contents(value) lấy và đặt văn bản ghi chú, và Annotation.Rect() / Rect(value) định vị chú thích trên trang.


Duyệt và Xoá chú thích

AnnotationCollection hỗ trợ đếm, truy cập theo chỉ mục, kiểm tra thành viện, và xóa thêm giá trị hoặc thêm chỉ mục:

#include <aspose/pdf/document.hpp>

int main() {
    Aspose::Pdf::Document doc("input.pdf");
    auto& annotations = doc.Pages()[1].Annotations();

    std::cout << "Annotation count: " << annotations.Count() << "\n";

    for (int i = 0; i < annotations.Count(); ++i) {
        std::cout << "Contents: " << annotations[i].Contents() << "\n";
    }

    if (annotations.Count() > 0) {
        annotations.Delete(0);   // remove by index
    }
    annotations.Clear();         // remove everything
}

AnnotationCollection.Contains(annotation) và Remove(annotation) hoạt động trên một tham chiếu chú thích cụ thể; Delete(index) xóa theo vị trí, và Delete(annotation) xóa một chú thích cụ thể mà không cần chỉ mục của nó. IsReadOnly() báo cáo liệu bộ sưu tập có thể được sửa đổi hay không.


Đọc các chú thích từ tài liệu hiện có

Khi tài liệu được tải, các chú thích của nó đã được điền sẵn và có thể được kiểm tra mà không cần thêm bất kỳ thứ gì. Annotation.AnnotationType() báo cáo kiểu phụ (AnnotationType::Text, AnnotationType::Highlight, AnnotationType::Link, AnnotationType::FreeText, AnnotationType::FileAttachment, AnnotationType::Watermark, và các loại khác):

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/annotation_type.hpp>

int main() {
    Aspose::Pdf::Document doc("annotated.pdf");
    auto& annotations = doc.Pages()[1].Annotations();

    for (int i = 0; i < annotations.Count(); ++i) {
        auto& a = annotations[i];
        if (a.AnnotationType() == Aspose::Pdf::Annotations::AnnotationType::Text) {
            std::cout << "Note: " << a.Contents() << "\n";
        }
    }
}

Thứ tự và kiểu phụ của chú thích được giữ nguyên qua quá trình lưu/tải lại, vì vậy mã truy cập Annotations() sau khi tải tài liệu sẽ thấy cùng một chuỗi như khi tệp được ghi.


Chú thích Liên kết và Hành động

LinkAnnotation gắn một vùng có thể nhấp vào vào trang và phát sinh một PdfAction khi được kích hoạt. NamedAction chuyển tới một mục tiêu điều hướng đã định sẵn, JavascriptAction chạy một chuỗi ECMAScript, và SubmitFormAction gửi dữ liệu biểu mẫu tới một URL thông qua một FileSpecification:

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/link_annotation.hpp>
#include <aspose/pdf/annotations/named_action.hpp>
#include <aspose/pdf/annotations/predefined_action.hpp>
#include <aspose/pdf/rectangle.hpp>

int main() {
    Aspose::Pdf::Document doc;
    auto page = doc.Pages().Add();

    Aspose::Pdf::Annotations::LinkAnnotation link(
        page, Aspose::Pdf::Rectangle(0.0, 0.0, 100.0, 20.0, false));
    link.Action(Aspose::Pdf::Annotations::NamedAction(
        Aspose::Pdf::Annotations::PredefinedAction::LastPage));

    page.Annotations().Add(link);
    doc.Save("linked.pdf");
}

LinkAnnotation.Action(value) chấp nhận bất kỳ kiểu phụ PdfAction nào và sao chép nó nội bộ, vì vậy chú thích giữ lại bản sao riêng của hành động. LinkAnnotation.Destination() / Destination(value) thiết lập một mục tiêu điều hướng rõ ràng thay vì một hành động, và Highlighting() / Highlighting(value) kiểm soát phản hồi hình ảnh được hiển thị khi liên kết được nhấp.


Diện mạo Chú thích: Viền, Cờ và Màu sắc

Mỗi Annotation tiết lộ một Border, một trường bit của AnnotationFlags, và một Color dùng để hiển thị giao diện của nó:

#include <aspose/pdf/annotations/border_style.hpp>
#include <aspose/pdf/annotations/annotation_flags.hpp>
#include <aspose/pdf/color.hpp>

// 'note' is an existing Annotation reference, e.g. from AnnotationCollection.
note.Border().Width(2);
note.Border().Style(Aspose::Pdf::Annotations::BorderStyle::Dashed);
note.Flags(Aspose::Pdf::Annotations::AnnotationFlags::Print);
note.Color(Aspose::Pdf::Color::Red());

Border.Style() chấp nhận BorderStyle::Solid, Dashed, Beveled, Inset, hoặc Underline. Border.Effect() còn hỗ trợ một đường viền BorderEffect::Cloudy với EffectIntensity() điều khiển mức độ nổi bật của nó. AnnotationFlags là một trường bit — kết hợp các giá trị như Print, NoZoom, ReadOnly, và LockedContents để kiểm soát cách một chú thích hoạt động trong trình xem mà không thay đổi nội dung hiển thị.


Làm phẳng chú thích

Một chú thích duy nhất có thể được làm phẳng — hợp nhất vào nội dung trang và trở nên không tương tác — bằng cách gọi trực tiếp Annotation.Flatten():

#include <aspose/pdf/document.hpp>

int main() {
    Aspose::Pdf::Document doc("annotated.pdf");
    auto& annotations = doc.Pages()[1].Annotations();
    for (int i = 0; i < annotations.Count(); ++i) {
        annotations[i].Flatten();
    }
    doc.Save("flattened.pdf");
}

Đối với các thao tác chú thích trên toàn bộ tài liệu, PdfAnnotationEditor tuân theo mẫu Facade chung được sử dụng trên API: gắn một tài liệu nguồn bằng BindPdf(), áp dụng một hoặc nhiều thao tác chú thích, sau đó ghi kết quả bằng Save():

#include <aspose/pdf/facades/pdf_annotation_editor.hpp>

int main() {
    Aspose::Pdf::Facades::PdfAnnotationEditor editor;
    editor.BindPdf("annotated.pdf");
    editor.FlatteningAnnotations();
    editor.Save("flattened.pdf");
}

PdfAnnotationEditor.DeleteAnnotations() xóa mọi chú thích khỏi tài liệu đã gắn; DeleteAnnotations(annotType) giới hạn việc xóa chỉ một AnnotationType duy nhất. ImportAnnotationsFromXfdf(xfdfFile) và ImportAnnotationsFromFdf(fdfFile) tải dữ liệu chú thích được xuất từ một trình xem PDF khác.


Mẹo và Thực hành tốt nhất

  • Luôn thêm một chú thích mới được tạo vào Page.Annotations() trước khi gọi Document.Save() — một chú thích không bao giờ được thêm vào bộ sưu tập sẽ không được ghi vào tệp đầu ra.
  • Sử dụng AnnotationCollection.Contains(annotation) trước khi gọi Remove() nếu bạn không chắc annotation vẫn còn; Remove() trả về false thay vì ném lỗi khi annotation không tồn tại.
  • Kiểm tra Annotation.AnnotationType() trước khi chuyển đổi kiểu hoặc nhánh dựa trên hành vi subtype khi duyệt qua các annotation được tải từ tệp PDF không đáng tin cậy hoặc của bên thứ ba.
  • Làm phẳng các annotation bằng Annotation.Flatten() (hoặc PdfAnnotationEditor.FlatteningAnnotations() cho toàn bộ tài liệu) trước khi lưu trữ tài liệu để những người xem trên các công cụ khác thấy cùng một giao diện mà bạn đã tạo.
  • AnnotationFlags là một bitfield — kết hợp các cờ với các giá trị nguyên cơ bản của enum thay vì giả định chỉ có một cờ có thể hoạt động cùng một lúc.

Các vấn đề phổ biến

Vấn đềNguyên nhânCách khắc phục
Ghi chú không hiển thị sau khi lưuGhi chú đã được tạo nhưng không bao giờ được thêm vào Page.Annotations()Gọi page.Annotations().Add(annotation) trước doc.Save()
Remove() trả về falseTham chiếu ghi chú được truyền không khớp với mục nào hiện có trong bộ sưu tậpSử dụng Contains() trước, hoặc xóa theo chỉ mục bằng Delete(index)
Kiểu chú thích sai sau khi tải lạiMã đã giả định một kiểu phụ cụ thể mà không kiểm tra AnnotationType()Rẽ nhánh dựa trên Annotation.AnnotationType() trước khi xử lý đối tượng như một kiểu phụ cụ thể
Hành động liên kết dường như chưa được đặt sau khi gánMột PdfAction cục bộ đã ra khỏi phạm vi; LinkAnnotation.Action() trả về bản sao đã sao chép của chú thích, không phải đối tượng gốcĐọc lại hành động qua link.Action() thay vì giữ lại biến cục bộ gốc
Thao tác PdfAnnotationEditor không có hiệu lựcBindPdf() không được gọi, hoặc đã được gọi với một đường dẫn không tồn tạiXác nhận BindPdf() thành công trước khi gọi FlatteningAnnotations() hoặc DeleteAnnotations()

FAQ

Làm sao để thêm annotation dạng bình luận vào một trang PDF?

Tạo một TextAnnotation với Document mục tiêu, đặt Rect() và Contents() của nó, sau đó thêm nó vào page.Annotations() trước khi lưu.

Làm sao tôi có thể biết tôi đang xem loại chú thích nào?

Gọi Annotation.AnnotationType(), hàm này trả về một giá trị enum AnnotationType như Text, Link, Highlight, FreeText, FileAttachment, hoặc Watermark.

Một chú thích có thể mang hơn một cờ không?

Có. AnnotationFlags là một bitfield (Default, Invisible, Hidden, Print, NoZoom, ReadOnly, LockedContents, và các giá trị khác), vì vậy nhiều cờ có thể được kết hợp trên một chú thích duy nhất.

Sự khác nhau giữa việc làm phẳng một chú thích và làm phẳng một tài liệu là gì?

Annotation.Flatten() hợp nhất một chú thích duy nhất vào nội dung của trang đó. PdfAnnotationEditor.FlatteningAnnotations() (có thể được giới hạn theo phạm vi trang và AnnotationType thông qua overload chấp nhận start, end, và annotType) làm phẳng toàn bộ tài liệu đã ràng buộc trong một lần gọi.

Làm sao tôi có thể xóa tất cả các chú thích của một loại khỏi tài liệu?

Ràng buộc tài liệu bằng PdfAnnotationEditor.BindPdf(), gọi DeleteAnnotations(annotType) với mục tiêu AnnotationType, sau đó Save() kết quả.


API Reference Tóm tắt

Lớp/Phương thứcMô tả
AnnotationLớp cơ sở trừu tượng cho tất cả các kiểu phụ chú PDF
Annotation.Rect() / Rect(value)Lấy hoặc đặt hình chữ nhật giới hạn của chú thích
Annotation.Contents() / Contents(value)Lấy hoặc đặt nội dung văn bản của chú thích
Annotation.AnnotationType()Trả về giá trị enum AnnotationType cho chú thích này
Annotation.Flags() / Flags(value)Lấy hoặc đặt trường bit AnnotationFlags
Annotation.Border() / Border(value)Lấy hoặc đặt Border của chú thích
Annotation.Color() / Color(value)Lấy hoặc đặt hiển thị của chú thích Color
Annotation.Flatten()Kết hợp chú thích này vào nội dung trang, làm cho nó không tương tác
AnnotationCollectionBộ sưu tập có thứ tự các chú thích trên một trang, được trả về bởi Page.Annotations()
AnnotationCollection.Add(annotation) / Add(annotation, considerRotation)Thêm một chú thích vào bộ sưu tập
AnnotationCollection.Count()Trả về số lượng chú thích trong bộ sưu tập
AnnotationCollection.Contains(annotation)Báo cáo xem bộ sưu tập có chứa chú thích đã cho hay không
AnnotationCollection.Remove(annotation)Xóa một chú thích cụ thể; trả về false nếu không tìm thấy
AnnotationCollection.Delete(index) / Delete(annotation)Xóa một chú thích theo chỉ mục hoặc theo tham chiếu
AnnotationCollection.Clear()Xóa tất cả các chú thích khỏi bộ sưu tập
TextAnnotationChú thích kiểu ghi chú dính với Open() và Icon() (TextIcon)
LinkAnnotationVùng có thể nhấp chuột gửi một PdfAction qua Action() / Action(value)
LinkAnnotation.Destination() / Destination(value)Lấy hoặc đặt một mục tiêu điều hướng cụ thể
HighlightAnnotationĐánh dấu một đoạn văn bản bằng màu tô sáng
FreeTextAnnotationHiển thị một chú thích văn bản; được cấu hình qua Justification(), DefaultAppearanceObject(), Callout()
CircleAnnotationVẽ một hình elip bên trong hình chữ nhật của chú thích
WatermarkAnnotationChú thích phủ lên với một bộ truy cập Opacity() / Opacity(value) accessor
WidgetAnnotationChú thích dạng hiển thị của trường biểu mẫu với ReadOnly(), Required(), Exportable(), DefaultAppearance()
NamedActionHành động điều hướng được định trước (PredefinedAction enum) có thể gắn vào một LinkAnnotation
JavascriptActionChạy một chuỗi ECMAScript thông qua Script() / GetECMAScriptString()
SubmitFormActionGửi dữ liệu biểu mẫu tới một URL FileSpecification thông qua Url() / Url(value)
BorderViền chú thích với Width(), Style() (BorderStyle), Effect() (BorderEffect)
PdfAnnotationEditorGiao diện cho việc nhập, sửa đổi, làm phẳng và xóa chú thích trên toàn bộ tài liệu
PdfAnnotationEditor.FlatteningAnnotations()Làm phẳng các chú thích trên tài liệu đã ràng buộc
PdfAnnotationEditor.DeleteAnnotations(annotType)Xóa tất cả các chú thích của AnnotationType được chỉ định
PdfAnnotationEditor.ImportAnnotationsFromXfdf(xfdfFile)Nhập chú thích từ tệp XFDF

Xem thêm

 Tiếng Việt