Обзор функций — Aspose.Note FOSS для Python

Aspose.Note FOSS for Python (package aspose-note, версия 26.3.1) предоставляет Python API для чтения Microsoft OneNote .one файлы разделов и их экспорт в PDF. Все перечисленные ниже функции проверены по исходному коду репозитория, README и примерным скриптам.

Установка и настройка

Установите из PyPI:

pip install aspose-note

Для поддержки экспорта в PDF (требуется ReportLab):

pip install "aspose-note[pdf]"

Требования: Python 3.10 или новее. Установка Microsoft Office не требуется.


Функции и возможности

.Загрузка файлов .one

Загружайте файлы разделов Microsoft OneNote из пути к файлу или любого бинарного потока (дескриптор файла, io.BytesIO, тело HTTP‑ответа, поток облачного хранилища).

  • Document.FileFormat предоставляет приблизительное определение версии формата файла OneNote (OneNote2010, OneNoteOnline или OneNote2007)
  • Загрузка на основе потоков устраняет операции ввода‑вывода на диск для процессов в памяти или сетевых рабочих потоков.
  • LoadOptions.LoadHistory флаг управляет тем, включена ли история страниц в DOM
from aspose.note import Document

##From a file path
doc = Document("notebook.one")

##From a binary stream
with open("notebook.one", "rb") as f:
    doc = Document(f)

Обход DOM документа

Полный документ OneNote представлен в виде дерева типизированных объектов Python. Каждый узел наследуется от Node или CompositeNode:

  • Document: корень; раскрывает DisplayName, CreationTime, FileFormat
  • Page: прямой дочерний элемент Document; раскрывает Title, Author, CreationTime, LastModifiedTime, Level
  • Title: раскрывает TitleText, TitleDate, TitleTime (все RichText узлы)
  • Outline: позиционный контейнер с HorizontalOffset, VerticalOffset, MaxWidth, MaxHeight, MinWidth, ReservedWidth, IndentPosition
  • OutlineElement: листовой контейнер; раскрывает NumberList

Методы навигации CompositeNode:

Метод / СвойствоОписание
FirstChild, LastChildПрямой доступ к дочернему элементу
GetChildNodes(Type)Рекурсивный поиск с фильтрацией по типу
AppendChildLast(node)Добавить дочерний элемент в конец
AppendChildFirst(node)Добавить дочерний элемент в начало
InsertChild(index, node)Вставить в позицию
RemoveChild(node)Удалить дочерний элемент
for child in nodeПеребрать прямых дочерних элементов
from aspose.note import Document, Page, Outline, OutlineElement, RichText

doc = Document("notebook.one")
for page in doc.GetChildNodes(Page):
    title_text = page.Title.TitleText.Text if page.Title and page.Title.TitleText else ""
    print(f"Page: {title_text}")
    for outline in page.GetChildNodes(Outline):
        for oe in outline.GetChildNodes(OutlineElement):
            for rt in oe.GetChildNodes(RichText):
                print(f"  {rt.Text}")

Извлечение содержимого Rich Text

RichText узлы предоставляют:

  • Text: str: полная строка простого текста
  • TextRuns: list[TextRun]: список отформатированных сегментов
  • Tags: list[NoteTag]: теги OneNote, прикреплённые к этому блоку
  • Append(text, style=None): добавить текстовый фрагмент в памяти
  • Replace(old_value, new_value): подстановка строки в памяти

Каждый TextRun содержит:

СвойствоТипОписание
TextstrТекст сегмента
StyleTextStyleМетаданные форматирования

TextStyle свойства:

