DocumentVisitor

DocumentVisitor — Aspose.Note FOSS for Python API Reference

类:DocumentVisitor

Package: aspose.note Import: from aspose.note import DocumentVisitor

DocumentVisitor 是用于对 OneNote 文档树进行访问者模式遍历的抽象基类。子类化它并仅覆盖您需要的 visit 方法。调用 node.Accept(visitor) 以从任意节点开始遍历;调用 doc.Accept(visitor) 以遍历整个文档。.

基类中的所有方法都是空操作(返回 None)。仅覆盖与您的使用场景相关的方法。.


访问方法

Method被调用时参数类型
VisitDocumentStart(document)进入一个 Document 节点Document
VisitDocumentEnd(document)离开一个 Document 节点Document
VisitPageStart(page)进入一个 Page 节点Page
VisitPageEnd(page)离开一个 Page 节点Page
VisitTitleStart(title)进入一个 Title 节点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 在深度优先、先序遍历中分派::

  1. VisitDocumentStart 在进入文档时被调用。.
  2. 每个子节点 Page 被递归访问(PageStart → children → PageEnd)。.
  3. 在一个 Page: TitleStart/End,,然后每个 Outline (OutlineStart → OutlineElements → OutlineEnd)。.
  4. 在一个 OutlineElement: OutlineElementStart,,然后子节点(RichText, Image,,嵌套元素),然后 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 通过遍历实现。.


另见

  • 文档: 根节点; 调用 doc.Accept(visitor) 开始完整遍历
  • 页面: VisitPageStart / VisitPageEnd
  • 大纲: VisitOutlineStart / VisitOutlineEnd
  • RichText: VisitRichTextStart / VisitRichTextEnd
  • 图像: VisitImageStart / VisitImageEnd
 中文