Hogyan dolgozzunk PDF megjegyzésekkel C++-ban

Hogyan dolgozzunk PDF megjegyzésekkel C++-ban

Aspose.PDF FOSS for C++ minden PDF megjegyzést a közös Annotation alaposztályként ábrázol, és a megjegyzéseket egy oldalon a Page::Annotations() által visszaadott AnnotationCollection segítségével teszi elérhetővé. Ez az útmutató egy egyszerű szöveges jegyzet megjegyzést és egy formázott megjegyzést ad hozzá egy oldalhoz a TextAnnotation használatával, elmenti a dokumentumot, majd újra megnyitja, hogy visszaolvassa a megjegyzéseket, és eltávolítson egyet. A könyvtár egy CMake projektbe alkönyvtár függőségként van integrálva – nincs csomagregisztrációs telepítési lépés.

Lépésről lépésre útmutató

1. lépés: A csomag telepítése

A könyvtár hozzáadása CMake alkönyvtárként és a statikus könyvtár cél összekapcsolása:

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

Ellenőrizze, hogy az eszközlánc és a linkelési lépés helyesen feloldódik-e egy minimális programmal:

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

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

Egy sikeres build, amely kiírja a pages: 0 értéket, megerősíti, hogy a könyvtár össze van kapcsolva.


2. lépés: Szükséges osztályok importálása

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

3. lépés: Dokumentum létrehozása és oldal hozzáadása

Hozzon létre egy új dokumentumot, és adjon hozzá egy oldalt. PageCollection::Add() visszaadja az újonnan hozzáadott Page:

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

4. lépés: Szöveges megjegyzés hozzáadása az oldalhoz

TextAnnotation ragadós jegyzet stílusú megjegyzésként jelenik meg. Hozza létre a tulajdonos Document alapján, állítsa be a pozícióját a Rect() segítségével, és az üzenetét a Contents() segítségével, majd adja hozzá az oldal AnnotationCollection eleméhez:

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

page.Annotations().Add(note);

5. lépés: Második megjegyzés formázása színnel, szegéllyel és jelzőkkel

Annotation továbbá elérhetővé teszi a Color(), Border() és Flags() elemeket. Flags() egy AnnotationFlags bitmezőt vár — kombinálja az értékeket bitwise OR művelettel, hogy egyszerre több jelzőt állítson be:

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

6. lépés: Dokumentum mentése

Semmi sem íródik a lemezre, amíg a(z) Save() nem fut le:

doc.Save("annotated.pdf");

7. lépés: PDF újranyitása és a megjegyzések olvasása

Nyissa meg újra a mentett fájlt, és olvassa vissza az első oldal AnnotationCollection értékét. A(z) AnnotationCollection 0-alapú, és a(z) Count() jelzi, hány megjegyzés van az oldalon:

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

8. lépés: Megjegyzés eltávolítása és újramentés

A(z) AnnotationCollection::Delete(index) eltávolít egy megjegyzést a 0-alapú pozíciója alapján. Törölje az első megjegyzést, és mentse az eredményt egy új fájlba:

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

Gyakori problémák és megoldások

Semmi sem változik a mentett PDF-ben a hívás után Annotations().Add()

Két dolog gyakran megy félre itt. Először is, a PageCollection 1-alapú (doc.Pages()[1] az első oldal), míg a AnnotationCollection 0-alapú (annots[0] az első annotáció) — a két indexelési séma összekeverése rossz objektumon való művelethez vezet. Másodszor, ellenőrizze, hogy a Document::Save() valóban az annotáció hozzáadása után fut le; addig semmi sem íródik a lemezre.

AnnotationCollection indexelés vagy Delete(index) throws std::out_of_range

Az érvényes indexek 0 és Count() - 1 között vannak. Negatív index vagy a Count()-nél egyenlő vagy nagyobb index átadása std::out_of_range kivételt vált ki tervezés szerint. Hívja először a Count() függvényt, hogy korlátozza a ciklust vagy a keresést.

Remove() returns false második alkalommal, amikor ugyanarra a megjegyzésre hívom

Ez nem hiba. A Remove() jelzi, hogy az annotáció megtalálható és eltávolították-e, mint egy bool; ha újra meghívják egy már eltávolított annotáción, az egy semmittevő művelet, amely false értéket ad vissza. Ellenőrizze a visszatérési értéket, ahelyett, hogy feltételezné, hogy a Remove() mindig sikeres.

Új beállítása AnnotationFlags az érték törli a már beállított jelzőket

Flags(value) felülírja az egész jelzőkészletet – nem egyesíti a korábbi értékkel. Egyetlen jelző hozzáadásához vagy törléséhez először olvassa be a jelenlegi jelzőket, és kombinálja őket bitműveletekkel, például a.Flags(a.Flags() | AnnotationFlags::Print) egy jelző hozzáadásához, vagy a.Flags(a.Flags() & ~AnnotationFlags::Print) egy jelző törléséhez, miközben a többit érintetlenül hagyja.

Gyakran Ismételt Kérdések

Mi a kapcsolat a Annotation, TextAnnotation és a többi annotáció altípus között?

Annotation a közös bázisosztály. TextAnnotation és a többi konkrét annotáció típus egyenként specializálja egy PDF annotáció altípusra, miközben megosztják a bázisosztály Rect(), Contents(), Color(), Flags() és Border() hozzáférőit.

Az annotációk a teljes dokumentumra vagy egy oldalra vannak korlátozva?

Minden oldalnak saját AnnotationCollection van, amelyet az adott oldal Annotations() metódusa ad vissza. Az annotációk mindig az adott oldalhoz vannak kötve, amelyhez hozzáadták őket, nem a teljes dokumentumhoz.

Hogyan tudom megszámolni, hány annotáció van egy oldalon?

Hívja meg a Count() a Page::Annotations() által visszaadott AnnotationCollection objektumon.

Lehet egy annotáció egyszerre nyomtatható és csak olvasható?

Igen. A AnnotationFlags egy bitmező, ezért a értékeket bitwise OR-rel kombinálja, például a AnnotationFlags::Print | AnnotationFlags::ReadOnly.

A AnnotationCollection-ból való annotáció törlése eltávolítja-e a lemezen lévő PDF-ből?

Csak Document::Save() futása után. Delete(), Remove() és Clear() csak a memóriában lévő gyűjteményt módosítják — a lemezen lévő PDF változatlan marad, amíg a dokumentum nincs mentve.

Lásd még:

 Magyar