Робота з Note Document

У цьому посібнику пояснюється, як завантажувати, обходити та експортувати файли Microsoft OneNote .one у Python за допомогою класу Document з Aspose.Note FOSS. Клас Document є коренем моделі об’єктного документа (DOM), і кожна операція читання, обходу або експорту починається з екземпляра Document, який представляє окремий файл розділу .one.


Завантаження документа

Завантаження з шляху до файлу

Передайте шлях до файлу .one безпосередньо конструктору Document:

from aspose.note import Document

doc = Document("MyNotes.one")

Завантаження з бінарного потоку

Використовуйте об’єкт, схожий на файл, коли дані надходять у відповідь на мережевий запит, з блобу хмарного сховища або з буфера в пам’яті:

from pathlib import Path
from aspose.note import Document

with Path("MyNotes.one").open("rb") as f:
    doc = Document(f)

Створіть порожній документ

Створіть Document без аргументів, щоб програмно створити новий документ OneNote:

from aspose.note import Document, Page

doc = Document()
doc.AppendChildLast(Page())

Завантажити з параметрами

Використовуйте LoadOptions, щоб задати необов’язкові параметри, такі як завантаження історії під час створення:

from aspose.note import Document, LoadOptions

opts = LoadOptions()
opts.LoadHistory = True   # include page revision history in the DOM
doc = Document("MyNotes.one", opts)
LoadOptions властивістьТипDefaultОпис
LoadHistoryboolFalseКоли True, ревізії історії сторінки включаються в DOM і доступні через Document.GetPageHistory
DocumentPassword`strNone`None

Виявлення формату документа

Властивість FileFormat визначає, який варіант формату OneNote використовується у файлі:

from aspose.note import Document, FileFormat

doc = Document("MyNotes.one")

if doc.FileFormat == FileFormat.OneNote2010:
    print("OneNote 2010 format")
elif doc.FileFormat == FileFormat.OneNoteOnline:
    print("OneNote Online format")
elif doc.FileFormat == FileFormat.OneNote2007:
    print("OneNote 2007 format")
else:
    print("Format:", doc.FileFormat)
FileFormat значенняОпис
OneNote2010Стандартний файл .one, створений OneNote 2010 і пізніше
OneNoteOnline.one файл, створений OneNote Online / Microsoft 365
OneNote2007Застарілий формат .one від OneNote 2007
UnknownНе вдалося ідентифікувати формат

Перебір сторінок

Сторінки є безпосередніми дочірніми елементами Document. Оскільки Document реалізує перераховувач, ви можете перебирати їх за допомогою простого циклу for:

from aspose.note import Document

doc = Document("MyNotes.one")

for page in doc:
    title_text = (
        page.Title.TitleText
        if page.Title and page.Title.TitleText
        else "(untitled)"
    )
    print(title_text)

Якщо вам потрібно одразу отримати всі дочірні вузли певного типу, використайте метод GetChildNodes і передайте потрібний клас вузла як аргумент:

# Replace DesiredNodeType below with the specific node class you want to collect
nodes = doc.GetChildNodes(DesiredNodeType)
print(f"Total nodes: {len(nodes)}")

Обхід дерева документа

Document успадковується від CompositeNode, надаючи йому повні методи обходу дерева:

from aspose.note import Document, RichText

doc = Document("MyNotes.one")

# Extract all plain text from the entire document
all_text = [rt.Text for rt in doc.GetChildNodes(RichText) if rt.Text]
print("\n".join(all_text))

Ієрархія DOM:

Document
  └── Page (0..n)
        ├── Title
        │     ├── TitleText (RichText)
        │     ├── TitleDate (RichText)
        │     └── TitleTime (RichText)
        └── Outline (0..n)
              └── OutlineElement (0..n)
                    ├── RichText
                    ├── Image
                    ├── Table
                    │     └── TableRow → TableCell → RichText / Image
                    └── AttachedFile

Ключові методи обходу, успадковані від CompositeNode:

