PDF-annotációkkal való munka
PDF-annotációk kezelése
PDF annotációk a Aspose.PDF FOSS C++-hoz a Annotation alaposztály és konkrét alosztályai (TextAnnotation, LinkAnnotation, HighlightAnnotation, FreeTextAnnotation, CircleAnnotation, WatermarkAnnotation, WidgetAnnotation, és egyebek) által vannak reprezentálva. Minden oldal a Page.Annotations() segítségével teszi elérhetővé az annotációkat, amely egy AnnotationCollection-t ad vissza. Ez az útmutató a következőket tárgyalja: annotációk hozzáadása egy oldalhoz, azok iterálása és eltávolítása, annotációk olvasása meglévő dokumentumból, linkműveletek csatolása, megjelenés testreszabása és az annotációk laposítása.
Annotációk hozzáadása egy oldalhoz
Konkrét annotációpéldányt hoz létre, Rectangle segítségével pozicionálja, és a AnnotationCollection.Add() használatával adja hozzá az oldal gyűjteményéhez. TextAnnotation egy ragasztójegy-stílusú megjegyzést jelöl, amely az oldal egy pontjához van rögzítve:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>
#include <aspose/pdf/rectangle.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& page = doc.Pages()[1];
Aspose::Pdf::Annotations::TextAnnotation note(doc);
note.Rect(Aspose::Pdf::Rectangle(100.0, 700.0, 200.0, 720.0, false));
note.Contents("Reviewed and approved");
page.Annotations().Add(note);
doc.Save("annotated.pdf");
}Annotation.Contents() / Contents(value) lekérdezi és állítja be a megjegyzés szövegét, míg Annotation.Rect() / Rect(value) pozicionálja az annotációt az oldalon.
Annotációk iterálása és eltávolítása
AnnotationCollection támogatja a számlálást, indexelt hozzáférést, tagságvizsgálatot, valamint az eltávolítást érték vagy index alapján:
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& annotations = doc.Pages()[1].Annotations();
std::cout << "Annotation count: " << annotations.Count() << "\n";
for (int i = 0; i < annotations.Count(); ++i) {
std::cout << "Contents: " << annotations[i].Contents() << "\n";
}
if (annotations.Count() > 0) {
annotations.Delete(0); // remove by index
}
annotations.Clear(); // remove everything
}AnnotationCollection.Contains(annotation) és Remove(annotation) egy adott annotációs hivatkozáson működnek; Delete(index) pozíció alapján távolítja el, és Delete(annotation) egy konkrét annotációt távolít el anélkül, hogy szükség lenne az indexére. IsReadOnly() jelzi, hogy a gyűjtemény módosítható-e.
Annotációk olvasása meglévő dokumentumból
Amikor egy dokumentum betöltődik, az annotációi már fel vannak töltve, és bármit hozzáadni nélkül megvizsgálhatók. Annotation.AnnotationType() jelenti az altípust (AnnotationType::Text, AnnotationType::Highlight, AnnotationType::Link, AnnotationType::FreeText, AnnotationType::FileAttachment, AnnotationType::Watermark és mások):
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/annotation_type.hpp>
int main() {
Aspose::Pdf::Document doc("annotated.pdf");
auto& annotations = doc.Pages()[1].Annotations();
for (int i = 0; i < annotations.Count(); ++i) {
auto& a = annotations[i];
if (a.AnnotationType() == Aspose::Pdf::Annotations::AnnotationType::Text) {
std::cout << "Note: " << a.Contents() << "\n";
}
}
}Az annotációk sorrendje és altípusa megmarad egy mentés/újratöltés körúton, így a Annotations()-ba indexelő kód a dokumentum betöltése után ugyanazt a sorozatot látja, ami a fájl írásakor jelen volt.
Link annotációk és műveletek
LinkAnnotation egy kattintható területet csatol egy oldalhoz, és aktiváláskor egy PdfAction-t indít el. NamedAction egy előre definiált navigációs célpontra ugrik, JavascriptAction egy ECMAScript karakterláncot futtat, és SubmitFormAction űrlap adatokat küld el egy URL-re egy FileSpecification segítségével:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/link_annotation.hpp>
#include <aspose/pdf/annotations/named_action.hpp>
#include <aspose/pdf/annotations/predefined_action.hpp>
#include <aspose/pdf/rectangle.hpp>
int main() {
Aspose::Pdf::Document doc;
auto page = doc.Pages().Add();
Aspose::Pdf::Annotations::LinkAnnotation link(
page, Aspose::Pdf::Rectangle(0.0, 0.0, 100.0, 20.0, false));
link.Action(Aspose::Pdf::Annotations::NamedAction(
Aspose::Pdf::Annotations::PredefinedAction::LastPage));
page.Annotations().Add(link);
doc.Save("linked.pdf");
}LinkAnnotation.Action(value) bármely PdfAction altípust elfogadja, és belsőleg klónozza, így az annotáció saját másolatot tart a műveletről. LinkAnnotation.Destination() / Destination(value) egy explicit navigációs célpontot állít be a művelet helyett, és Highlighting() / Highlighting(value) szabályozzák a link kattintásakor megjelenő vizuális visszajelzést.
Annotáció megjelenése: keret, jelzők és szín
Minden Annotation egy Border-t, egy AnnotationFlags bitmezőt, valamint egy Color-t tesz közzé, amely a megjelenésének rendereléséhez használatos:
#include <aspose/pdf/annotations/border_style.hpp>
#include <aspose/pdf/annotations/annotation_flags.hpp>
#include <aspose/pdf/color.hpp>
// 'note' is an existing Annotation reference, e.g. from AnnotationCollection.
note.Border().Width(2);
note.Border().Style(Aspose::Pdf::Annotations::BorderStyle::Dashed);
note.Flags(Aspose::Pdf::Annotations::AnnotationFlags::Print);
note.Color(Aspose::Pdf::Color::Red());Border.Style() elfogadja a(z) BorderStyle::Solid, Dashed, Beveled, Inset vagy Underline értékeket. Border.Effect() emellett támogat egy BorderEffect::Cloudy körvonalat, amelynek EffectIntensity() szabályozza, mennyire hangsúlyos. A AnnotationFlags egy bitmező – kombinálj olyan értékeket, mint a(z) Print, NoZoom, ReadOnly és LockedContents, hogy szabályozd, hogyan viselkedik a megjegyzés a megjelenítőben anélkül, hogy megváltoztatná a látható tartalmát.
Megjegyzések laposítása
Egyetlen megjegyzés laposítható — egyesíthető az oldal tartalmával és nem interaktívvá tehető — a Annotation.Flatten() közvetlen meghívásával:
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("annotated.pdf");
auto& annotations = doc.Pages()[1].Annotations();
for (int i = 0; i < annotations.Count(); ++i) {
annotations[i].Flatten();
}
doc.Save("flattened.pdf");
}Dokumentum-szintű megjegyzés műveletekhez a PdfAnnotationEditor a API során használt közös Facade mintát követi: köss egy forrásdokumentumot a BindPdf() segítségével, alkalmazz egy vagy több megjegyzés műveletet, majd írd ki az eredményt a Save() segítségével:
#include <aspose/pdf/facades/pdf_annotation_editor.hpp>
int main() {
Aspose::Pdf::Facades::PdfAnnotationEditor editor;
editor.BindPdf("annotated.pdf");
editor.FlatteningAnnotations();
editor.Save("flattened.pdf");
}PdfAnnotationEditor.DeleteAnnotations() eltávolítja az összes megjegyzést a kötött dokumentumból; a DeleteAnnotations(annotType) a törlést egyetlen AnnotationType-ra korlátozza. A ImportAnnotationsFromXfdf(xfdfFile) és a ImportAnnotationsFromFdf(fdfFile) betöltik egy másik PDF-megjelenítőből exportált megjegyzésadatokat.
Tippek és bevált gyakorlatok
- Mindig add hozzá az újonnan létrehozott megjegyzést a
Page.Annotations()-hoz, mielőtt meghívnád aDocument.Save()-t — egy megjegyzés, amelyet soha nem adnak hozzá egy gyűjteményhez, nem kerül kiírásra a kimeneti fájlba. - Használja a
AnnotationCollection.Contains(annotation)-t, mielőtt meghívná aRemove()-et, ha nem biztos benne, hogy a megjegyzés még jelen van; aRemove()false-t ad vissza ahelyett, hogy kivételt dobna, ha a megjegyzés hiányzik. - Ellenőrizze a
Annotation.AnnotationType()-t, mielőtt átkonvertálná vagy elágazna az al-típus viselkedésén, amikor egy megbízhatatlan vagy harmadik féltől származó PDF-fájlból betöltött megjegyzéseken iterál. - A megjegyzéseket laposítsa le a
Annotation.Flatten()segítségével (vagy aPdfAnnotationEditor.FlatteningAnnotations()segítségével az egész dokumentumra) a dokumentum archiválása előtt, hogy a más eszközökön dolgozó ellenőrzők ugyanazt a megjelenést lássák, amit Ön szerkesztett. - A
AnnotationFlagsegy bitmező — kombinálja a jelzőket az enum alapul szolgáló egész értékeivel, ahelyett, hogy azt feltételezné, egyszerre csak egy jelző lehet aktív.
Gyakori problémák
| Probléma | Ok | Javítás |
|---|---|---|
| A megjegyzés nem látható mentés után | A megjegyzés létre lett hozva, de soha nem lett hozzáadva a Page.Annotations() | Hívja meg a page.Annotations().Add(annotation) a doc.Save() előtt |
Remove() visszaadja false | A megadott megjegyzésreferencia nem egyezik a gyűjteményben jelenleg lévő bejegyzéssel | Először használja a Contains() értéket, vagy távolítsa el az index alapján a Delete(index) segítségével |
| Hibás annotációtípus az újratöltés után | A kód feltételezett egy konkrét alosztályt anélkül, hogy ellenőrizte volna a AnnotationType() értéket | Ágazás a Annotation.AnnotationType() alapján, mielőtt az objektumot konkrét alosztálynak tekintené |
| A link művelet úgy tűnik, hogy beállítatlan marad a hozzárendelés után | Egy helyi PdfAction kilépett a hatókörből; a LinkAnnotation.Action() a annotáció klónozott példányát adja vissza, nem az eredeti objektumot | Olvassa vissza a műveletet a link.Action() segítségével, ahelyett, hogy az eredeti helyi változónál tartaná |
A PdfAnnotationEditor műveletnek nincs hatása | BindPdf() nem lett meghívva, vagy egy nem létező útvonallal lett meghívva | Ellenőrizze, hogy a BindPdf() sikeres, mielőtt meghívná a FlatteningAnnotations() vagy a DeleteAnnotations() parancsot |
FAQ
Hogyan adhatok megjegyzés-szerű annotációt egy PDF-oldalhoz?
Hozzon létre egy TextAnnotation objektumot a cél Document segítségével, állítsa be a Rect() és a Contents() értékeket, majd mentés előtt adja hozzá a page.Annotations().
Hogyan tudom megtudni, hogy milyen típusú annotációról van szó?
Hívja meg a(z) Annotation.AnnotationType() függvényt, amely egy AnnotationType enum értéket ad vissza, például Text, Link, Highlight, FreeText, FileAttachment vagy Watermark.
Egy annotáció tartalmazhat több mint egy jelzőt?
Igen. A(z) AnnotationFlags egy bitmező (Default, Invisible, Hidden, Print, NoZoom, ReadOnly, LockedContents és egyebek), így több jelző kombinálható egyetlen annotáción.
Mi a különbség egy annotáció laposítása és egy dokumentum laposítása között?
Annotation.Flatten() egyetlen annotációt egyesíti az adott oldal tartalmával. PdfAnnotationEditor.FlatteningAnnotations() (opcionálisan az oldaltartomány és AnnotationType szerint, a start, end és annotType elfogadására képes túlterhelésen keresztül) egyetlen hívással laposítja az egész kötött dokumentumot.
Hogyan távolíthatok el egy adott típusú összes annotációt egy dokumentumból?
Kösse össze a dokumentumot a(z) PdfAnnotationEditor.BindPdf() segítségével, hívja meg a(z) DeleteAnnotations(annotType) függvényt a cél AnnotationType paraméterrel, majd Save() az eredményt.
API Reference összefoglaló
| Osztály/Módszer | Leírás |
|---|---|
Annotation | Absztrakt alaposztály minden PDF-annotáció alttípushoz |
Annotation.Rect() / Rect(value) | Az annotáció határoló téglalapjának lekérdezése vagy beállítása |
Annotation.Contents() / Contents(value) | A megjegyzés szövegtartalmát adja vissza vagy állítja be. |
Annotation.AnnotationType() | Visszaadja a AnnotationType enum értékét ehhez a megjegyzéshez |
Annotation.Flags() / Flags(value) | A AnnotationFlags bitmező lekérése vagy beállítása |
Annotation.Border() / Border(value) | Az annotáció Border lekérése vagy beállítása |
Annotation.Color() / Color(value) | A jelölés megjelenítésének lekérése vagy beállítása Color |
Annotation.Flatten() | Egyesíti ezt a megjegyzést az oldal tartalmába, így nem interaktív |
AnnotationCollection | Rendezett gyűjtemény a lapon lévő megjegyzésekről, amelyet a Page.Annotations() ad vissza |
AnnotationCollection.Add(annotation) / Add(annotation, considerRotation) | Hozzáad egy annotációt a gyűjteményhez |
AnnotationCollection.Count() | Visszaadja a gyűjteményben lévő annotációk számát |
AnnotationCollection.Contains(annotation) | Jelzi, hogy a gyűjtemény tartalmazza-e a megadott annotációt |
AnnotationCollection.Remove(annotation) | Eltávolít egy konkrét annotációt; visszaadja false ha nem találja |
AnnotationCollection.Delete(index) / Delete(annotation) | Eltávolít egy annotációt index vagy hivatkozás alapján |
AnnotationCollection.Clear() | Eltávolítja az összes annotációt a gyűjteményből |
TextAnnotation | Ragadós cetli stílusú annotáció Open() és Icon() (TextIcon) |
LinkAnnotation | Kattintható terület, amely PdfAction-t küld Action() / Action(value) segítségével |
LinkAnnotation.Destination() / Destination(value) | A kifejezett navigációs cél lekérése vagy beállítása |
HighlightAnnotation | Megjelöli a szövegszakaszt egy kiemelő színnel |
FreeTextAnnotation | Megjelenít egy szöveges feliratot; a Justification(), DefaultAppearanceObject(), Callout() segítségével konfigurálható |
CircleAnnotation | Ellipszist rajzol a megjegyzés téglalapján belül |
WatermarkAnnotation | Átfedés annotáció egy Opacity() / Opacity(value) accessorral |
WidgetAnnotation | Űrlapmező megjelenés annotáció ReadOnly(), Required(), Exportable(), DefaultAppearance() használatával |
NamedAction | Előre meghatározott navigációs művelet (PredefinedAction enum) csatolható egy LinkAnnotation |
JavascriptAction | ECMAScript karakterláncot futtat a Script() / GetECMAScriptString() segítségével |
SubmitFormAction | Űrlapadatokat küld egy FileSpecification URL-re a Url() / Url(value) segítségével |
Border | Annotáció keret Width(), Style() (BorderStyle), Effect() (BorderEffect) |
PdfAnnotationEditor | Felület a dokumentum-szintű annotáció importálásához, módosításhoz, laposításhoz és törléshez |
PdfAnnotationEditor.FlatteningAnnotations() | Laposítja az annotációkat a kötött dokumentumban |
PdfAnnotationEditor.DeleteAnnotations(annotType) | Törli az adott AnnotationType összes annotációját |
PdfAnnotationEditor.ImportAnnotationsFromXfdf(xfdfFile) | Annotációkat importál egy XFDF fájlból |