Comment extraire du texte des fichiers OneNote en Python

Comment extraire du texte des fichiers OneNote en Python

Les fichiers Microsoft OneNote .one sont des documents binaires qui ne peuvent pas être lus en texte brut ni analysés avec des outils XML génériques. Aspose.Note FOSS for Python fournit un analyseur pure‑Python qui charge les fichiers .one dans un modèle complet d’objet document (DOM), ce qui facilite l’extraction du texte, des métadonnées de mise en forme et des hyperliens de manière programmatique.

Avantages d’utiliser Aspose.Note FOSS pour Python

  1. Pas besoin de Microsoft Office : lire les fichiers .one sur n’importe quelle plateforme, y compris les serveurs CI/CD Linux
  2. Accès complet au texte et à la mise en forme : texte brut, portions en gras/italique/souligné, propriétés de police et URL des hyperliens
  3. Gratuit et open‑source : licence MIT, aucun frais d’utilisation ni clé API

Guide étape par étape

Étape 1 : Installer Aspose.Note FOSS pour Python

Installez la bibliothèque depuis PyPI. Le package de base n’a aucune dépendance obligatoire :

pip install aspose-note

Vérifiez l’installation :

from aspose.note import Document
print("Installation OK")

Étape 2 : charger le fichier .one

Créez une instance Document en passant le chemin du fichier :

from aspose.note import Document

doc = Document("MyNotes.one")
print(f"Section: {doc.DisplayName}")
print(f"Pages:   {len(list(doc))}")

Pour charger à partir d’un flux binaire (par ex. depuis le stockage cloud ou une réponse HTTP):

from aspose.note import Document

with open("MyNotes.one", "rb") as f:
    doc = Document(f)

Étape 3 : Extraire tout le texte brut

Utilisez GetChildNodes(RichText) pour collecter chaque nœud RichText dans l’arbre du document. Cela effectue une recherche en profondeur récursive sur toutes les pages, les plans et les éléments de plan :

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
texts = [rt.Text for rt in doc.GetChildNodes(RichText) if rt.Text]

for text in texts:
    print(text)

Pour enregistrer tout le texte dans un fichier :

from aspose.note import Document, RichText

doc = Document("MyNotes.one")
texts = [rt.Text for rt in doc.GetChildNodes(RichText) if rt.Text]

with open("extracted_text.txt", "w", encoding="utf-8") as out:
    out.write("\n".join(texts))

print(f"Wrote {len(texts)} text blocks to extracted_text.txt")

Étape 4 : Inspecter les segments formatés

Chaque nœud RichText contient une liste TextRuns de segments TextRun. Chaque exécution possède un TextStyle indépendant avec un formatage caractère par caractère :

from aspose.note import Document, RichText

doc = Document("MyNotes.one")

for rt in doc.GetChildNodes(RichText):
    for run in rt.TextRuns:
        style = run.Style
        attrs = []
        if style.IsBold:        attrs.append("bold")
        if style.IsItalic:      attrs.append("italic")
        if style.IsUnderline:   attrs.append("underline")
        if style.IsStrikethrough: attrs.append("strikethrough")
        if style.FontName:    attrs.append(f"font={style.FontName}")
        if style.FontSize:    attrs.append(f"size={style.FontSize}pt")
        label = ", ".join(attrs) if attrs else "plain"
        print(f"[{label}] {run.Text!r}")

Étape 5 : Extraire les hyperliens

Les hyperliens sont stockés sur des nœuds TextRun individuels. Vérifiez Style.IsHyperlink et lisez Style.HyperlinkAddress :

from aspose.note import Document, RichText

doc = Document("MyNotes.one")

for rt in doc.GetChildNodes(RichText):
    for run in rt.TextRuns:
        if run.Style.IsHyperlink and run.Style.HyperlinkAddress:
            print(f"Link text: {run.Text!r}")
            print(f"URL:       {run.Style.HyperlinkAddress}")

Étape 6 : Extraire le texte par page

Pour extraire le texte organisé par titre de page :

from aspose.note import Document, Page, RichText

doc = Document("MyNotes.one")

for page in doc.GetChildNodes(Page):
    title = (
        page.Title.TitleText.Text
        if page.Title and page.Title.TitleText
        else "(untitled)"
    )
    print(f"\n=== {title} ===")
    for rt in page.GetChildNodes(RichText):
        if rt.Text:
            print(rt.Text)

Problèmes courants et solutions

1. ImportError : Aucun module nommé ‘aspose’

Cause: Le package n’est pas installé dans l’environnement Python actif.

Correction:

pip install aspose-note
##Confirm active environment:
pip show aspose-note

2. FileNotFoundError lors du chargement du fichier .one

Cause: Le chemin du fichier est incorrect ou le fichier n’existe pas.

Correction : Utilisez un chemin absolu ou vérifiez que le fichier existe avant de le charger :

from pathlib import Path
from aspose.note import Document

path = Path("MyNotes.one")
if not path.exists():
    raise FileNotFoundError(f"File not found: {path.resolve()}")
doc = Document(str(path))

3. UnicodeEncodeError sous Windows lors de l’impression

Cause : Les terminaux Windows peuvent utiliser un encodage hérité qui ne peut pas rendre les caractères Unicode.

Correction: Reconfigurez stdout au début de votre script :

import sys
if hasattr(sys.stdout, "reconfigure"):
    sys.stdout.reconfigure(encoding="utf-8", errors="replace")

4. Résultats de texte vide

Cause: Le fichier .one peut être vide, ne contenir que des images ou des tableaux (pas de nœuds RichText), ou être un fichier de cahier (.onetoc2) plutôt qu’un fichier de section (.one).

Correction : Vérifiez le nombre de pages et inspectez les types de nœuds :

from aspose.note import Document

doc = Document("MyNotes.one")
print(f"Pages: {len(list(doc))}")
for page in doc:
    print(f"  Children: {sum(1 for _ in page)}")

5. IncorrectPasswordException

Cause : Le fichier .one est crypté. Les documents cryptés ne sont pas pris en charge.

Fix: Aspose.Note FOSS pour Python ne prend pas en charge les fichiers chiffrés .one. Le produit commercial complet Aspose.Note prend en charge le déchiffrement.


Foire aux questions

Puis-je extraire le texte de toutes les pages en une fois ?

Oui. doc.GetChildNodes(RichText) recherche l’arborescence complète du document de manière récursive, y compris toutes les pages, les outlines et les éléments d’outline.

La bibliothèque prend‑elle en charge les fichiers de bloc‑notes .onetoc2 ?

Non. La bibliothèque ne gère que les fichiers de section .one. Les fichiers de table des matières du cahier (.onetoc2) sont d’un format différent et ne sont pas pris en charge.

Puis‑je extraire du texte des tableaux ?

Oui. TableCell nœuds contiennent RichText enfants qui peuvent être lus de la même façon :

from aspose.note import Document, Table, TableRow, TableCell, RichText

doc = Document("MyNotes.one")
for table in doc.GetChildNodes(Table):
    for row in table.GetChildNodes(TableRow):
        for cell in row.GetChildNodes(TableCell):
            cell_text = " ".join(rt.Text for rt in cell.GetChildNodes(RichText)).strip()
            print(cell_text, end="\t")
        print()

Quelles versions de Python sont prises en charge ?

Python 3.10, 3.11 et 3.12.

La bibliothèque est‑elle thread‑safe ?

Chaque instance Document doit être utilisée à partir d’un seul thread. Pour une extraction parallèle, créez un Document distinct par thread.


Ressources associées :

 Français