СвойствоТип
IsBold, IsItalic, IsUnderline, IsStrikethroughbool
IsSuperscript, IsSubscriptbool
FontName`str
FontSize`float
FontColor, Highlight`int
Language`int
IsHyperlinkbool
HyperlinkAddress`str
from aspose.note import Document, RichText

doc = Document("notebook.one")
for rt in doc.GetChildNodes(RichText):
    for run in rt.TextRuns:
        if run.Style.IsHyperlink:
            print(f"Hyperlink: {run.Text} -> {run.Style.HyperlinkAddress}")
        if run.Style.IsBold:
            print(f"Bold text: {run.Text}")

Извлечение изображений

Image узлы предоставляют необработанные байты и метаданные для каждого встроенного изображения:

СвойствоТипОписание
FileName`strNone`
BytesbytesНеобработанные данные изображения
Width, Height`floatNone`
AlternativeTextTitle`strNone`
AlternativeTextDescription`strNone`
HyperlinkUrl`strNone`
Tagslist[NoteTag]Прикреплённые теги OneNote
from aspose.note import Document, Image

doc = Document("notebook.one")
for i, img in enumerate(doc.GetChildNodes(Image), start=1):
    filename = img.FileName or f"image_{i}.bin"
    with open(filename, "wb") as f:
        f.write(img.Bytes)
    print(f"Saved: {filename}  ({img.Width} x {img.Height} pts)")

Извлечение вложенных файлов

AttachedFile узлы предоставляют встроенные вложения файлов:

СвойствоТипОписание
FileName`strNone`
BytesbytesНеобработанные данные файла
Tagslist[NoteTag]Прикреплённые теги OneNote
from aspose.note import Document, AttachedFile

doc = Document("notebook.one")
for i, af in enumerate(doc.GetChildNodes(AttachedFile), start=1):
    filename = af.FileName or f"attachment_{i}.bin"
    with open(filename, "wb") as f:
        f.write(af.Bytes)

Разбор таблиц

Table, TableRow, и TableCell отобразить полную структуру таблицы:

КлассКлючевые свойства
TableColumns: list[TableColumn] (каждый TableColumn имеет .Width и .LockedWidth), IsBordersVisible: bool, Tags: list[NoteTag]
TableRowИтерировать ячейки через GetChildNodes(TableCell)
TableCellСодержит RichText, Image, и другие узлы контента
from aspose.note import Document, Table, TableRow, TableCell, RichText

doc = Document("notebook.one")
for table in doc.GetChildNodes(Table):
    print("Column widths:", [col.Width for col in table.Columns])
    for r, row in enumerate(table.GetChildNodes(TableRow), start=1):
        cells = row.GetChildNodes(TableCell)
        values = [
            " ".join(rt.Text for rt in cell.GetChildNodes(RichText)).strip()
            for cell in cells
        ]
        print(f"Row {r}:", values)

Проверка тегов OneNote

NoteTag отображается на RichText, Image, AttachedFile, и Table узлы через их .Tags свойство. OutlineElement не имеет .Tags свойство. NoteTag свойства:

СвойствоТипОписание
Icon`intNone`
Label`strNone`
FontColor`intNone`
Highlight`intNone`
CreationTime`datetimeNone`
CompletedTime`datetimeNone`

Фабричный метод: NoteTag.CreateYellowStar() создаёт стандартный узел тега «жёлтая звезда».

from aspose.note import Document, RichText

doc = Document("notebook.one")
for rt in doc.GetChildNodes(RichText):
    for tag in rt.Tags:
        print(f"Tag: {tag.Label} (icon={tag.Icon}, completed={tag.CompletedTime})")

Поддержка нумерованных списков

OutlineElement.NumberList предоставляет:

СвойствоТипОписание
Format`strNone`
Restart`intNone`
from aspose.note import Document, OutlineElement

doc = Document("notebook.one")
for oe in doc.GetChildNodes(OutlineElement):
    nl = oe.NumberList
    if nl:
        print(f"format={nl.Format!r}")

Обход DocumentVisitor

DocumentVisitor предоставляет паттерн посетителя для структурированного обхода всего документа. Переопределите любой VisitXxxStart / VisitXxxEnd метод, чтобы перехватывать конкретные типы узлов:

  • VisitDocumentStart(doc) / VisitDocumentEnd(doc)
  • VisitPageStart(page) / VisitPageEnd(page)
  • VisitTitleStart(title) / VisitTitleEnd(title)
  • VisitOutlineStart(outline) / VisitOutlineEnd(outline)
  • VisitOutlineElementStart(oe) / VisitOutlineElementEnd(oe)
  • VisitRichTextStart(rt) / VisitRichTextEnd(rt)
  • VisitImageStart(img) / VisitImageEnd(img)
from aspose.note import Document, DocumentVisitor, Page, RichText, Image

class MySummaryVisitor(DocumentVisitor):
    def __init__(self):
        self.pages, self.texts, self.images = 0, 0, 0

    def VisitPageStart(self, page: Page) -> None:
        self.pages += 1

    def VisitRichTextStart(self, rt: RichText) -> None:
        self.texts += 1

    def VisitImageStart(self, img: Image) -> None:
        self.images += 1

doc = Document("notebook.one")
v = MySummaryVisitor()
doc.Accept(v)
print(f"Pages={v.pages}  RichText={v.texts}  Images={v.images}")

Экспорт PDF

Сохранить загруженный документ в PDF с помощью Document.Save(). Поддерживается через необязательный backend ReportLab.

from aspose.note import Document, SaveFormat

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

PdfSaveOptions

ОпцияТипОписание
PageIndexintПоле существует; не передаётся в PDF‑экспортер в версии v26.3.1 (не имеет эффекта)
PageCount`intNone`
ImageCompression`AnyNone`
JpegQuality`intNone`
PageSettings`AnyNone`
PageSplittingAlgorithm`AnyNone`
import io
from aspose.note import Document, SaveFormat
from aspose.note.saving import PdfSaveOptions

doc = Document("notebook.one")

##Save to file
doc.Save("output.pdf", SaveFormat.Pdf)

##Save to in-memory stream
buf = io.BytesIO()
doc.Save(buf, PdfSaveOptions())
pdf_bytes = buf.getvalue()

Справочник форматов и перечислений

SaveFormat

ЗначениеСтатус
SaveFormat.PdfРеализовано (требуется ReportLab)

FileFormat

Document.FileFormat предоставляет максимально точное указание версии формата файла OneNote. Перечисление объявляет три значения:

ЗначениеОписание
FileFormat.OneNote2010Формат OneNote 2010
FileFormat.OneNoteOnlineФормат OneNote Online
FileFormat.OneNote2007Формат OneNote 2007

NodeType

NodeType.Document, NodeType.Page, NodeType.Outline, NodeType.OutlineElement, NodeType.RichText, NodeType.Image, NodeType.Table, NodeType.AttachedFile

HorizontalAlignment

HorizontalAlignment.Left, HorizontalAlignment.Center, HorizontalAlignment.Right


Текущие ограничения

ОграничениеПодробности
Только для чтенияЗапись обратно в .one формат не реализован
Нет шифрованияЗашифрованные документы вызывают IncorrectPasswordException
PDF только для экспортаДругое SaveFormat значения вызывают UnsupportedSaveFormatException
ReportLab требуется для PDFУстановить pip install "aspose-note[pdf]" отдельно
GetPageHistory возвращает список из одного элементаПолный обход истории страниц — заглушка; возвращает [page]
DetectLayoutChanges()Заглушка совместимости; без действия

Советы и лучшие практики

  • Проверьте на None: Page.Title, Title.TitleText, OutlineElement.NumberList, и большинство полей метаданных могут быть None. Всегда проверяйте с помощью if x is not None или if x перед доступом к свойствам.
  • Используйте GetChildNodes(Type) для рекурсивного поиска вместо ручного обхода дерева. Он ищет во всём поддереве.
  • Перебирайте прямых потомков с for child in node когда вам нужны только непосредственные дочерние элементы.
  • Обрабатывайте кодировку в Windows: В Windows, sys.stdout может использовать устаревшую кодовую страницу. Добавьте sys.stdout.reconfigure(encoding="utf-8", errors="replace") при запуске при печати текста Unicode.
  • Установить [pdf] дополнительные: Не импортировать SaveFormat.Pdf функциональность без предварительной установки pip install "aspose-note[pdf]". Без ReportLab сохранение в PDF вызовет ошибку импорта во время выполнения.
 Русский