Estamos contentos de anunciar el lanzamiento de GroupDocs.Parser for Python v26.10, disponible a partir de noviembre de 2026. Esta versión actualiza el motor subyacente a la versión 26.8 y pasa de .NET Core 3.1 a .NET 10.0.14, corrigiendo dos vulnerabilidades de denegación de servicio en System.Security.Cryptography.Pkcs. Introduce nuevas funcionalidades importantes, como la extracción de anotaciones, el análisis de tablas HTML, OCR para árabe y coreano, un registrador Python, manejo de recursos externos, callbacks de vista previa como funciones simples y una herramienta de línea de comandos groupdocs-parser. El wheel ahora es un paquete puro de Python que apunta a Python 3.5 – 3.14, con etiquetas de plataforma actualizadas (manylinux_2_27_x86_64, macosx_13_0_*) y la eliminación del wheel de Windows de 32 bits.
Novedades en esta versión
- [Funcionalidad] Añadir soporte para extraer anotaciones con
get_annotations()yTextOptions.include_annotations(PARSERPYTHONNET-23) - [Funcionalidad] Añadir la herramienta de línea de comandos
groupdocs-parser(PARSERPYTHONNET-24) - [Funcionalidad] Añadir soporte para un objeto registrador Python que implemente
ILogger(PARSERPYTHONNET-25) - [Funcionalidad] Añadir soporte para manejar la carga de recursos externos desde Python (PARSERPYTHONNET-26)
- [Funcionalidad] Añadir OCR para texto árabe y coreano (PARSERPYTHONNET-27)
- [Funcionalidad] Añadir soporte para extraer tablas de documentos HTML (PARSERPYTHONNET-28)
- [Funcionalidad] Añadir soporte para aplicar la licencia desde la variable de entorno
GROUPDOCS_LIC_PATH(PARSERPYTHONNET-36) - [Mejora] Actualizar GroupDocs.Parser a 26.8 y el runtime incrustado a .NET 10.0.14 (PARSERPYTHONNET-29)
- [Mejora] Distribuir un paquete puro de Python para Python 3.5 – 3.14 en lugar de la extensión compilada (PARSERPYTHONNET-30)
- [Mejora] Pasar callbacks de vista previa a
PreviewOptionscomo funciones Python simples (PARSERPYTHONNET-31) - [Mejora] Rechazar asignaciones a atributos desconocidos de objetos API (PARSERPYTHONNET-32)
- [Mejora] Actualizar las etiquetas de plataforma a glibc 2.27 y macOS 13, y eliminar el wheel de Windows de 32 bits (PARSERPYTHONNET-33)
- [Mejora] Lanzar
GroupDocsParserExceptiony sus subclases en lugar deRuntimeError(PARSERPYTHONNET-34) - [Mejora] Actualizar
System.Security.Cryptography.Pkcsa 10.0.14, lo que corrige dos vulnerabilidades de denegación de servicio (PARSERPYTHONNET-37) - [Corrección] Algunos documentos Word y RTF fallan con
The document appears to be corruptedo falta el ensambladoSkiaSharp3.119 (PARSERPYTHONNET-35) - [Corrección] La memoria crece con cada documento abierto desde un
BytesIO(PARSERPYTHONNET-38)
Cambios en la API pública
- Los errores del motor lanzan
GroupDocsParserException,InvalidPasswordException,CorruptedDocumentExceptionoUnsupportedDocumentFormatExceptiondesdegroupdocs.parser.exceptions, donde la versión 25.12 lanzabaRuntimeErrorpara todos ellos. Las clases existían en 25.12, pero no derivaban deExceptiony nunca se lanzaban.except Exceptioncaptura los errores de ambas versiones. - Asignar un atributo desconocido lanza
AttributeError. - Las listas que devuelve el motor admiten
len()e indexación, y una lista vacía se evalúa como falsa.
Eliminado
groupdocs.parser.options.ICreatePageStreamgroupdocs.parser.options.IReleasePageStreamgroupdocs.parser.options.IPreviewPageRender
Pase funciones a PreviewOptions y a PreviewOptions.preview_page_render en su lugar.
Nuevas clases y miembros
groupdocs.parser:Resources.groupdocs.parser.data:AnnotationItem.groupdocs.parser.options:CreatePageStream,ReleasePageStream,PreviewPageRender,Language,PreviewFormats.Parser:get_annotations(),get_structure(),dispose().Features:annotations.TextOptions:include_annotations.OcrOptions:language.ILogger:error().TocItem:extract_text().PageTableArea:get()ytable[row, column].DocumentData,Template:get().TemplateCollection:append().Resources:storage_path, writable.
Nuevas funcionalidades
Extraer anotaciones
Parser.get_annotations() devuelve los comentarios y notas de un documento PDF, Word o PowerPoint como objetos AnnotationItem con el valor, tipo, índice de página, marca de tiempo, nombre del autor e iniciales; get_annotations(page_index) lee una sola página. TextOptions.include_annotations añade el texto de la anotación al texto extraído, y parser.features.annotations indica si un formato soporta anotaciones.
from groupdocs.parser import Parser
from groupdocs.parser.options import TextOptions
with Parser("reviewed.docx") as parser:
for note in parser.get_annotations() or []:
print(note.page_index + 1, note.annotation_type, note.author_name, note.value.strip())
options = TextOptions()
options.include_annotations = True
print(parser.get_text(options))
Línea de comandos
El wheel instala el script de consola groupdocs-parser (también python -m groupdocs.parser) con los comandos text, info, metadata, images, annotations y list-formats. text acepta --page N (contado desde 1), --format plain|markdown|html, --ocr, --include-annotations y -o FILE; info, metadata y annotations aceptan --json; images acepta --out DIR; cada comando acepta --password. --license y --version van antes del comando. El código de salida es 0 en caso de éxito, 2 para un error de usuario como archivo faltante, y 1 para un error del motor o un formato que no soporta la operación.
groupdocs-parser text report.pdf --page 2 -o page2.txt
groupdocs-parser text report.docx --format markdown
groupdocs-parser info report.pdf --json
groupdocs-parser annotations reviewed.docx --json
groupdocs-parser --license license.lic text protected.pdf --password secret
Registrador Python
Un objeto Python simple con los métodos trace(message), warning(message) y error(message, exception) puede pasarse a ParserSettings como registrador, y el motor lo invoca con lo que encuentre durante la extracción, como un archivo dañado. También funciona una función log(level, message, exception).
from groupdocs.parser import Parser
from groupdocs.parser.options import ParserSettings
class PrintLogger:
def trace(self, message):
print("TRACE:", message)
def warning(self, message):
print("WARNING:", message)
def error(self, message, exception):
print("ERROR:", message, exception)
with Parser("document.pdf", ParserSettings(PrintLogger())) as parser:
print(parser.get_document_info().page_count)
Controlar la carga de recursos externos
El motor solicita a un manejador de recursos externos antes de cargar cada imagen que referencia un documento HTML o MHTML. El manejador puede ser una función, un objeto con un método on_loading(args), o una subclase de ExternalResourceHandler; establecer args.skipped = True omite el recurso. ParserSettings lo recibe como external_resource_handler.
from groupdocs.parser import Parser
from groupdocs.parser.options import ParserSettings
def skip_remote(args):
args.skipped = args.uri.startswith("http")
with Parser("page.html", ParserSettings(external_resource_handler=skip_remote)) as parser:
print(len(parser.get_images() or []))
OCR para árabe y coreano
OcrOptions.language selecciona el alfabeto que reconoce el OCR, inglés por defecto. Language.ARA y Language.KOR son nuevos en este motor. Los modelos de reconocimiento forman parte del motor: la primera llamada a OCR los descomprime, unos 80 MB, en una carpeta aspose_data en el directorio de trabajo, sin descarga. Para elegir la carpeta, establezca Resources.storage_path (from groupdocs.parser import Resources) antes de la primera llamada a OCR.
from groupdocs.parser import Parser
from groupdocs.parser.options import Language, OcrOptions, TextOptions
ocr_options = OcrOptions()
ocr_options.language = Language.KOR
with Parser("scan.jpg") as parser:
print(parser.get_text(TextOptions(False, True, ocr_options)))
Tablas de documentos HTML
get_tables() ahora encuentra las tablas de documentos HTML, como lo hace con PDF, Word y hojas de cálculo; la versión 25.12 no encontraba ninguna. Una celda se accede como table[row, column], o table.get(row, column).
from groupdocs.parser import Parser
with Parser("report.html") as parser:
for table in parser.get_tables() or []:
for row in range(table.row_count):
print([table[row, column].text.rstrip("\x07") for column in range(table.column_count)])
Licencia desde el entorno
Establezca GROUPDOCS_LIC_PATH con la ruta a un archivo de licencia, o con una URL que sirva una, y la licencia se aplicará en la primera llamada a Parser, sin código de licencia; la versión 25.12 no leía la variable. Si esa licencia no puede aplicarse (archivo faltante, suscripción expirada, licencia para otro producto), cada llamada a Parser lanza LicenseError, indicando la variable y la razón del motor, hasta que License().set_license() aplique una licencia. Establezca GROUPDOCS_LIC_STRICT=0 para obtener un solo LicenseWarning y modo de evaluación en su lugar.
from groupdocs.parser import LicenseError, Parser
try:
with Parser("report.pdf") as parser:
print(parser.get_text())
except LicenseError as e:
print(e) # GROUPDOCS_LIC_PATH=... could not be applied: <reason>
Callbacks de vista previa como funciones simples
PreviewOptions(create_page_stream, release_page_stream) acepta funciones ordinarias, al igual que PreviewOptions.preview_page_render. create_page_stream(page_number) devuelve un flujo escribible, como un archivo abierto con "wb" o un io.BytesIO; las páginas se numeran a partir de 1. El motor cierra el archivo que se le dio y llama a release_page_stream(page_number) una vez escrita la página. En la versión 25.12 estos eran las clases ICreatePageStream, IReleasePageStream y IPreviewPageRender.
from groupdocs.parser import Parser
from groupdocs.parser.options import PreviewOptions
def create_page_stream(page_number):
return open("page-%d.png" % page_number, "wb")
def release_page_stream(page_number):
print("page", page_number, "written")
options = PreviewOptions(create_page_stream, release_page_stream)
options.preview_page_render = lambda info: print("rendering page", info.page_number)
with Parser("document.pdf") as parser:
parser.generate_preview(options)
Los atributos mal escritos generan AttributeError
Asignar una propiedad que un objeto API no posee genera AttributeError con una pista del tipo “Did you mean”. La versión 25.12 aceptaba la asignación, almacenaba un atributo solo de Python y dejaba sin cambios la configuración del motor.
from groupdocs.parser.options import TextOptions
options = TextOptions()
try:
options.include_annotation = True
except AttributeError as error:
print(error)
Un solo wheel para Python 3.5 – 3.14
La versión 25.12 era una extensión compilada, con un módulo binario por versión de Python y un runtime .NET Core 3.1. La 26.10 es un wheel py3-none-<platform> por plataforma, Python puro sobre un runtime .NET 10 incrustado, y declara python_requires=">=3.5,<3.15". Python 3.14 es nuevo: la 25.12 declaraba <3.14. La mayor parte del código de 25.12 funciona sin cambios, y los 129 ejemplos de Docs que se ejecutaban en 25.12 funcionan en 26.10. get_text() y get_formatted_text() siguen devolviendo un str, que ahora también responde a read_to_end().
Etiquetas de plataforma actualizadas y wheel de Windows de 64 bits
El wheel de Linux lleva la etiqueta manylinux_2_27_x86_64, la glibc más antigua que soporta el runtime .NET 10 incrustado, y los wheels de macOS macosx_13_0_x86_64 y macosx_13_0_arm64. Ya no existe un wheel de Windows de 32 bits. La instalación requiere pip 20.3 o superior.
Ejemplo de código
Extraer anotaciones de un documento Word e incluirlas en el texto extraído:
from groupdocs.parser import Parser
from groupdocs.parser.options import TextOptions
with Parser("reviewed.docx") as parser:
for note in parser.get_annotations() or []:
print(note.page_index + 1, note.annotation_type, note.author_name, note.value.strip())
options = TextOptions()
options.include_annotations = True
print(parser.get_text(options))
Cómo obtener la actualización
PyPI
Instale o actualice usando PyPI:
groupdocs-parser-net 26.10.0 on PyPI
pip install groupdocs-parser-net==26.10.0
Descarga directa
Descargue los wheels específicos por plataforma desde la página de lanzamiento de GroupDocs.Parser for Python via .NET 26.10: