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() y TextOptions.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 PreviewOptions como 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 GroupDocsParserException y sus subclases en lugar de RuntimeError (PARSERPYTHONNET-34)
  • [Mejora] Actualizar System.Security.Cryptography.Pkcs a 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 corrupted o falta el ensamblado SkiaSharp 3.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, CorruptedDocumentException o UnsupportedDocumentFormatException desde groupdocs.parser.exceptions, donde la versión 25.12 lanzaba RuntimeError para todos ellos. Las clases existían en 25.12, pero no derivaban de Exception y nunca se lanzaban. except Exception captura 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.ICreatePageStream
  • groupdocs.parser.options.IReleasePageStream
  • groupdocs.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() y table[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:

Recursos