How to Read Page Metadata from OneNote in Python

How to Read Page Metadata from OneNote in Python

OneNote .one files store metadata you can read without parsing the full document DOM. At the document level, Document.FileFormat tells you which OneNote variant the file uses. At the page level, each Page carries the author, creation timestamp, last-modified timestamp, and hierarchy level. Aspose.Note FOSS for Python exposes these through the Document and Page classes.


Prerequisites

pip install aspose-note

Document-Level Metadata

The Document object exposes one metadata property:

PropertyTypeDescription
doc.FileFormatFileFormatThe OneNote variant: FileFormat.OneNote2010, FileFormat.OneNoteOnline, or FileFormat.Unknown.
from aspose.note import Document

doc = Document("MyNotes.one")
print(f"File format: {doc.FileFormat}")

Page-Level Metadata

Each Page object carries:

PropertyTypeDescription
page.Authorstr | NoneThe display name of the user who created or owns the page.
page.CreationTimedatetime | NoneWhen the page was created. Returns a Python datetime object in UTC.
page.LastModifiedTimedatetime | NoneWhen the page was last modified.
page.Levelint | NoneSub-page indent level. 0 = top-level page, 1 = first-level sub-page, 2 = second-level, etc.

Step 1: Read Metadata for Every Page

from aspose.note import Document, Page

doc = Document("ProjectNotes.one")

for i, page in enumerate(doc, start=1):
    title = ""
    if page.Title and page.Title.TitleText:
        title = page.Title.TitleText.Text.strip()

    level = page.Level or 0
    indent = "  " * level

    author = page.Author or "(unknown)"
    created = page.CreationTime.strftime("%Y-%m-%d") if page.CreationTime else "(none)"
    modified = page.LastModifiedTime.strftime("%Y-%m-%d %H:%M") if page.LastModifiedTime else "(none)"

    print(f"{indent}[{i}] {title or '(untitled)'}")
    print(f"{indent}    Author:   {author}")
    print(f"{indent}    Created:  {created}")
    print(f"{indent}    Modified: {modified}")
    print(f"{indent}    Level:    {level}")

Complete Example: Metadata Report

from aspose.note import Document

def print_metadata_report(one_path: str) -> None:
    doc = Document(one_path)

    print()

    for i, page in enumerate(doc, start=1):
        title = ""
        if page.Title and page.Title.TitleText:
            title = page.Title.TitleText.Text.strip()

        level = page.Level or 0
        prefix = "  " * level + f"[{i}]"

        parts = [prefix, f'"{title or "(untitled)"}"']
        if page.Author:
            parts.append(f"by {page.Author}")
        if page.CreationTime:
            parts.append(f"created {page.CreationTime.strftime('%Y-%m-%d')}")
        if page.LastModifiedTime:
            parts.append(f"modified {page.LastModifiedTime.strftime('%Y-%m-%d')}")

        print("  ".join(parts))

print_metadata_report("ProjectNotes.one")

Detecting Sub-Pages

In OneNote, sub-pages are visually indented under their parent page. The page.Level property reflects this nesting:

from aspose.note import Document

doc = Document("MyNotes.one")

for page in doc:
    level = page.Level or 0
    title = ""
    if page.Title and page.Title.TitleText:
        title = page.Title.TitleText.Text.strip()

    indent = "  " * level
    marker = "├─" if level > 0 else "•"
    print(f"{indent}{marker} {title or '(untitled)'}")

Level values:

  • 0: top-level page
  • 1: first-level sub-page (one indent)
  • 2: second-level sub-page (two indents)

Notes

  • All timestamps (CreationTime, LastModifiedTime) are datetime objects in UTC when present.
  • page.Level returns None for pages where the level was not stored in the binary format. Treat None as 0 using page.Level or 0.

See Also

 English