DocumentVisitor — Aspose.Note FOSS for Python API Reference
Clase: DocumentVisitor
Package: aspose.note Import: from aspose.note import DocumentVisitor
DocumentVisitor es la clase base abstracta para el recorrido con patrón visitante de un árbol de documentos OneNote. Derívala y sobrescribe solo los métodos de visita que necesites. Llama node.Accept(visitor) para iniciar el recorrido desde cualquier nodo; llama doc.Accept(visitor) para recorrer todo el documento.
Todos los métodos en la clase base no hacen nada (devuelven None). Sobrescribe solo los que sean relevantes para tu caso de uso.
Métodos de visita
| Method | Se llama cuando | Tipo de parámetro |
|---|---|---|
VisitDocumentStart(document) | Entrando en un Document nodo | Document |
VisitDocumentEnd(document) | Saliendo de un Document nodo | Document |
VisitPageStart(page) | Entrando en un Page nodo | Page |
VisitPageEnd(page) | Saliendo de un Page nodo | Page |
VisitTitleStart(title) | Entrando en un Title nodo | Title |
VisitTitleEnd(title) | Saliendo de un Title nodo | Title |
VisitOutlineStart(outline) | Entrando a un Outline nodo | Outline |
VisitOutlineEnd(outline) | Saliendo de un Outline nodo | Outline |
VisitOutlineElementStart(outline_element) | Entrando a un OutlineElement nodo | OutlineElement |
VisitOutlineElementEnd(outline_element) | Saliendo de un OutlineElement nodo | OutlineElement |
VisitRichTextStart(rich_text) | Entrando a una RichText nodo | RichText |
VisitRichTextEnd(rich_text) | Saliendo de una RichText nodo | RichText |
VisitImageStart(image) | Entrando en un Image nodo | Image |
VisitImageEnd(image) | Saliendo de un Image nodo | Image |
Todos los métodos tienen la firma:
def VisitXxxStart(self, node: NodeType) -> None: ...
def VisitXxxEnd(self, node: NodeType) -> None: ...Orden de recorrido
Accept despachos en un recorrido en profundidad, preorden:
VisitDocumentStartse llama al entrar al documento.- Cada hijo
Pagese visita recursivamente (PageStart → children → PageEnd). - Dentro de un
Page:TitleStart/End, luego cadaOutline(OutlineStart → OutlineElements → OutlineEnd). - Dentro de un
OutlineElement:OutlineElementStart, luego hijos (RichText,Image, elementos anidados), luegoOutlineElementEnd. VisitDocumentEndse llama después de que se hayan visitado todas las páginas.
Ejemplos de uso
Recopila todos los títulos de página
from aspose.note import Document, DocumentVisitor, Page, Title
class TitleCollector(DocumentVisitor):
def __init__(self):
self.titles = []
def VisitTitleStart(self, title: Title) -> None:
if title.TitleText:
self.titles.append(title.TitleText.Text)
doc = Document("MyNotes.one")
visitor = TitleCollector()
doc.Accept(visitor)
print(visitor.titles)Contar nodos por tipo
from aspose.note import Document, DocumentVisitor, Page, RichText, Image
class NodeCounter(DocumentVisitor):
def __init__(self):
self.pages = 0
self.rich_texts = 0
self.images = 0
def VisitPageStart(self, page: Page) -> None:
self.pages += 1
def VisitRichTextStart(self, rich_text: RichText) -> None:
self.rich_texts += 1
def VisitImageStart(self, image: Image) -> None:
self.images += 1
doc = Document("MyNotes.one")
counter = NodeCounter()
doc.Accept(counter)
print(f"Pages: {counter.pages}, RichText: {counter.rich_texts}, Images: {counter.images}")Extraer todas las imágenes mediante el visitante
from aspose.note import Document, DocumentVisitor, Image
class ImageExtractor(DocumentVisitor):
def __init__(self):
self.images = []
def VisitImageStart(self, image: Image) -> None:
if image.Bytes:
self.images.append(image)
doc = Document("MyNotes.one")
extractor = ImageExtractor()
doc.Accept(extractor)
for i, img in enumerate(extractor.images):
filename = img.FileName or f"image_{i}.bin"
with open(filename, "wb") as f:
f.write(img.Bytes)
print(f"Saved: {filename} ({len(img.Bytes)} bytes)")Crear un informe del esquema del documento
from aspose.note import (
Document, DocumentVisitor,
Page, Outline, OutlineElement, RichText
)
class OutlineReporter(DocumentVisitor):
def __init__(self):
self._indent = 0
self.lines = []
def VisitPageStart(self, page: Page) -> None:
title = page.Title.TitleText.Text if page.Title and page.Title.TitleText else "(untitled)"
self.lines.append(f"PAGE: {title}")
self._indent = 1
def VisitOutlineElementStart(self, elem: OutlineElement) -> None:
self._indent = 2 + elem.IndentLevel
def VisitRichTextStart(self, rt: RichText) -> None:
if rt.Text.strip():
self.lines.append(" " * self._indent + rt.Text.strip())
doc = Document("MyNotes.one")
reporter = OutlineReporter()
doc.Accept(reporter)
print("\n".join(reporter.lines))Visitar desde un subnodo
Accept puede llamarse en cualquier nodo, no solo en el documento raíz:
from aspose.note import Document, Page, DocumentVisitor, RichText
class TextPrinter(DocumentVisitor):
def VisitRichTextStart(self, rt: RichText) -> None:
print(rt.Text)
doc = Document("MyNotes.one")
pages = doc.GetChildNodes(Page)
if pages:
# Visit only the first page
pages[0].Accept(TextPrinter())Tipos de nodo compatibles
El visitante actualmente despacha para estos tipos de nodo: Document, Page, Title, Outline, OutlineElement, RichText, Image. No existen métodos de visita para Table, TableRow, TableCell, AttachedFile, o NumberList — esos nodos se alcanzan mediante GetChildNodes recorrido en su lugar.