Introduktion

PDF-anteckningar omfattar ett brett spektrum av interaktiva och visuella element som läggs ovanpå sidans innehåll: klibbiga textanteckningar, hyperlänkar, markerad eller genomstruken text, geometriska former, bläckstift, filbilagor och godkännandestämplar. Aspose.PDF FOSS för C++ representerar var och en av dessa som en konkret underklass till Annotation, så kod som går igenom en sidas anteckningar kan arbeta generiskt mot basklassen samtidigt som den kan nå underklass-specifika medlemmar — som Icon() på en TextAnnotation eller Action() på en LinkAnnotation — när det behövs.

Bibliotekets Annotations::AnnotationType-enum listar de undertyper den känner igen: 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 och flera andra. Varje värde mappar till en konkret klass — CircleAnnotation, SquareAnnotation, PolygonAnnotation, PolylineAnnotation och LineAnnotation för form-markup; FreeTextAnnotation och InkAnnotation för fritext och ritade streck; FileAttachmentAnnotation, SoundAnnotation, MovieAnnotation, ScreenAnnotation och RichMediaAnnotation för inbäddat innehåll; samt WidgetAnnotation för AcroForm-fältens utseende.

Detta inlägg behandlar bas-API för Annotation och AnnotationCollection, att lägga till textanteckningar och länkar, att upptäcka anteckningstyper vid inläsning av ett befintligt dokument samt att läsa eller uppdatera markup-metadata och stämplar. Aspose.PDF FOSS för C++ är ett C++20-bibliotek utan körtidss beroenden utöver standardbiblioteket; rubriker inkluderas direkt från katalogen aspose/pdf/annotations/ och biblioteket byggs som ett CMake-mål.


Vad som ingår

Annotation och AnnotationCollection

Annotation är basklassen för varje antecknings-underklass. Den exponerar gemensamma egenskaper: Rect() / Rect(value) för anteckningens begränsningsrektangel, Contents() för den tillhörande texten, Name(), Color(), Flags() (en bitmask av typen AnnotationFlagsPrint, Hidden, Invisible, NoZoom, ReadOnly och andra), Border(), Width() / Height(), AnnotationType() och PageIndex(). AnnotationCollection innehåller anteckningarna på en enskild sida och nås via 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 exponerar också Add(annotation), Add(annotation, considerRotation), Delete(index), Delete(annotation), Clear(), Remove(annotation), Contains(annotation) och IsReadOnly().

Textanteckningar med TextAnnotation

TextAnnotation representerar den välkända klibbiga noten-kommentaren. Utöver de ärvda Annotation-medlemmarna lägger den till Open() / Open(value) för att styra om noten visas utökad, samt Icon() / Icon(value) (ett TextIcon-värde såsom Note, Comment, Key, Help eller Check) för att välja ikon-glyphen.

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

Länkar och åtgärder med LinkAnnotation

LinkAnnotation fäster en klickbar region på en sida. Den konstrueras från den ägande Page och en Rectangle, och dess beteende sätts med Action(value)—vilken PdfAction-subklass som helst, inklusive NamedAction (fördefinierad navigering såsom PredefinedAction::LastPage), GoToAction, GoToURIAction eller JavascriptAction. Destination() läser länkens IAppointment-mål, och Highlighting()/Highlighting(value) anger HighlightingMode (None, Invert, Outline, Push, Toggle) som tillämpas när länken aktiveras.

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

Detektera annoteringstyper vid inläsning

När ett dokument öppnas är befintliga annotationer redan fyllda i varje sidas AnnotationCollection, och AnnotationType() identifierar vilken konkret subtyp varje post representerar. Detta låter anroparkoden grenfördela baserat på enum-värdet utan att i förväg veta vilka annoteringstyper ett givet PDF-dokument innehåller.

#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 för markup-annotering

MarkupAnnotation är basen för annotationer som bär metadata från granskaren: Title() (författaren), Subject(), RichText() för formaterad kommentartext, och Opacity() för blandning mot sidans innehåll. InReplyTo() och Popup() kopplar en markup-annotation till den kommentarstråd den tillhör, och ClearState()/SetReviewState(state, userName) hanterar dess granskningsstatus. HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation och SquigglyAnnotation är markup-subtyper som placeras över text; deras gemensamma bas TextMarkupAnnotation lägger till QuadPoints() för att definiera de täckta fyrhörningsområdena och GetMarkedText() för att läsa tillbaka texten under.

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

Stämpelannotationer med StampAnnotation

StampAnnotation placerar en fördefinierad eller anpassad stämpel på en sida. Icon()/Icon(value) väljer ett StampIcon-värde—Approved, Draft, Confidential, Final, Expired, NotApproved, ForComment, TopSecret och andra—och Image()/Image(value) tillhandahåller råa bildbytes för ett eget stämpelutseende istället för en inbyggd ikon.

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

Snabbstart

Lägg till biblioteket som en CMake-undermapp och länka mot målet aspose_pdf_foss:

add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

Öppna ett dokument, lägg till en textnotering och läs tillbaka antalet annotationer:

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

Stödda format

FormatUtökningLäsSkriv
BMP.bmp
JPEG.jpg
TIFF.tiff
Text.txt
SVG.svg

Formatstöd gäller för sidrendering och inläsningsalternativ på dokumentnivå; dessa poster återspeglar bekräftade export (BmpDevice, JpegDevice, TiffDevice, TextDevice) och import (SvgLoadOptions) vägar snarare än annoteringsspecifik serialisering.


Öppen källkod & licensiering

Aspose.PDF FOSS för C++ är släppt under MIT-licensen. Källkoden finns på https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp, och biblioteket kan användas i kommersiella och öppna källkodsprojekt utan licensavgifter.


Kom igång

Relaterade resurser