DocumentVisitor — Aspose.Note FOSS for Python API Reference
Клас: DocumentVisitor
Package: aspose.note Import: from aspose.note import DocumentVisitor
DocumentVisitor е абстрактен базов клас за обхождане по шаблона посетител (visitor-pattern) на дървото на документ OneNote. Наследете го и презапишете само методите за посещение, от които се нуждаете. Извикайте node.Accept(visitor) за да започнете обхождането от който и да е възел; извикайте doc.Accept(visitor) за да обхождате целия документ.
Всички методи в базовия клас са без действие (връщат None). Презапишете само тези, които са релевантни за вашия случай.
Методи за посещение
| Method | Извиква се, когато | Тип на параметъра |
|---|---|---|
VisitDocumentStart(document) | Влизане в Document възел | Document |
VisitDocumentEnd(document) | Излизане от Document възел | Document |
VisitPageStart(page) | Влизане в Page възел | Page |
VisitPageEnd(page) | Излизане от Page node | Page |
VisitTitleStart(title) | Влизане в Title node | Title |
VisitTitleEnd(title) | Напускайки Title възел | Title |
VisitOutlineStart(outline) | Влизайки в Outline възел | Outline |
VisitOutlineEnd(outline) | Напускайки Outline възел | Outline |
VisitOutlineElementStart(outline_element) | Влизайки OutlineElement възел | OutlineElement |
VisitOutlineElementEnd(outline_element) | Излизане от OutlineElement възел | OutlineElement |
VisitRichTextStart(rich_text) | Влизане в RichText възел | RichText |
VisitRichTextEnd(rich_text) | Напускайки RichText възел | RichText |
VisitImageStart(image) | Влизайки в Image възел | Image |
VisitImageEnd(image) | Оставяйки Image възел | Image |
Всички методи имат следния подпис:
def VisitXxxStart(self, node: NodeType) -> None: ...
def VisitXxxEnd(self, node: NodeType) -> None: ...Ред на обхождане
Accept изпраща при дълбочинно, предварително (pre-order) обхождане:
VisitDocumentStartсе извиква при влизане в документа.- Всеки дете
Pageсе посещава рекурсивно (PageStart → children → PageEnd). - В рамките на
Page:TitleStart/End, след това всекиOutline(OutlineStart → OutlineElements → OutlineEnd). - В рамките на
OutlineElement:OutlineElementStart, след това деца (RichText,Image, вложени елементи), thenOutlineElementEnd. VisitDocumentEndсе извиква след като всички страници са посетени.
Примери за употреба
Събиране на всички заглавия на страници
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)Брой възли по тип
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}")Извличане на всички изображения чрез посетител
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)")Създаване на доклад за структурата на документа
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))Посещение от подвъзел
Accept може да се извика върху всеки възел, не само върху кореновия документ:
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())Поддържани типове възли
Посетителят в момента разпределя за следните типове възли: Document, Page, Title, Outline, OutlineElement, RichText, Image. Няма методи за посещение на Table, TableRow, TableCell, AttachedFile, или NumberList — тези възли се достигат чрез GetChildNodes обхождане вместо.
Вижте също
- Документ: коренов възел; извикване
doc.Accept(visitor)за да започнете пълно обхождане - Страница:
VisitPageStart/VisitPageEnd - Контур:
VisitOutlineStart/VisitOutlineEnd - RichText:
VisitRichTextStart/VisitRichTextEnd - Изображение:
VisitImageStart/VisitImageEnd