МетодОпис
GetChildNodes(NodeType)Повернути типізований список усіх нащадків, які відповідають заданому типу
AppendChildLast(node)Додати дочірній вузол у кінець списку дочірніх елементів
AppendChildFirst(node)Додати дочірній вузол на початок
InsertChild(index, node)Вставити дочірній елемент у певному індексі
RemoveChild(node)Видалити дочірній вузол
GetEnumerator()Перебрати прямі дочірні елементи

Історія сторінки

При завантаженні з LoadHistory=True, Document.GetPageHistory повертає всі збережені ревізії сторінки, впорядковані від найстарішої до найновішої:

from aspose.note import Document, LoadOptions

opts = LoadOptions()
opts.LoadHistory = True
doc = Document("MyNotes.one")

for page in doc.GetChildNodes(None.__class__.__mro__[0]):  # iterate pages
    pass

# Get revisions for a specific page
import aspose.note as an

doc2 = Document("MyNotes.one", opts)
pages = doc2.GetChildNodes(an.Page)
if pages:
    history = doc2.GetPageHistory(pages[0])
    print(f"Revision count: {history.Count}")
    for rev in history:
        print(f"  Modified: {rev.LastModifiedTime}")

Note: GetPageHistory повертає порожнє PageHistory об’єкт, коли LoadHistory is False (за замовчуванням). Завжди встановлюйте opts.LoadHistory = True перед завантаженням, якщо потрібні дані ревізії.


Збереження та експорт

Використовуйте Document.Save для експорту у PDF. PDF — єдиний підтримуваний формат експорту.

Зберегти у файл

Викличте Document.Save() з шляхом до файлу та SaveFormat.Pdf, щоб записати експорт безпосередньо на диск:

from aspose.note import Document, SaveFormat

doc = Document("MyNotes.one")
doc.Save("output.pdf", SaveFormat.Pdf)

Зберегти у поток у пам’яті

Передайте записувальний буфер io.BytesIO замість шляху, щоб захопити байти PDF у пам’яті:

import io
from aspose.note import Document, SaveFormat

doc = Document("MyNotes.one")
buf = io.BytesIO()
doc.Save(buf, SaveFormat.Pdf)
pdf_bytes = buf.getvalue()

Зберегти з параметрами

Використовуйте PdfSaveOptions з aspose.note.saving, щоб керувати тим, які сторінки включені у експортований PDF-вивід:

import io
from aspose.note import Document
from aspose.note.saving import PdfSaveOptions

doc = Document("MyNotes.one")

# Export pages 2 and 3 only (zero-based index)
opts = PdfSaveOptions(PageIndex=1, PageCount=2)
buf = io.BytesIO()
doc.Save(buf, opts)
pdf_bytes = buf.getvalue()

Important: PDF export вимагає необов’язкову залежність ReportLab. Встановіть [pdf] додаток, щоб увімкнути його.


Виявлення змін макету

Викличте DetectLayoutChanges після зміни документа, щоб перерахувати метрики макету перед збереженням:

from aspose.note import Document, Page

doc = Document()
page = Page()
doc.AppendChildLast(page)

# ... add content to page ...

doc.DetectLayoutChanges()
doc.Save("output.pdf")

Поради та найкращі практики

  • Завантажте один раз, виконуйте запити багато разів: Document завантажує весь .one файл у пам’ять під час створення. Тримайте один Document екземпляр і викликайте GetChildNodes багаторазово, а не перезавантажуючи файл для кожного запиту.
  • Check IsConflictPage: OneNote sync може створювати сторінки конфліктів. Фільтруйте за допомогою [p for p in doc if not p.IsConflictPage] перед обробкою вмісту.
  • Використовуйте LoadHistory=False (за замовчуванням) для швидкості: Історія сторінок додає значне навантаження на пам’ять та парсинг. Встановлюйте лише LoadHistory=True коли вам явно потрібні дані ревізії.
  • Stream для великих файлів: Передайте відкритий файловий об’єкт замість рядка шляху під час читання великих .one файли, щоб уникнути залишення файлу відкритим після завершення розбору.
  • Call DetectLayoutChanges before Save:При програмному створенні документа та додаванні вузлів викликайте DetectLayoutChanges() щоб забезпечити узгодженість координат розмітки перед експортом у PDF.

