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 nodePage
VisitTitleStart(title)Влизане в Title nodeTitle
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) обхождане:

  1. VisitDocumentStart се извиква при влизане в документа.
  2. Всеки дете Page се посещава рекурсивно (PageStart → children → PageEnd).
  3. В рамките на Page: TitleStart/End, след това всеки Outline (OutlineStart → OutlineElements → OutlineEnd).
  4. В рамките на OutlineElement: OutlineElementStart, след това деца (RichText, Image, вложени елементи), then OutlineElementEnd.
  5. 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 обхождане вместо.


Вижте също

 Български