Pendahuluan
Anotasi PDF mencakup beragam elemen interaktif dan visual yang dilapiskan di atas konten halaman: catatan teks tempel, hyperlink, teks yang disorot atau dicoret, bentuk geometris, goresan tinta, lampiran file, dan stempel persetujuan. Aspose.PDF FOSS untuk C++ mewakili setiap elemen ini sebagai subclass konkret dari Annotation, sehingga kode yang menelusuri anotasi halaman dapat bekerja secara generik terhadap kelas dasar sambil tetap dapat mengakses anggota spesifik subtipe — seperti Icon() pada TextAnnotation atau Action() pada LinkAnnotation — bila diperlukan.
Enum Annotations::AnnotationType dalam pustaka ini mencantumkan subtipe yang dikenalnya: Text, Link, FreeText, Line, Square, Circle, Polygon, PolyLine, Highlight, Underline, Squiggly, StrikeOut, Stamp, Caret, Ink, Popup, FileAttachment, Sound, Movie, Widget, Screen, PrinterMark, Watermark, Redaction, RichMedia, dan beberapa lainnya. Setiap nilai dipetakan ke kelas konkret — CircleAnnotation, SquareAnnotation, PolygonAnnotation, PolylineAnnotation, dan LineAnnotation untuk markup bentuk; FreeTextAnnotation dan InkAnnotation untuk teks bebas dan goresan yang digambar; FileAttachmentAnnotation, SoundAnnotation, MovieAnnotation, ScreenAnnotation, dan RichMediaAnnotation untuk konten tersemat; serta WidgetAnnotation untuk tampilan bidang AcroForm.
Postingan ini membahas basis API Annotation dan AnnotationCollection, menambahkan catatan teks dan tautan, mendeteksi jenis anotasi saat memuat dokumen yang ada, serta membaca atau memperbarui metadata markup dan stempel. Aspose.PDF FOSS untuk C++ adalah pustaka C++20 tanpa ketergantungan runtime selain pustaka standar; header disertakan langsung dari direktori aspose/pdf/annotations/ dan pustaka dibangun sebagai target CMake.
Apa yang Disertakan
Annotation dan AnnotationCollection
Annotation adalah kelas dasar untuk setiap subtipe anotasi. Ia menyediakan properti bersama: Rect() / Rect(value) untuk persegi bidang batas anotasi, Contents() untuk teks yang terkait, Name(), Color(), Flags() (bitmask AnnotationFlags — Print, Hidden, Invisible, NoZoom, ReadOnly, dan lain-lain), Border(), Width() / Height(), AnnotationType(), dan PageIndex(). AnnotationCollection menyimpan anotasi pada satu halaman dan dapat diakses melalui Page.Annotations().
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/annotation_collection.hpp>
#include <iostream>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Annotations;
Document doc("reviewed.pdf");
AnnotationCollection& annots = doc.Pages()[1].Annotations();
std::cout << "Annotation count: " << annots.Count() << "\n";
for (int i = 0; i < annots.Count(); ++i) {
Annotation& a = annots[i];
std::cout << " " << a.Name() << ": " << a.Contents() << "\n";
}
AnnotationCollection juga menyediakan Add(annotation), Add(annotation, considerRotation), Delete(index), Delete(annotation), Clear(), Remove(annotation), Contains(annotation), dan IsReadOnly().
Catatan Teks dengan TextAnnotation
TextAnnotation mewakili komentar catatan tempel yang familiar. Selain anggota dasar Annotation, ia menambahkan Open() / Open(value) untuk mengontrol apakah catatan ditampilkan dalam keadaan terbuka, serta Icon() / Icon(value) (nilai TextIcon seperti Note, Comment, Key, Help, atau Check) untuk memilih glif ikon.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Annotations;
Document doc("input.pdf");
TextAnnotation note{doc};
note.Rect(Rectangle{100.0, 700.0, 200.0, 720.0, false});
note.Contents("Reviewed by QA");
note.Icon(TextIcon::Comment);
note.Open(true);
doc.Pages()[1].Annotations().Add(note);
doc.Save("annotated.pdf");
Tautan dan Aksi dengan LinkAnnotation
LinkAnnotation menempelkan wilayah yang dapat diklik ke sebuah halaman. Itu dibangun dari Page pemilik dan sebuah Rectangle, dan perilakunya diatur dengan Action(value) — setiap subclass PdfAction, termasuk NamedAction (navigasi yang telah ditentukan seperti PredefinedAction::LastPage), GoToAction, GoToURIAction, atau JavascriptAction. Destination() membaca target IAppointment dari tautan, dan Highlighting() / Highlighting(value) mengatur HighlightingMode (None, Invert, Outline, Push, Toggle) yang diterapkan ketika tautan diaktifkan.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/link_annotation.hpp>
#include <aspose/pdf/annotations/named_action.hpp>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Annotations;
Document doc;
Page page = doc.Pages().Add();
LinkAnnotation link{page, Rectangle{0.0, 0.0, 100.0, 20.0, false}};
link.Action(NamedAction{PredefinedAction::LastPage});
link.Highlighting(HighlightingMode::Push);
page.Annotations().Add(link);
Mendeteksi Tipe Anotasi saat Memuat
Ketika sebuah dokumen dibuka, anotasi yang ada sudah terisi dalam AnnotationCollection setiap halaman, dan AnnotationType() mengidentifikasi subtipe konkret mana yang diwakili oleh setiap entri. Ini memungkinkan kode pemanggil melakukan percabangan berdasarkan nilai enum tanpa harus mengetahui sebelumnya tipe anotasi apa yang terdapat dalam PDF tertentu.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/annotation_type.hpp>
#include <iostream>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Annotations;
Document doc("mixed-annotations.pdf");
auto& annots = doc.Pages()[1].Annotations();
for (int i = 0; i < annots.Count(); ++i) {
switch (annots[i].AnnotationType()) {
case AnnotationType::Text: std::cout << "Text note\n"; break;
case AnnotationType::Link: std::cout << "Link\n"; break;
case AnnotationType::Circle: std::cout << "Circle shape\n"; break;
case AnnotationType::Square: std::cout << "Square shape\n"; break;
case AnnotationType::Highlight: std::cout << "Highlight\n"; break;
case AnnotationType::Stamp: std::cout << "Stamp\n"; break;
default: break;
}
}
Metadata Anotasi Markup
MarkupAnnotation adalah dasar untuk anotasi yang membawa metadata peninjau: Title() (penulis), Subject(), RichText() untuk teks komentar terformat, dan Opacity() untuk pencampuran dengan konten halaman. InReplyTo() dan Popup() menghubungkan anotasi markup dengan thread komentar yang menjadi miliknya, dan ClearState() / SetReviewState(state, userName) mengelola status peninjauannya. HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation, dan SquigglyAnnotation adalah subtipe markup yang diposisikan di atas teks; dasar bersama mereka TextMarkupAnnotation menambahkan QuadPoints() untuk mendefinisikan wilayah segiempat yang dicakup dan GetMarkedText() untuk membaca kembali teks di bawahnya.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/markup_annotation.hpp>
using namespace Aspose::Pdf::Annotations;
for (int i = 0; i < annots.Count(); ++i) {
if (auto* markup = dynamic_cast<MarkupAnnotation*>(&annots[i])) {
markup->Title("QA Reviewer");
markup->Subject("Layout issue");
markup->Opacity(0.6);
}
}
Anotasi Stempel dengan StampAnnotation
StampAnnotation menempatkan stempel yang telah ditentukan atau kustom pada sebuah halaman. Icon() / Icon(value) memilih nilai StampIcon — Approved, Draft, Confidential, Final, Expired, NotApproved, ForComment, TopSecret, dan lainnya — dan Image() / Image(value) menyediakan byte gambar mentah untuk tampilan stempel kustom alih-alih ikon bawaan.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/stamp_annotation.hpp>
using namespace Aspose::Pdf::Annotations;
for (int i = 0; i < annots.Count(); ++i) {
if (auto* stamp = dynamic_cast<StampAnnotation*>(&annots[i])) {
stamp->Icon(StampIcon::Approved);
}
}
Mulai Cepat
Tambahkan pustaka sebagai subdirektori CMake dan tautkan terhadap target aspose_pdf_foss:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
Buka dokumen, tambahkan catatan teks, dan baca kembali jumlah anotasi:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>
#include <iostream>
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Annotations;
int main() {
Document doc("input.pdf");
TextAnnotation note{doc};
note.Rect(Rectangle{100.0, 700.0, 200.0, 720.0, false});
note.Contents("Reviewed by QA");
note.Icon(TextIcon::Comment);
doc.Pages()[1].Annotations().Add(note);
doc.Save("annotated.pdf");
std::cout << "Annotations on page 1: "
<< doc.Pages()[1].Annotations().Count() << "\n";
}
Format yang Didukung
| Format | Ekstensi | Baca | Tulis |
|---|---|---|---|
| BMP | .bmp | — | ✓ |
| JPEG | .jpg | — | ✓ |
| TIFF | .tiff | — | ✓ |
| Text | .txt | — | ✓ |
| SVG | .svg | ✓ | — |
Dukungan format berlaku untuk rendering halaman dan opsi pemuatan pada tingkat dokumen; entri ini mencerminkan jalur ekspor yang dikonfirmasi (BmpDevice, JpegDevice, TiffDevice, TextDevice) dan impor (SvgLoadOptions) alih-alih serialisasi khusus anotasi.
Sumber Terbuka & Lisensi
Aspose.PDF FOSS untuk C++ dirilis di bawah lisensi MIT. Kode sumber tersedia di https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp, dan perpustakaan dapat digunakan dalam proyek komersial dan sumber terbuka tanpa biaya lisensi.