Praca z dokumentem Note
Ten przewodnik wyjaśnia, jak ładować, przeglądać i eksportować pliki Microsoft OneNote .one w Python, używając klasy Document z Aspose.Note FOSS. Klasa Document jest korzeniem modelu obiektowego dokumentu (DOM), a każda operacja odczytu, przeglądania lub eksportu rozpoczyna się od instancji Document, która reprezentuje pojedynczy plik sekcji .one.
Ładowanie dokumentu
Ładowanie z ścieżki pliku
Przekaż ścieżkę do pliku .one bezpośrednio do konstruktora Document:
from aspose.note import Document
doc = Document("MyNotes.one")Ładowanie z strumienia binarnego
Użyj obiektu podobnego do pliku, gdy dane pochodzą z odpowiedzi sieciowej, blobu w chmurze lub bufora w pamięci:
from pathlib import Path
from aspose.note import Document
with Path("MyNotes.one").open("rb") as f:
doc = Document(f)Utwórz pusty dokument
Utwórz Document bez argumentów, aby programowo zbudować nowy dokument OneNote:
from aspose.note import Document, Page
doc = Document()
doc.AppendChildLast(Page())Wczytaj z opcjami
Użyj LoadOptions, aby ustawić opcjonalne parametry, takie jak wczytywanie historii w czasie konstrukcji:
from aspose.note import Document, LoadOptions
opts = LoadOptions()
opts.LoadHistory = True # include page revision history in the DOM
doc = Document("MyNotes.one", opts)LoadOptions właściwość | Typ | Default | Opis |
|---|---|---|---|
LoadHistory | bool | False | Gdy True, rewizje historii strony są zawarte w DOM i dostępne poprzez Document.GetPageHistory |
DocumentPassword | `str | None` | None |
Wykrywanie formatu dokumentu
Właściwość FileFormat określa, którego wariantu formatu OneNote używa plik:
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 wartość | Opis |
|---|---|
OneNote2010 | Standardowy plik .one utworzony przez OneNote od 2010 roku |
OneNoteOnline | Plik .one utworzony przez OneNote Online / Microsoft 365 |
OneNote2007 | Starszy format .one z OneNote 2007 |
Unknown | Nie można zidentyfikować formatu |
Iterowanie stron
Strony są bezpośrednimi dziećmi Document. Ponieważ Document implementuje enumerator, możesz iterować po nich przy użyciu prostej pętli 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)Jeśli potrzebujesz jednorazowo pobrać wszystkie węzły potomne określonego typu, użyj metody GetChildNodes i przekaż żądaną klasę węzła jako argument:
# Replace DesiredNodeType below with the specific node class you want to collect
nodes = doc.GetChildNodes(DesiredNodeType)
print(f"Total nodes: {len(nodes)}")Przeglądanie drzewa dokumentu
Document dziedziczy po CompositeNode, co daje mu pełne metody przeglądania drzewa:
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))Hierarchia 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
└── AttachedFileKluczowe metody przeglądania dziedziczone po CompositeNode:
| Metoda | Opis |
|---|---|
GetChildNodes(NodeType) | Zwróć typowaną listę wszystkich potomków pasujących do podanego typu |
AppendChildLast(node) | Dodaj węzeł dziecka na końcu listy dzieci |
AppendChildFirst(node) | Dodaj węzeł dziecka na początku |
InsertChild(index, node) | Wstaw dziecko pod określonym indeksem |
RemoveChild(node) | Usuń węzeł potomny |
GetEnumerator() | Iteruj bezpośrednie elementy potomne |
Historia strony
Po załadowaniu z LoadHistory=True, Document.GetPageHistory zwraca wszystkie zapisane wersje strony, uporządkowane od najstarszej do najnowszej:
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:
GetPageHistoryzwraca pustyPageHistoryobiekt, gdyLoadHistoryisFalse(domyślne). Zawsze ustawopts.LoadHistory = Trueprzed ładowaniem, jeśli potrzebujesz danych wersji.
Zapisywanie i eksportowanie
Użyj Document.Save do eksportu do PDF. PDF jest jedynym obsługiwanym formatem eksportu.
Zapisz do pliku
Wywołaj Document.Save() z ścieżką pliku i SaveFormat.Pdf, aby zapisać eksport bezpośrednio na dysku:
from aspose.note import Document, SaveFormat
doc = Document("MyNotes.one")
doc.Save("output.pdf", SaveFormat.Pdf)Zapisz do strumienia w pamięci
Przekaż zapisywalny bufor io.BytesIO zamiast ścieżki, aby przechwycić bajty PDF w pamięci:
import io
from aspose.note import Document, SaveFormat
doc = Document("MyNotes.one")
buf = io.BytesIO()
doc.Save(buf, SaveFormat.Pdf)
pdf_bytes = buf.getvalue()Zapisz z opcjami
Użyj PdfSaveOptions z aspose.note.saving, aby kontrolować, które strony są zawarte w wyeksportowanym pliku 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: Eksport PDF wymaga opcjonalnej zależności ReportLab. Zainstaluj
[pdf]rozszerzenie, aby ją włączyć.
Wykrywanie zmian układu
Wywołaj DetectLayoutChanges po zmodyfikowaniu dokumentu, aby ponownie obliczyć metryki układu przed zapisaniem:
from aspose.note import Document, Page
doc = Document()
page = Page()
doc.AppendChildLast(page)
# ... add content to page ...
doc.DetectLayoutChanges()
doc.Save("output.pdf")Wskazówki i najlepsze praktyki
- Wczytaj raz, zapytuj wiele razy:
Documentwczytuje cały.oneplik do pamięci podczas konstrukcji. Przechowuj jedenDocumentinstancję i wywołajGetChildNodeswielokrotnie, zamiast ponownego wczytywania pliku dla każdego zapytania. - Check
IsConflictPage: OneNote synchronizacja może generować strony konfliktów. Filtruj za pomocą[p for p in doc if not p.IsConflictPage]przed przetwarzaniem treści. - Użyj
LoadHistory=False(domyślnie) dla szybkości: Historia stron dodaje znaczące zużycie pamięci i narzut parsowania. Ustaw tylkoLoadHistory=Truekiedy wyraźnie potrzebujesz danych o wersji. - Strumień dla dużych plików: Przekaż otwarty obiekt pliku zamiast ciągu ścieżki przy odczytywaniu dużych
.oneplików, aby uniknąć pozostawiania pliku otwartego po zakończeniu parsowania. - Call
DetectLayoutChangesbeforeSave: Podczas tworzenia dokumentu programowo i dołączania węzłów, wywołajDetectLayoutChanges()to ensure layout coordinates are consistent before exporting to PDF. → aby zapewnić spójność współrzędnych układu przed eksportem do PDF.
Typowe problemy
| Issue → Problem | Cause → Przyczyna | Fix → Rozwiązanie |
|---|---|---|
IncorrectPasswordException on load → IncorrectPasswordException przy ładowaniu | File is encrypted; encrypted documents are not supported → Plik jest zaszyfrowany; zaszyfrowane dokumenty nie są obsługiwane | Obtain an unencrypted copy of the file → Uzyskaj niezaszyfrowaną kopię pliku |
FileCorruptedException przy ładowaniu | Plik jest obcięty lub ma nieobsługiwany wewnętrzny format | Sprawdź, czy plik jest prawidłową sekcją .one (nie spisem treści .onetoc2) |
UnsupportedSaveFormatException przy zapisie | Próbowano zapisać w formacie innym niż PDF | Tylko format PDF jest obsługiwany przy eksporcie |
Pusty wynik GetPageHistory | LoadOptions.LoadHistory nie został ustawiony na True przed ładowaniem | Ponownie załaduj dokument przy użyciu opts.LoadHistory = True |
ModuleNotFoundError: reportlab | Próbowano wyeksportować PDF bez dodatku PDF | Zainstaluj dodatek [pdf] |
FAQ
Jakie formaty OneNote może odczytać Aspose.Note?
Wszystkie trzy formaty sekcji OneNote: OneNote2007, OneNote2010 i OneNoteOnline. Użyj doc.FileFormat, aby zidentyfikować, który wariant został załadowany.
Czy mogę zapisać z powrotem do pliku .one po jego odczytaniu?
Aspose.Note dla Python jest biblioteką odczytu i eksportu. Użyj Document.Save, aby zapisać wyjście PDF. Format binarny OneNote jest tylko do odczytu w tej edycji FOSS.
Jak odczytać konkretną stronę po tytule?
Iteruj strony przy użyciu wyrażenia generatora i porównaj właściwość tekstu tytułu z docelowym ciągiem znaków:
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,
)Jak mogę liczyć podstrony osobno od stron najwyższego poziomu?
Użyj page.Level: poziom 1 to najwyższy poziom, poziom 2 to podstrona, i tak dalej.
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)}")Czy Aspose.Note obsługuje pliki spisu treści .onetoc2?
Nie. Obsługiwane są wyłącznie pliki sekcji .one. Notatniki .onetoc2 spowodują FileCorruptedException.
API Reference Podsumowanie
| Klasa / Metoda | Opis |
|---|---|
Document(path_or_stream, options?) | Wczytaj plik .one lub utwórz pusty dokument |
Document.FileFormat | Wykryto wariant formatu (FileFormat enum) |
Document.GetChildNodes(NodeType) | Pobierz wszystkie węzły potomne określonego typu |
Document.GetPageHistory(page) | Pobierz historię wersji dla strony (wymaga LoadHistory=True) |
Document.Save(target, format_or_options) | Eksportuj do PDF za pomocą ścieżki pliku lub strumienia |
Document.DetectLayoutChanges() | Przelicz ponownie metryki układu po programowych edycjach |
Document.Accept(visitor) | Przejdź po DOM przy użyciu podklasy DocumentVisitor |
LoadOptions.LoadHistory | Ustaw na True, aby uwzględnić rewizje strony w DOM |
LoadOptions.DocumentPassword | Zarezerwowane; zaszyfrowane pliki wywołują IncorrectPasswordException |
FileFormat | Wyliczenie: OneNote2010, OneNoteOnline, OneNote2007, Unknown |
SaveFormat.Pdf | Jedyny obsługiwany format eksportu; zgłasza ValueError dla innych formatów |
PageHistory.Count | Liczba dostępnych wersji strony |
Page.Level | Głębokość podstrony (1 = najwyższy poziom) |
Page.IsConflictPage | True dla kopii konfliktów synchronizacji |
Zobacz także
- Ekstrakcja tekstu:wyodrębnianie zwykłego tekstu i sformatowanych fragmentów
- Eksport PDF: opcje eksportu, wybór stron i wyjście strumieniowe
- Obrazy i załączniki: wyodrębnianie osadzonych obrazów i załączonych plików
- Tables: analizowanie struktury tabeli i zawartości komórek
- API Reference: Dokument
- Aspose.Note — Enterprise Documentation