Cum să lucrați cu adnotările PDF în C++

Cum să lucrați cu adnotările PDF în C++

Aspose.PDF FOSS pentru C++ reprezintă fiecare adnotare PDF ca o subclasă a clasei de bază comune Annotation, și expune adnotările pe o pagină prin AnnotationCollection returnat de Page::Annotations(). Acest ghid adaugă o adnotare de tip notă text simplă și o adnotare stilizată pe o pagină cu TextAnnotation, salvează documentul, apoi îl redeschide pentru a citi adnotările înapoi și a elimina una. Biblioteca este integrată într-un proiect CMake ca o dependență subdirector — nu există pas de instalare prin registru de pachete.

Ghid pas cu pas

Pasul 1: Instalați pachetul

Adăugați biblioteca ca subdirector CMake și legați ținta bibliotecii statice:

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

Verificați că lanțul de instrumente și pasul de legare se rezolvă corect cu un program minimal:

#include <aspose/pdf/document.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc;
    std::cout << "Linked OK — pages: " << doc.Pages().Count() << "\n";
}

O compilare cu succes care afișează pages: 0 confirmă că biblioteca este legată.


Pasul 2: Importă clasele necesare

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/page_collection.hpp>
#include <aspose/pdf/rectangle.hpp>
#include <aspose/pdf/color.hpp>
#include <aspose/pdf/annotations/annotation.hpp>
#include <aspose/pdf/annotations/annotation_collection.hpp>
#include <aspose/pdf/annotations/annotation_type.hpp>
#include <aspose/pdf/annotations/annotation_flags.hpp>
#include <aspose/pdf/annotations/border.hpp>
#include <aspose/pdf/annotations/border_style.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>

using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Annotations;

Pasul 3: Creează un document și adaugă o pagină

Creează un document nou și adaugă o pagină la acesta. PageCollection::Add() returnează Page adăugat recent:

Document doc;
Page page = doc.Pages().Add();

Pasul 4: Adaugă o adnotare de tip text la pagină

TextAnnotation este redat ca un comentariu de tip notiță adezivă. Construiește-l din Document deținător, setează-i poziția cu Rect() și mesajul cu Contents(), apoi adaugă-l la AnnotationCollection paginii:

TextAnnotation note{doc};
note.Rect(Rectangle(100.0, 700.0, 200.0, 720.0, false));
note.Contents("Reviewed and approved.");

page.Annotations().Add(note);

Pasul 5: Stilizează o a doua adnotare cu culoare, margine și steaguri

Annotation expune, de asemenea, Color(), Border() și Flags(). Flags() primește un câmp de biți AnnotationFlags — combină valorile cu OR pe biți pentru a seta mai multe steaguri simultan:

TextAnnotation flagged{doc};
flagged.Rect(Rectangle(100.0, 600.0, 300.0, 650.0, false));
flagged.Contents("Needs follow-up");
flagged.Color(Color::FromRgb(220, 20, 20));
flagged.Flags(AnnotationFlags::Print | AnnotationFlags::ReadOnly);
flagged.Border().Width(2);
flagged.Border().Style(BorderStyle::Dashed);

page.Annotations().Add(flagged);

Pasul 6: Salvează documentul

Nu se scrie nimic pe disc până când Save() rulează:

doc.Save("annotated.pdf");

Pasul 7: Redeschide PDF-ul și citește adnotările sale

Redeschide fișierul salvat și citește înapoi AnnotationCollection primei pagini. AnnotationCollection este indexat de la 0, iar Count() raportează câte adnotări conține pagina:

Document reopened("annotated.pdf");
auto& annots = reopened.Pages()[1].Annotations();

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

for (int i = 0; i < annots.Count(); ++i) {
    const auto& a = annots[i];
    if (a.AnnotationType() == AnnotationType::Text) {
        std::cout << "Text annotation: " << a.Contents() << "\n";
    }
}

Pasul 8: Elimină o adnotare și salvează din nou

AnnotationCollection::Delete(index) elimină o adnotare în funcție de poziția sa indexată de la 0. Șterge prima adnotare și salvează rezultatul într-un fișier nou:

annots.Delete(0);
reopened.Save("annotated-cleaned.pdf");

Probleme comune și soluții

Nu se schimbă nimic în PDF-ul salvat după apelarea Annotations().Add()

Două lucruri greșesc de obicei aici. În primul rând, PageCollection este bazat pe 1 (doc.Pages()[1] este prima pagină) în timp ce AnnotationCollection este bazat pe 0 (annots[0] este prima adnotare) — confuzia celor două scheme de indexare duce la operarea asupra obiectului greșit. În al doilea rând, asigurați-vă că Document::Save() rulează efectiv după ce adnotarea a fost adăugată; nimic nu este scris pe disc până atunci.

AnnotationCollection indexare sau Delete(index) throws std::out_of_range

Indecșii valizi se află între 0 și Count() - 1. Trimiterea unui indice negativ sau a unui indice egal cu sau mai mare decât Count() aruncă std::out_of_range prin design. Apelați Count() mai întâi pentru a limita orice buclă sau căutare.

Remove() returns false a doua oară când o apelez pe aceeași adnotare

Acesta nu este o eroare. Remove() raportează dacă adnotarea a fost găsită și eliminată ca un bool; apelarea din nou pe o adnotare care a dispărut deja este o operație nulă care returnează false. Verificați valoarea returnată în loc să presupuneți că Remove() reușește întotdeauna.

Setarea unei noi AnnotationFlags valoarea șterge flag-urile pe care le-am setat deja

Flags(value) înlocuiește întregul set de flag-uri — nu se combină cu valoarea anterioară. Pentru a adăuga sau a șterge un singur flag, citiți mai întâi flag-urile curente și combinați-le cu operatori pe biți, de exemplu a.Flags(a.Flags() | AnnotationFlags::Print) pentru a adăuga un flag, sau a.Flags(a.Flags() & ~AnnotationFlags::Print) pentru a șterge un flag lăsând restul neschimbat.

Întrebări Frecvente

Care este relația dintre Annotation, TextAnnotation și celelalte subtipuri de adnotări?

Annotation este clasa de bază comună. TextAnnotation și celelalte tipuri concrete de adnotări o specializează pentru un subtip de adnotare PDF, în timp ce împărtășesc accesoriile Rect(), Contents(), Color(), Flags() și Border() ale clasei de bază.

Sunt adnotările limitate la întregul document sau la o singură pagină?

Fiecare pagină are propriul său AnnotationCollection, returnat de metoda Annotations() a paginii respective. Adnotările sunt întotdeauna limitate la pagina pe care au fost adăugate, nu la documentul în ansamblu.

Cum pot număra câte adnotări există pe o pagină?

Apelă Count() pe AnnotationCollection returnat de Page::Annotations().

Poate o adnotare să fie atât imprimabilă, cât și doar pentru citire în același timp?

Da. AnnotationFlags este un câmp de biți, așa că combină valorile cu OR pe biți, de exemplu AnnotationFlags::Print | AnnotationFlags::ReadOnly.

Ștergerea unei adnotări din AnnotationCollection o elimină din fișierul PDF de pe disc?

Doar după ce rulează Document::Save(). Delete(), Remove() și Clear() modifică doar colecția din memorie — PDF-ul de pe disc rămâne neschimbat până când documentul este salvat.

Vezi și:

 Română