Annotazioni PDF
Annotazioni PDF
Page.annotations espone un AnnotationCollection — una vista mutabile, simile a una sequenza, su ogni annotazione di una pagina. Ogni voce è un Annotation (o le sottoclassi MarkupAnnotation / LinkAnnotation), e i dati specifici del sottotipo come i punti quad, le liste di inchiostro o i colori vengono letti e scritti tramite get_property() / set_property() anziché tramite attributi dedicati.
Aggiungere annotazioni
AnnotationCollection.add(subtype, rect, contents, title, appearance_normal, properties) crea una nuova annotazione e la aggiunge alla pagina. subtype accetta o una stringa semplice ("Text", "Square", "Highlight") o un membro enum AnnotationType.
import aspose_pdf
from aspose_pdf import Document, AnnotationType
doc = Document()
doc.pages.add()
page = doc.pages[0]
# Plain string subtype
page.annotations.add("Text", (100, 100, 200, 200), "Hello")
# AnnotationType enum, with subtype-specific properties
page.annotations.add(
AnnotationType.POLYGON,
(0, 0, 10, 10),
"",
properties={"Vertices": [0, 0, 10, 0, 5, 10]},
)Lettura e aggiornamento delle proprietà
get_property(name, default) legge un valore specifico del sottotipo; set_property(name, value) ne scrive uno, e impostare una proprietà a None la rimuove dal dizionario properties dell’annotazione.
doc = Document()
doc.pages.add()
page = doc.pages[0]
ann = page.annotations.add(
"Square", (0, 0, 50, 50), "x", properties={"C": [1, 0, 0]},
)
ann.set_property("IC", [0, 0, 1])
print(page.annotations[0].get_property("IC")) # [0, 0, 1]
ann.set_property("C", None) # removes the "C" entry entirely
print("C" in page.annotations[0].properties) # FalseDenominare le annotazioni con AnnotationName
I nomi PDF (ad esempio la voce Name di un’annotazione Stamp) sono contrassegnati in modo distinto dalle stringhe normali usando AnnotationName, una sottoclasse str di aspose_pdf.engine.cos. Un valore memorizzato in questo modo è comunque uguale a una stringa ordinaria.
from aspose_pdf.engine.cos import AnnotationName
doc = Document()
doc.pages.add()
page = doc.pages[0]
page.annotations.add(
"Stamp", (10, 10, 110, 60), "",
properties={"Name": AnnotationName("Approved")},
)Inserimento, Eliminazione e Pulizia
insert(index, subtype, rect, contents, title, appearance_normal, properties) inserisce una nuova annotazione in una posizione specifica; delete(index) rimuove una per indice (sollevando IndexError per un indice fuori intervallo); clear() rimuove tutte le annotazioni dalla pagina.
doc = Document()
doc.pages.add()
page = doc.pages[0]
page.annotations.add("Text", (0, 0, 100, 100), "A")
page.annotations.add("Text", (200, 200, 300, 300), "C")
page.annotations.insert(1, "Text", (100, 100, 200, 200), "B")
# order is now: A, B, C
page.annotations.delete(1) # removes "B"
page.annotations.clear() # removes everything remainingGenerazione delle apparenze delle annotazioni
Annotation.generate_appearance(force) costruisce il flusso di aspetto /AP /N per una singola annotazione e restituisce True quando esiste un renderer per quel sottotipo; AnnotationCollection.generate_appearances(force) fa lo stesso per ogni annotazione sulla pagina in una sola chiamata e restituisce il numero di annotazioni effettivamente generate (i sottotipi non supportati vengono ignorati).
doc = Document()
doc.pages.add()
page = doc.pages[0]
page.annotations.add("Square", (0, 0, 50, 50), "")
page.annotations.add("Circle", (60, 0, 110, 50), "")
page.annotations.add("Text", (0, 60, 20, 80), "") # unsupported subtype -> skipped
generated = page.annotations.generate_appearances()
print(generated) # 2Sottotipi e flag delle annotazioni
AnnotationType elenca i nomi dei sottotipi standard PDF 32000-1:2008 (Tabella 169): TEXT, LINK, FREE_TEXT, LINE, SQUARE, CIRCLE, POLYGON, POLY_LINE, HIGHLIGHT, UNDERLINE, SQUIGGLY, STRIKE_OUT, STAMP, CARET, INK, POPUP, FILE_ATTACHMENT, SOUND, MOVIE, WIDGET, SCREEN, PRINTER_MARK, TRAP_NET, WATERMARK, e REDACT.
AnnotationFlags è un IntFlag che copre il comportamento di visualizzazione/interazione delle annotazioni: DEFAULT, INVISIBLE, HIDDEN, PRINT, NO_ZOOM, NO_ROTATE, NO_VIEW, READ_ONLY, LOCKED e TOGGLE_NO_VIEW.
Versione preliminare: Annotazioni 3D
PDF3DAnnotation, PDF3DArtwork, PDF3DContent e PDF3DView modellano un’opera d’arte 3D allegata a una pagina — un PDF3DAnnotation ha un rect: Rectangle, un artwork: PDF3DArtwork e un background_color: Color opzionale. PDF3DArtwork.add_view() registra un PDF3DView, ognuno con un render_mode (PDF3DRenderMode: SOLID, WIREFRAME, TRANSPARENT) e un lighting_scheme (PDF3DLightingScheme: HEADLAMP, WHITE, GRAY, DARK, CUSTOM). La docstring della libreria stessa contrassegna PDF3DAnnotation come un “minimal annotation wrapper for prerelease imports” — considera questa superficie come in fase iniziale piuttosto che come un API di authoring 3D completamente sviluppato.
Consigli e migliori pratiche
- Preferisci i membri enum di
AnnotationTyperispetto alle stringhe di sottotipo grezze quando il valore deve anche essere confrontato o usato per rami altrove nel tuo codice. - Chiama
set_property(name, None)per rimuovere una proprietà del tutto invece di lasciare un valore obsoleto al suo posto — la voce scompare completamente daproperties. - Genera le apparizioni in batch con
AnnotationCollection.generate_appearancesinvece di iteraregenerate_appearance()per annotazione; restituisce il conteggio effettivo generato così puoi rilevare sottotipi saltati o non supportati. delete()e l’indicizzazione inpage.annotationssono entrambe basate su zero; valida un indice prima di chiamaredelete()se proviene da input dell’utente, poiché un indice fuori intervallo generaIndexError.- Avvolgi i valori dei nomi PDF (come il
Namedi unStamp) inAnnotationNamecosì verranno trattati come nomi PDF anziché come stringhe di testo semplici.
Problemi comuni
| Problema | Causa | Correzione |
|---|---|---|
generate_appearances() restituisce meno del numero di annotazioni aggiunte | Uno o più sottotipi non hanno un renderer di aspetto integrato | Verifica il conteggio restituito rispetto a len(page.annotations); i sottotipi non supportati vengono ignorati silenziosamente, non generano errore |
delete(index) solleva IndexError | L’indice è negativo o supera il conteggio corrente delle annotazioni | Verifica len(page.annotations) prima di chiamare delete() |
Una proprietà impostata con set_property() non appare dopo la ricarica | La proprietà è stata impostata a None, il che la elimina invece di salvarla | Usa un valore reale, non None, quando la proprietà deve persistere |
| L’annotazione inserita finisce nella posizione sbagliata | Indice insert(index, ...) calcolato dallo stato della collezione prima dell’inserimento | Ricontrolla gli indici dopo ogni chiamata a insert() in un ciclo |
FAQ
Come aggiungo un’annotazione di commento in testo semplice?
Chiama page.annotations.add("Text", (x0, y0, x1, y1), "comment text"). La tupla a quattro numeri è il rettangolo dell’annotazione sulla pagina.
Qual è la differenza tra Annotation, MarkupAnnotation e LinkAnnotation?
Annotation è la vista live restituita per qualsiasi annotazione su una pagina. MarkupAnnotation è la base per i sottotipi di tipo markup (evidenziazioni, note di testo, forme) e LinkAnnotation è mantenuto per le annotazioni di tipo link; entrambi attualmente espongono la stessa superficie di metodi/proprietà di Annotation.
Posso rimuovere una singola proprietà senza eliminare l’intera annotazione?
Sì — chiama annotation.set_property(name, None); l’annotazione stessa rimane intatta, solo quella voce viene rimossa da properties.
Il AnnotationCollection.generate_appearances fallisce se un sottotipo non è supportato?
No. Salta i sottotipi senza un renderer di aspetto integrato e restituisce il conteggio delle annotazioni per le quali ha effettivamente generato un aspetto.
Le classi di annotazione 3D sono pronte per la produzione?
PDF3DAnnotation e i tipi correlati sono documentati come un wrapper minimo per importazioni prerelease — verifica il comportamento con il visualizzatore PDF di destinazione prima di fare affidamento su di essi per contenuti 3D di produzione.
API Reference Riepilogo
| Classe/Metodo | Descrizione |
|---|---|
AnnotationCollection.add | Crea e aggiungi una nuova annotazione a una pagina |
AnnotationCollection.insert | Crea e inserisci una nuova annotazione in un indice specifico |
AnnotationCollection.delete | Rimuovi un’annotazione per indice (solleva IndexError se fuori dall’intervallo) |
AnnotationCollection.clear | Rimuovi tutte le annotazioni dalla pagina |
AnnotationCollection.generate_appearances | Genera i flussi di aspetto /AP /N per ogni annotazione supportata nella pagina |
Annotation.get_property / set_property | Leggi o scrivi un valore di proprietà specifico per il sottotipo |
Annotation.update_properties | Ricalcola lo stato derivato dopo modifiche dirette alle proprietà |
Annotation.generate_appearance | Genera il flusso di aspetto /AP /N per una singola annotazione |
AnnotationType | Enum dei nomi dei sottotipi di annotazione PDF standard |
AnnotationFlags | IntFlag del comportamento di visualizzazione/interazione dell’annotazione |
AnnotationName | str sottoclasse che indica un valore da serializzare come nome PDF |
PDF3DAnnotation / PDF3DArtwork / PDF3DContent / PDF3DView | Modello di annotazione 3D e opera d’arte in pre-release |
PDF3DRenderMode / PDF3DLightingScheme | Enum per la modalità di rendering della vista 3D e lo schema di illuminazione |