Поширені проблеми

ПроблемаПричинаВиправлення
IncorrectPasswordException при завантаженніФайл зашифровано; зашифровані документи не підтримуютьсяОтримайте незашифровану копію файлу
FileCorruptedException при завантаженніФайл урізаний або має непідтримуваний внутрішній форматПеревірте, що файл містить дійсний розділ .one (не .onetoc2 зміст)
UnsupportedSaveFormatException при збереженніСпроба зберегти у формат, відмінний від PDFДля експорту підтримується лише формат PDF
Порожній результат GetPageHistoryLoadOptions.LoadHistory не було встановлено в True перед завантаженнямПерезавантажте документ за допомогою opts.LoadHistory = True
ModuleNotFoundError: reportlabСпроба експорту PDF без додатку PDFВстановіть додаток [pdf]

FAQ

Які формати OneNote може читати Aspose.Note?

Усі три формати розділів OneNote: OneNote2007, OneNote2010 та OneNoteOnline. Використовуйте doc.FileFormat, щоб визначити, який варіант був завантажений.

Чи можу я записати назад у файл .one після його читання?

Aspose.Note для Python є бібліотекою для читання та експорту. Використовуйте Document.Save, щоб записати PDF-вивід. Двійковий формат OneNote лише для читання у цій FOSS-версії.

Як прочитати конкретну сторінку за назвою?

Ітерація сторінок за допомогою виразу-генератора та порівняння властивості тексту назви з вашим рядком-ціллю:

from aspose.note import Document

doc = Document("MyNotes.one")
target = next(
    (p for p in doc
     if p.Title and p.Title.TitleText and p.Title.TitleText.Text == "My Page"),
    None,
)

Як підрахувати підсторінки окремо від сторінок верхнього рівня?

Використовуйте page.Level: рівень 1 — це верхній рівень, рівень 2 — підсторінка, і так далі.

from aspose.note import Document

doc = Document("MyNotes.one")
top_level = [p for p in doc if (p.Level or 1) == 1]
sub_pages  = [p for p in doc if (p.Level or 1) > 1]
print(f"Top-level: {len(top_level)}, Sub-pages: {len(sub_pages)}")

Чи підтримує Aspose.Note файли змісту .onetoc2?

Ні. Підтримуються лише файли розділів .one. Ноутбуки .onetoc2 викличуть FileCorruptedException.


API Reference Підсумок

Клас / МетодОпис
Document(path_or_stream, options?)Завантажте файл .one або створіть порожній документ
Document.FileFormatВиявлений варіант формату (FileFormat enum)
Document.GetChildNodes(NodeType)Отримати всі дочірні вузли заданого типу
Document.GetPageHistory(page)Отримати історію правок сторінки (вимагає LoadHistory=True)
Document.Save(target, format_or_options)Експортувати у PDF за шляхом до файлу або потоком
Document.DetectLayoutChanges()Перерахувати метрики макету після програмних правок
Document.Accept(visitor)Обійти DOM за допомогою підкласу DocumentVisitor
LoadOptions.LoadHistoryВстановити True, щоб включити ревізії сторінки в DOM
LoadOptions.DocumentPasswordЗарезервовано; зашифровані файли викликають IncorrectPasswordException
FileFormatПерелічення: OneNote2010, OneNoteOnline, OneNote2007, Unknown
SaveFormat.PdfЄдиний підтримуваний формат експорту; викликає ValueError для інших форматів
PageHistory.CountКількість доступних ревізій сторінки
Page.LevelГлибина підсторінки (1 = верхній рівень)
Page.IsConflictPageTrue для копій конфліктів синхронізації

Дивіться також

 Українська