Resumen de características — Aspose.Note FOSS para Python

Aspose.Note FOSS for Python (package aspose-note, versión 26.3.1) proporciona una API Python para leer Microsoft OneNote .one archivos de sección y exportarlos a PDF. Todas las características enumeradas a continuación se verifican contra el código fuente del repositorio, el README y los scripts de ejemplo.

Instalación y Configuración

Instale desde PyPI:

pip install aspose-note

Para soporte de exportación a PDF (requiere ReportLab):

pip install "aspose-note[pdf]"

Requisitos: Python 3.10 o posterior. No se requiere instalación de Microsoft Office.


Características y Capacidades

.Carga de archivos .one

Cargue archivos de sección de Microsoft OneNote desde una ruta de archivo o cualquier flujo binario (manejador de archivo, io.BytesIO, cuerpo de respuesta HTTP, flujo de almacenamiento en la nube).

  • Document.FileFormat proporciona una indicación de mejor esfuerzo de la versión del formato de archivo OneNote (OneNote2010, OneNoteOnline o OneNote2007)
  • La carga basada en flujos elimina la E/S de disco para flujos de trabajo en memoria o de red
  • LoadOptions.LoadHistory la bandera controla si el historial de páginas se incluye en el 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)

Recorrido del DOM del Documento

El documento completo de OneNote se expone como un árbol de objetos Python tipados. Cada nodo hereda de Node o CompositeNode:

  • Document: raíz; expone DisplayName, CreationTime, FileFormat
  • Page: hijo directo de Document; expone Title, Author, CreationTime, LastModifiedTime, Level
  • Title: expone TitleText, TitleDate, TitleTime (todos RichText nodos)
  • Outline: contenedor posicional con HorizontalOffset, VerticalOffset, MaxWidth, MaxHeight, MinWidth, ReservedWidth, IndentPosition
  • OutlineElement: contenedor hoja; expone NumberList

Métodos de navegación en CompositeNode:

Método / PropiedadDescripción
FirstChild, LastChildAcceso directo al hijo
GetChildNodes(Type)Búsqueda recursiva, filtrada por tipo
AppendChildLast(node)Agregar hijo al final
AppendChildFirst(node)Agregar hijo al inicio
InsertChild(index, node)Insertar en posición
RemoveChild(node)Eliminar un hijo
for child in nodeIterar hijos directos
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}")

Extracción de contenido de texto enriquecido

RichText nodos exponen:

  • Text: str: cadena de texto plano completa
  • TextRuns: list[TextRun]: lista de segmentos formateados
  • Tags: list[NoteTag]: etiquetas de OneNote adjuntas a este bloque
  • Append(text, style=None): agregar un segmento de texto en memoria
  • Replace(old_value, new_value): sustitución de cadena en memoria

Cada TextRun contiene:

PropiedadTipoDescripción
TextstrTexto del segmento
StyleTextStyleMetadatos de formato

TextStyle propiedades:

PropiedadTipo
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}")

Extracción de imágenes

Image los nodos exponen bytes sin procesar y metadatos para cada imagen incrustada:

PropiedadTipoDescripción
FileName`strNone`
BytesbytesDatos de imagen sin procesar
Width, Height`floatNone`
AlternativeTextTitle`strNone`
AlternativeTextDescription`strNone`
HyperlinkUrl`strNone`
Tagslist[NoteTag]Etiquetas de OneNote adjuntas
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)")

Extracción de archivos adjuntos

AttachedFile nodos exponen archivos adjuntos incrustados:

PropiedadTipoDescripción
FileName`strNone`
BytesbytesDatos brutos del archivo
Tagslist[NoteTag]Etiquetas de OneNote adjuntas
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)

Análisis de tablas

Table, TableRow, y TableCell exponer la estructura completa de la tabla:

ClasePropiedades clave
TableColumns: list[TableColumn] (cada TableColumn tiene .Width y .LockedWidth), IsBordersVisible: bool, Tags: list[NoteTag]
TableRowIterar celdas mediante GetChildNodes(TableCell)
TableCellContiene RichText, Image, y otros nodos de contenido
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)

Inspección de etiquetas de OneNote

NoteTag aparece en RichText, Image, AttachedFile, y Table nodos mediante su .Tags propiedad. OutlineElement no tiene un .Tags propiedad. NoteTag propiedades:

PropiedadTipoDescripción
Icon`intNone`
Label`strNone`
FontColor`intNone`
Highlight`intNone`
CreationTime`datetimeNone`
CompletedTime`datetimeNone`

Método de fábrica: NoteTag.CreateYellowStar() crea un nodo de etiqueta de estrella amarilla estándar.

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})")

Soporte de listas numeradas

OutlineElement.NumberList expone:

PropiedadTipoDescripción
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}")

Recorrido con DocumentVisitor

DocumentVisitor proporciona un patrón de visitante para la traversa estructurada de todo el documento. Sobrescribe cualquier VisitXxxStart / VisitXxxEnd método para interceptar tipos de nodo específicos:

  • 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}")

Exportación a PDF

Guarda un documento cargado en PDF usando Document.Save(). Compatible mediante el backend opcional ReportLab.

from aspose.note import Document, SaveFormat

doc = Document("notebook.one")
doc.Save("output.pdf", SaveFormat.Pdf)

PdfSaveOptions

OpciónTipoDescripción
PageIndexintEl campo existe; no se envía al exportador PDF en v26.3.1 (no tiene efecto)
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()

Referencia de formatos y enumeraciones

SaveFormat

ValorEstado
SaveFormat.PdfImplementado (requiere ReportLab)

FileFormat

Document.FileFormat proporciona una indicación de mejor esfuerzo de la versión del formato de archivo OneNote. El enum declara tres valores:

ValorDescripción
FileFormat.OneNote2010Formato OneNote 2010
FileFormat.OneNoteOnlineFormato OneNote Online
FileFormat.OneNote2007Formato 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


Limitaciones actuales

LimitaciónDetalle
Solo lecturaEscribiendo de nuevo a .one el formato no está implementado
Sin cifradoLos documentos cifrados generan IncorrectPasswordException
PDF solo para exportaciónOtro SaveFormat Los valores generan UnsupportedSaveFormatException
Se requiere ReportLab para PDFInstalar pip install "aspose-note[pdf]" por separado
GetPageHistory devuelve una lista de un solo elementoEl recorrido completo del historial de la página es un stub; devuelve [page]
DetectLayoutChanges()Stub de compatibilidad; sin operación

Consejos y mejores prácticas

  • Comprobar si es None: Page.Title, Title.TitleText, OutlineElement.NumberList, y la mayoría de los campos de metadatos pueden ser None. Siempre protege con if x is not None o if x antes de acceder a las propiedades.
  • Usa GetChildNodes(Type) para búsqueda recursiva en lugar de iterar manualmente el árbol. Busca todo el subárbol.
  • Iterar hijos directos con for child in node cuando solo necesitas hijos inmediatos.
  • Manejar la codificación en Windows: En Windows, sys.stdout puede usar una página de códigos heredada. Añade sys.stdout.reconfigure(encoding="utf-8", errors="replace") al iniciar cuando se imprime texto Unicode.
  • Instalar [pdf] extra: No importes SaveFormat.Pdf funcionalidad sin instalar primero pip install "aspose-note[pdf]". Sin ReportLab, guardar en PDF generará un error de importación en tiempo de ejecución.
 Español