Introduction

Les annotations PDF couvrent un large éventail d’éléments interactifs et visuels superposés au contenu de la page : notes autocollantes, hyperliens, texte surligné ou barré, formes géométriques, traits d’encre, pièces jointes, et tampons d’approbation. Aspose.PDF FOSS pour C++ représente chacun de ceux-ci comme une sous-classe concrète de Annotation, de sorte que le code qui parcourt les annotations d’une page peut fonctionner de façon générique sur la classe de base tout en accédant aux membres spécifiques aux sous-types — comme Icon() sur une TextAnnotation ou Action() sur une LinkAnnotation — lorsque cela est nécessaire.

L’énumération Annotations::AnnotationType de la bibliothèque répertorie les sous-types qu’elle reconnaît : 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 et plusieurs autres. Chaque valeur correspond à une classe concrète — CircleAnnotation, SquareAnnotation, PolygonAnnotation, PolylineAnnotation et LineAnnotation pour le balisage de formes ; FreeTextAnnotation et InkAnnotation pour le texte libre et les traits dessinés ; FileAttachmentAnnotation, SoundAnnotation, MovieAnnotation, ScreenAnnotation et RichMediaAnnotation pour le contenu intégré ; et WidgetAnnotation pour les apparences de champs AcroForm.

Cet article couvre les API de base Annotation et AnnotationCollection, l’ajout de notes texte et de liens, la détection des types d’annotation lors du chargement d’un document existant, ainsi que la lecture ou la mise à jour des métadonnées de balisage et des tampons. Aspose.PDF FOSS pour C++ est une bibliothèque C++20 sans dépendances d’exécution au-delà de la bibliothèque standard ; les en-têtes sont incluses directement depuis le répertoire aspose/pdf/annotations/ et la bibliothèque se construit comme une cible CMake.


Ce qui est inclus

Annotation et AnnotationCollection

Annotation est la classe de base de chaque sous-type d’annotation. Elle expose des propriétés communes : Rect() / Rect(value) pour le rectangle englobant de l’annotation, Contents() pour le texte associé, Name(), Color(), Flags() (un masque de bits AnnotationFlagsPrint, Hidden, Invisible, NoZoom, ReadOnly, etc.), Border(), Width() / Height(), AnnotationType() et PageIndex(). AnnotationCollection contient les annotations d’une seule page et est accessible 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 expose également Add(annotation), Add(annotation, considerRotation), Delete(index), Delete(annotation), Clear(), Remove(annotation), Contains(annotation) et IsReadOnly().

Notes de texte avec TextAnnotation

TextAnnotation représente le commentaire sous forme de note autocollante familier. En plus des membres de base Annotation, elle ajoute Open() / Open(value) pour contrôler si la note apparaît développée, et Icon() / Icon(value) (une valeur TextIcon telle que Note, Comment, Key, Help ou Check) pour choisir le glyphe de l’icône.

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

Liens et actions avec LinkAnnotation

LinkAnnotation attache une zone cliquable à une page. Elle est construite à partir de la Page propriétaire et d’un Rectangle, et son comportement est défini avec Action(value) — toute sous-classe de PdfAction, y compris NamedAction (navigation prédéfinie comme PredefinedAction::LastPage), GoToAction, GoToURIAction ou JavascriptAction. Destination() lit la cible IAppointment du lien, et Highlighting() / Highlighting(value) définit le HighlightingMode (None, Invert, Outline, Push, Toggle) appliqué lorsque le lien est activé.

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

Détection des types d’annotation au chargement

Lorsqu’un document est ouvert, les annotations existantes sont déjà peuplées dans la AnnotationCollection de chaque page, et AnnotationType() identifie quel sous-type concret chaque entrée représente. Cela permet au code appelant de se ramifier sur la valeur d’énumération sans connaître à l’avance quels types d’annotation un PDF donné contient.

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

Métadonnées d’annotation de balisage

MarkupAnnotation est la classe de base pour les annotations qui transportent des métadonnées de relecteur : Title() (l’auteur), Subject(), RichText() pour le texte de commentaire formaté, et Opacity() pour le mélange avec le contenu de la page. InReplyTo() et Popup() relient une annotation de balisage au fil de commentaires auquel elle appartient, et ClearState() / SetReviewState(state, userName) gèrent son état de révision. HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation et SquigglyAnnotation sont des sous-types de balisage positionnés sur le texte ; leur base commune TextMarkupAnnotation ajoute QuadPoints() pour définir les régions quadrilatérales couvertes et GetMarkedText() pour lire le texte sous-jacent.

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

Annotations d’estampille avec StampAnnotation

StampAnnotation place un tampon prédéfini ou personnalisé sur une page. Icon() / Icon(value) sélectionne une valeur StampIconApproved, Draft, Confidential, Final, Expired, NotApproved, ForComment, TopSecret, etc. — et Image() / Image(value) fournit les octets bruts de l’image pour une apparence de tampon personnalisée au lieu d’une icône intégrée.

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

Démarrage rapide

Ajoutez la bibliothèque en tant que sous-répertoire CMake et liez-la contre la cible aspose_pdf_foss :

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

Ouvrez un document, ajoutez une note texte et récupérez le nombre d’annotations:

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

Formats pris en charge

FormatExtensionLireÉcrire
BMP.bmp
JPEG.jpg
TIFF.tiff
Text.txt
SVG.svg

La prise en charge des formats s’applique au rendu des pages et aux options de chargement au niveau du document ; ces entrées reflètent les chemins d’exportation confirmés (BmpDevice, JpegDevice, TiffDevice, TextDevice) et d’importation (SvgLoadOptions) plutôt que la sérialisation spécifique aux annotations.


Open source et licences

Aspose.PDF FOSS pour C++ est publié sous licence MIT. Le code source est disponible sur https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp, et la bibliothèque peut être utilisée dans des projets commerciaux et open source sans frais de licence.


Premiers pas

Ressources associées