Огляд функцій — Aspose.Note FOSS для Python

Aspose.Note FOSS for Python (package aspose-note, version 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)
  • Завантаження на основі потоків усуває дискові I/O для робочих процесів у пам’яті або мережі
  • 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(). Підтримується через необов’язковий бекенд 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 викличе помилку імпорту під час виконання.
 Українська