Wstęp
Adnotacje PDF obejmują szeroki zakres interaktywnych i wizualnych elementów nakładanych na treść strony: przyklejone notatki tekstowe, hiperłącza, podświetlony lub przekreślony tekst, kształty geometryczne, odciski pióra, załączniki plików i pieczątki zatwierdzające. Aspose.PDF FOSS dla C++ reprezentuje każdy z nich jako konkretną podklasę Annotation, dzięki czemu kod przeglądający adnotacje strony może działać ogólnie na klasie bazowej, a jednocześnie mieć dostęp do członków specyficznych dla podtypów — takich jak Icon() w TextAnnotation czy Action() w LinkAnnotation — w razie potrzeby.
Enum Annotations::AnnotationType w bibliotece wymienia rozpoznawane podtypy: 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 i kilka innych. Każda wartość mapuje się na konkretną klasę — CircleAnnotation, SquareAnnotation, PolygonAnnotation, PolylineAnnotation i LineAnnotation dla oznaczeń kształtów; FreeTextAnnotation i InkAnnotation dla wolnego tekstu i rysowanych odcinków; FileAttachmentAnnotation, SoundAnnotation, MovieAnnotation, ScreenAnnotation oraz RichMediaAnnotation dla osadzonej zawartości; oraz WidgetAnnotation dla wyglądu pól AcroForm.
Ten wpis omawia bazowy API Annotation i AnnotationCollection, dodawanie notatek tekstowych i linków, wykrywanie typów adnotacji przy ładowaniu istniejącego dokumentu oraz odczyt lub aktualizację metadanych znaczników i pieczątek. Aspose.PDF FOSS dla C++ jest biblioteką C++20 bez zależności w czasie działania poza standardową biblioteką; nagłówki są dołączane bezpośrednio z katalogu aspose/pdf/annotations/, a biblioteka jest budowana jako cel CMake.
Co znajduje się w pakiecie
Annotation i AnnotationCollection
Annotation jest klasą bazową dla każdego podtypu adnotacji. Udostępnia wspólne właściwości: Rect() / Rect(value) określające prostokąt ograniczający adnotację, Contents() zwracające powiązany tekst, Name(), Color(), Flags() (maskę bitową AnnotationFlags — Print, Hidden, Invisible, NoZoom, ReadOnly i inne), Border(), Width() / Height(), AnnotationType() oraz PageIndex(). AnnotationCollection przechowuje adnotacje na pojedynczej stronie i jest dostępna przez 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 udostępnia także Add(annotation), Add(annotation, considerRotation), Delete(index), Delete(annotation), Clear(), Remove(annotation), Contains(annotation) oraz IsReadOnly().
Notatki tekstowe z TextAnnotation
TextAnnotation reprezentuje znany komentarz w formie przyklejonej notatki. Oprócz członków bazowych Annotation, dodaje Open() / Open(value) służące do kontrolowania, czy notatka jest wyświetlana rozwinięta, oraz Icon() / Icon(value) (wartość TextIcon, taką jak Note, Comment, Key, Help lub Check) pozwalającą wybrać glif ikony.
#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");
Linki i akcje z LinkAnnotation
LinkAnnotation dołącza klikalny obszar do strony. Jest tworzony z należącej do niej Page i Rectangle, a jego zachowanie ustawia się za pomocą Action(value) — dowolnej podklasy PdfAction, w tym NamedAction (wstępnie zdefiniowana nawigacja, taka jak PredefinedAction::LastPage), GoToAction, GoToURIAction lub JavascriptAction. Destination() odczytuje docelowy IAppointment linku, a Highlighting() / Highlighting(value) ustawia HighlightingMode (None, Invert, Outline, Push, Toggle) stosowany podczas aktywacji linku.
#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);
Wykrywanie typów adnotacji podczas ładowania
Kiedy dokument zostaje otwarty, istniejące adnotacje są już wypełnione w AnnotationCollection każdej strony, a AnnotationType() identyfikuje, który konkretny podtyp reprezentuje każdy wpis. Dzięki temu kod wywołujący może rozgałęziać się na podstawie wartości wyliczenia, nie znając z góry, jakie typy adnotacji zawiera dany PDF.
#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;
}
}
Metadane Markup Annotation
MarkupAnnotation jest bazą dla adnotacji zawierających metadane recenzenta: Title() (autor), Subject(), RichText() dla sformatowanego tekstu komentarza oraz Opacity() do mieszania z treścią strony. InReplyTo() i Popup() łączą adnotację markup z wątkiem komentarzy, do którego należy, a ClearState() / SetReviewState(state, userName) zarządzają jej stanem recenzji. HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation i SquigglyAnnotation są podtypami markup umieszczonymi nad tekstem; ich wspólna baza TextMarkupAnnotation dodaje QuadPoints() definiujące pokrywane obszary czworokątne oraz GetMarkedText() umożliwiającą odczytanie tekstu pod spodem.
#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);
}
}
Adnotacje pieczęci z StampAnnotation
StampAnnotation umieszcza wstępnie zdefiniowany lub własny stempel na stronie. Icon() / Icon(value) wybiera wartość StampIcon — Approved, Draft, Confidential, Final, Expired, NotApproved, ForComment, TopSecret i inne — a Image() / Image(value) dostarcza surowe bajty obrazu dla własnego wyglądu stempla zamiast wbudowanej ikony.
#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);
}
}
Szybki start
Dodaj bibliotekę jako podkatalog CMake i połącz ją z celem aspose_pdf_foss:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
Otwórz dokument, dodaj notatkę tekstową i odczytaj liczbę adnotacji:
#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";
}
Obsługiwane formaty
| Format | Rozszerzenie | Odczyt | Zapisz |
|---|---|---|---|
| BMP | .bmp | — | ✓ |
| JPEG | .jpg | — | ✓ |
| TIFF | .tiff | — | ✓ |
| Text | .txt | — | ✓ |
| SVG | .svg | ✓ | — |
Obsługa formatów dotyczy renderowania stron i opcji ładowania na poziomie dokumentu; te wpisy odzwierciedlają potwierdzone ścieżki eksportu (BmpDevice, JpegDevice, TiffDevice, TextDevice) i importu (SvgLoadOptions), a nie serializację specyficzną dla adnotacji.
Open Source i licencjonowanie
Aspose.PDF FOSS dla C++ jest udostępniony na licencji MIT. Kod źródłowy jest dostępny pod adresem https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp, a biblioteka może być używana w projektach komercyjnych i otwarto-źródłowych bez opłat licencyjnych.