DocumentVisitor

DocumentVisitor — Aspose.Note FOSS for Python API Reference

คลาส: DocumentVisitor

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

DocumentVisitor เป็นคลาสฐานแบบนามธรรมสำหรับการเดินทางแบบ visitor-pattern ของโครงสร้างต้นไม้เอกสาร OneNote. สร้างคลาสย่อยจากมันและเขียนทับเฉพาะเมธอด visit ที่คุณต้องการ. เรียก node.Accept(visitor) เพื่อเริ่มการเดินทางจากโหนดใดก็ได้; เรียก doc.Accept(visitor) เพื่อเดินทางทั่วทั้งเอกสาร.

เมธอดทั้งหมดในคลาสฐานเป็น no-ops (return None). Override เฉพาะที่เกี่ยวข้องกับกรณีการใช้งานของคุณเท่านั้น.


เมธอด Visit

Methodถูกเรียกเมื่อประเภทพารามิเตอร์
VisitDocumentStart(document)กำลังเข้าสู่ Document โหนดDocument
VisitDocumentEnd(document)กำลังออกจาก Document โหนดDocument
VisitPageStart(page)กำลังเข้าสู่ Page โหนดPage
VisitPageEnd(page)กำลังออกจาก Page โหนดPage
VisitTitleStart(title)กำลังเข้าสู่ Title โหนดTitle
VisitTitleEnd(title)กำลังออกจาก Title nodeTitle
VisitOutlineStart(outline)กำลังเข้าสู่ Outline nodeOutline
VisitOutlineEnd(outline)การออกจาก Outline โหนดOutline
VisitOutlineElementStart(outline_element)กำลังเข้าสู่ OutlineElement โหนดOutlineElement
VisitOutlineElementEnd(outline_element)กำลังออกจาก OutlineElement โหนดOutlineElement
VisitRichTextStart(rich_text)กำลังเข้าสู่ a RichText nodeRichText
VisitRichTextEnd(rich_text)การออกจาก RichText nodeRichText
VisitImageStart(image)กำลังเข้าสู่ Image โหนดImage
VisitImageEnd(image)กำลังออกจาก Image โหนดImage

เมธอดทั้งหมดมีลายเซ็นดังนี้:

def VisitXxxStart(self, node: NodeType) -> None: ...
def VisitXxxEnd(self, node: NodeType) -> None: ...

ลำดับการเดินทาง

Accept กระจายในการท่องแบบลึก-แรก (depth-first, pre-order):

  1. VisitDocumentStart จะถูกเรียกเมื่อเข้าสู่เอกสาร.
  2. แต่ละ child Page จะถูกเยี่ยมชมแบบเรียกซ้ำ (PageStart → children → PageEnd).
  3. ภายใน a Page: TitleStart/End, แล้วแต่ละ Outline (OutlineStart → OutlineElements → OutlineEnd).
  4. ภายใน an OutlineElement: OutlineElementStart, แล้ว children (RichText, Image, nested elements), แล้ว 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}")

ดึงรูปภาพทั้งหมดผ่าน visitor

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. ไม่มีเมธอด visit สำหรับ Table, TableRow, TableCell, AttachedFile, หรือ NumberList — โหนดเหล่านั้นเข้าถึงผ่าน GetChildNodes การท่องแทน.


ดูเพิ่มเติม

 ภาษาไทย