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-notePara 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.FileFormatproporciona 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.LoadHistoryla 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; exponeDisplayName,CreationTime,FileFormatPage: hijo directo deDocument; exponeTitle,Author,CreationTime,LastModifiedTime,LevelTitle: exponeTitleText,TitleDate,TitleTime(todosRichTextnodos)Outline: contenedor posicional conHorizontalOffset,VerticalOffset,MaxWidth,MaxHeight,MinWidth,ReservedWidth,IndentPositionOutlineElement: contenedor hoja; exponeNumberList
Métodos de navegación en CompositeNode:
| Método / Propiedad | Descripción |
|---|---|
FirstChild, LastChild | Acceso 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 node | Iterar 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 completaTextRuns: list[TextRun]: lista de segmentos formateadosTags: list[NoteTag]: etiquetas de OneNote adjuntas a este bloqueAppend(text, style=None): agregar un segmento de texto en memoriaReplace(old_value, new_value): sustitución de cadena en memoria
Cada TextRun contiene:
| Propiedad | Tipo | Descripción |
|---|---|---|
Text | str | Texto del segmento |
Style | TextStyle | Metadatos de formato |
TextStyle propiedades:
| Propiedad | Tipo |
|---|---|
IsBold, IsItalic, IsUnderline, IsStrikethrough | bool |
IsSuperscript, IsSubscript | bool |
FontName | `str |
FontSize | `float |
FontColor, Highlight | `int |
Language | `int |
IsHyperlink | bool |
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:
| Propiedad | Tipo | Descripción |
|---|---|---|
FileName | `str | None` |
Bytes | bytes | Datos de imagen sin procesar |
Width, Height | `float | None` |
AlternativeTextTitle | `str | None` |
AlternativeTextDescription | `str | None` |
HyperlinkUrl | `str | None` |
Tags | list[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:
| Propiedad | Tipo | Descripción |
|---|---|---|
FileName | `str | None` |
Bytes | bytes | Datos brutos del archivo |
Tags | list[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:
| Clase | Propiedades clave |
|---|---|
Table | Columns: list[TableColumn] (cada TableColumn tiene .Width y .LockedWidth), IsBordersVisible: bool, Tags: list[NoteTag] |
TableRow | Iterar celdas mediante GetChildNodes(TableCell) |
TableCell | Contiene 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:
| Propiedad | Tipo | Descripción |
|---|---|---|
Icon | `int | None` |
Label | `str | None` |
FontColor | `int | None` |
Highlight | `int | None` |
CreationTime | `datetime | None` |
CompletedTime | `datetime | None` |
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:
| Propiedad | Tipo | Descripción |
|---|---|---|
Format | `str | None` |
Restart | `int | None` |
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ón | Tipo | Descripción |
|---|---|---|
PageIndex | int | El campo existe; no se envía al exportador PDF en v26.3.1 (no tiene efecto) |
PageCount | `int | None` |
ImageCompression | `Any | None` |
JpegQuality | `int | None` |
PageSettings | `Any | None` |
PageSplittingAlgorithm | `Any | None` |
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
| Valor | Estado |
|---|---|
SaveFormat.Pdf | Implementado (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:
| Valor | Descripción |
|---|---|
FileFormat.OneNote2010 | Formato OneNote 2010 |
FileFormat.OneNoteOnline | Formato OneNote Online |
FileFormat.OneNote2007 | Formato 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ón | Detalle |
|---|---|
| Solo lectura | Escribiendo de nuevo a .one el formato no está implementado |
| Sin cifrado | Los documentos cifrados generan IncorrectPasswordException |
| PDF solo para exportación | Otro SaveFormat Los valores generan UnsupportedSaveFormatException |
| Se requiere ReportLab para PDF | Instalar pip install "aspose-note[pdf]" por separado |
GetPageHistory devuelve una lista de un solo elemento | El 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 serNone. Siempre protege conif x is not Noneoif xantes 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 nodecuando solo necesitas hijos inmediatos. - Manejar la codificación en Windows: En Windows,
sys.stdoutpuede usar una página de códigos heredada. Añadesys.stdout.reconfigure(encoding="utf-8", errors="replace")al iniciar cuando se imprime texto Unicode. - Instalar
[pdf]extra: No importesSaveFormat.Pdffuncionalidad sin instalar primeropip install "aspose-note[pdf]". Sin ReportLab, guardar en PDF generará un error de importación en tiempo de ejecución.