Робота з 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 | Опис |
|---|---|---|---|
LoadHistory | bool | False | Коли True, ревізії історії сторінки включаються в DOM і доступні через Document.GetPageHistory |
DocumentPassword | `str | None` | 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об’єкт, колиLoadHistoryisFalse(за замовчуванням). Завжди встановлюйте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
DetectLayoutChangesbeforeSave:При програмному створенні документа та додаванні вузлів викликайтеDetectLayoutChanges()щоб забезпечити узгодженість координат розмітки перед експортом у PDF.
Поширені проблеми
| Проблема | Причина | Виправлення |
|---|---|---|
IncorrectPasswordException при завантаженні | Файл зашифровано; зашифровані документи не підтримуються | Отримайте незашифровану копію файлу |
FileCorruptedException при завантаженні | Файл урізаний або має непідтримуваний внутрішній формат | Перевірте, що файл містить дійсний розділ .one (не .onetoc2 зміст) |
UnsupportedSaveFormatException при збереженні | Спроба зберегти у формат, відмінний від PDF | Для експорту підтримується лише формат PDF |
Порожній результат GetPageHistory | LoadOptions.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.IsConflictPage | True для копій конфліктів синхронізації |
Дивіться також
- Видобування тексту: видобування простого тексту та форматованих фрагментів
- Експорт PDF: опції експорту, вибір сторінок та виведення потоку
- Зображення та вкладення: вилучення вбудованих зображень та прикріплених файлів
- Tables: аналіз структури таблиці та вмісту клітинок
- API Reference: Документ
- Aspose.Note — Enterprise Documentation