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śćTypDefaultOpis
LoadHistoryboolFalseGdy True, rewizje historii strony są zawarte w DOM i dostępne poprzez Document.GetPageHistory
DocumentPassword`strNone`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
OneNote2010Standardowy plik .one utworzony przez OneNote od 2010 roku
OneNoteOnlinePlik .one utworzony przez OneNote Online / Microsoft 365
OneNote2007Starszy format .one z OneNote 2007
UnknownNie 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
                    └── AttachedFile

Kluczowe metody przeglądania dziedziczone po CompositeNode:

MetodaOpis
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: GetPageHistory zwraca pusty PageHistory obiekt, gdy LoadHistory is False (domyślne). Zawsze ustaw opts.LoadHistory = True przed ł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: Document wczytuje cały .one plik do pamięci podczas konstrukcji. Przechowuj jeden Document instancję i wywołaj GetChildNodes wielokrotnie, 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 tylko LoadHistory=True kiedy 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 .one plików, aby uniknąć pozostawiania pliku otwartego po zakończeniu parsowania.
  • Call DetectLayoutChanges before Save: Podczas tworzenia dokumentu programowo i dołączania węzłów, wywołaj DetectLayoutChanges() 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 → ProblemCause → PrzyczynaFix → Rozwiązanie
IncorrectPasswordException on load → IncorrectPasswordException przy ładowaniuFile is encrypted; encrypted documents are not supported → Plik jest zaszyfrowany; zaszyfrowane dokumenty nie są obsługiwaneObtain an unencrypted copy of the file → Uzyskaj niezaszyfrowaną kopię pliku
FileCorruptedException przy ładowaniuPlik jest obcięty lub ma nieobsługiwany wewnętrzny formatSprawdź, czy plik jest prawidłową sekcją .one (nie spisem treści .onetoc2)
UnsupportedSaveFormatException przy zapisiePróbowano zapisać w formacie innym niż PDFTylko format PDF jest obsługiwany przy eksporcie
Pusty wynik GetPageHistoryLoadOptions.LoadHistory nie został ustawiony na True przed ładowaniemPonownie załaduj dokument przy użyciu opts.LoadHistory = True
ModuleNotFoundError: reportlabPróbowano wyeksportować PDF bez dodatku PDFZainstaluj 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 / MetodaOpis
Document(path_or_stream, options?)Wczytaj plik .one lub utwórz pusty dokument
Document.FileFormatWykryto 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.LoadHistoryUstaw na True, aby uwzględnić rewizje strony w DOM
LoadOptions.DocumentPasswordZarezerwowane; zaszyfrowane pliki wywołują IncorrectPasswordException
FileFormatWyliczenie: OneNote2010, OneNoteOnline, OneNote2007, Unknown
SaveFormat.PdfJedyny obsługiwany format eksportu; zgłasza ValueError dla innych formatów
PageHistory.CountLiczba dostępnych wersji strony
Page.LevelGłębokość podstrony (1 = najwyższy poziom)
Page.IsConflictPageTrue dla kopii konfliktów synchronizacji

Zobacz także

 Polski