Estamos felizes em anunciar o lançamento do GroupDocs.Parser for Python v26.10, disponível a partir de novembro de 2026. Esta versão atualiza o mecanismo subjacente para a versão 26.8 e migra do .NET Core 3.1 para o .NET 10.0.14, corrigindo duas vulnerabilidades de negação de serviço em System.Security.Cryptography.Pkcs. Ela introduz recursos novos importantes, incluindo extração de anotações, análise de tabelas HTML, OCR para árabe e coreano, um logger Python, manipulação de recursos externos, callbacks de visualização como funções simples e uma ferramenta de linha de comando groupdocs-parser. O wheel agora é um pacote puro em Python direcionado ao Python 3.5 – 3.14, com tags de plataforma atualizadas (manylinux_2_27_x86_64, macosx_13_0_*) e remoção do wheel Windows de 32 bits.

Novidades nesta versão

  • [Recurso] Adicionar suporte à extração de anotações com get_annotations() e TextOptions.include_annotations (PARSERPYTHONNET-23)
  • [Recurso] Adicionar a ferramenta de linha de comando groupdocs-parser (PARSERPYTHONNET-24)
  • [Recurso] Adicionar suporte a um objeto logger Python que implementa ILogger (PARSERPYTHONNET-25)
  • [Recurso] Adicionar suporte ao carregamento de recursos externos a partir do Python (PARSERPYTHONNET-26)
  • [Recurso] Adicionar OCR para texto em árabe e coreano (PARSERPYTHONNET-27)
  • [Recurso] Adicionar suporte à extração de tabelas de documentos HTML (PARSERPYTHONNET-28)
  • [Recurso] Adicionar suporte à aplicação da licença a partir da variável de ambiente GROUPDOCS_LIC_PATH (PARSERPYTHONNET-36)
  • [Melhoria] Atualizar GroupDocs.Parser para 26.8 e o runtime incorporado para .NET 10.0.14 (PARSERPYTHONNET-29)
  • [Melhoria] Distribuir um pacote puro em Python para Python 3.5 – 3.14 em vez da extensão compilada (PARSERPYTHONNET-30)
  • [Melhoria] Passar callbacks de visualização para PreviewOptions como funções Python simples (PARSERPYTHONNET-31)
  • [Melhoria] Rejeitar atribuições a atributos desconhecidos de objetos da API (PARSERPYTHONNET-32)
  • [Melhoria] Atualizar as tags de plataforma para glibc 2.27 e macOS 13, e remover o wheel Windows de 32 bits (PARSERPYTHONNET-33)
  • [Melhoria] Levantar GroupDocsParserException e suas subclasses em vez de RuntimeError (PARSERPYTHONNET-34)
  • [Melhoria] Atualizar System.Security.Cryptography.Pkcs para 10.0.14, que corrige duas vulnerabilidades de negação de serviço (PARSERPYTHONNET-37)
  • [Correção] Alguns documentos Word e RTF falham com The document appears to be corrupted ou um assembly SkiaSharp 3.119 ausente (PARSERPYTHONNET-35)
  • [Correção] A memória cresce a cada documento aberto a partir de um BytesIO (PARSERPYTHONNET-38)

Alterações na API pública

  • Erros do mecanismo levantam GroupDocsParserException, InvalidPasswordException, CorruptedDocumentException ou UnsupportedDocumentFormatException de groupdocs.parser.exceptions, onde a 25.12 levantava RuntimeError para todos eles. As classes existiam na 25.12, mas não derivavam de Exception e nunca eram levantadas. except Exception captura os erros de ambas as versões.
  • Atribuir um atributo desconhecido levanta AttributeError.
  • As listas que o mecanismo devolve suportam len() e indexação, e uma lista vazia é avaliada como falsa.

Removido

  • groupdocs.parser.options.ICreatePageStream
  • groupdocs.parser.options.IReleasePageStream
  • groupdocs.parser.options.IPreviewPageRender

Passe funções para PreviewOptions e PreviewOptions.preview_page_render em vez disso.

Novas classes e membros

  • 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() and table[row, column].
  • DocumentData, Template: get().
  • TemplateCollection: append().
  • Resources: storage_path, writable.

Novos recursos

Extrair anotações

Parser.get_annotations() retorna os comentários e notas de um documento PDF, Word ou PowerPoint como objetos AnnotationItem contendo o valor, tipo, índice da página, timestamp, nome do autor e iniciais; get_annotations(page_index) lê uma página. TextOptions.include_annotations adiciona o texto da anotação ao texto extraído, e parser.features.annotations indica se um formato suporta anotações.

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

Linha de comando

O wheel instala o script de console groupdocs-parser (também python -m groupdocs.parser) com os comandos text, info, metadata, images, annotations e list-formats. text aceita --page N (contado a partir de 1), --format plain|markdown|html, --ocr, --include-annotations e -o FILE; info, metadata e annotations aceitam --json; images aceita --out DIR; todos os comandos aceitam --password. --license e --version vêm antes do comando. O código de saída é 0 em caso de sucesso, 2 para um erro de usuário, como arquivo ausente, e 1 para um erro do mecanismo ou um formato que não suporta a operação.

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

Logger Python

Um objeto Python simples com os métodos trace(message), warning(message) e error(message, exception) pode ser passado para ParserSettings como logger, e o mecanismo o chama com o que encontrar durante a extração, como um arquivo danificado. Uma função log(level, message, exception) também funciona.

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)

Controle do carregamento de recursos externos

O mecanismo solicita a um manipulador de recursos externos antes de carregar cada imagem referenciada por um documento HTML ou MHTML. O manipulador pode ser uma função, um objeto com o método on_loading(args), ou uma subclasse de ExternalResourceHandler; definir args.skipped = True ignora o recurso. ParserSettings aceita isso 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 e Coreano

OcrOptions.language seleciona o alfabeto que o OCR reconhece, inglês por padrão. Language.ARA e Language.KOR são novos neste mecanismo. Os modelos de reconhecimento fazem parte do mecanismo: a primeira chamada ao OCR os descompacta, cerca de 80 MB, em uma pasta aspose_data no diretório de trabalho, sem download. Para escolher a pasta, defina Resources.storage_path (from groupdocs.parser import Resources) antes da primeira chamada ao 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)))

Tabelas de documentos HTML

get_tables() agora encontra as tabelas de documentos HTML, como faz para documentos PDF, Word e planilhas; a 25.12 não encontrava nenhuma. Uma célula é table[row, column], ou 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)])

Licença a partir do ambiente

Defina GROUPDOCS_LIC_PATH para o caminho de um arquivo de licença, ou para uma URL que forneça uma, e a licença será aplicada na primeira chamada ao Parser, sem código de licença; a 25.12 não lia a variável. Se essa licença não puder ser aplicada (arquivo ausente, assinatura expirada, licença para outro produto), toda chamada ao Parser levanta LicenseError, indicando a variável e o motivo do mecanismo, até que License().set_license() aplique uma licença. Defina GROUPDOCS_LIC_STRICT=0 para obter um LicenseWarning e modo de avaliação em vez disso.

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 visualização como funções simples

PreviewOptions(create_page_stream, release_page_stream) aceita funções comuns, assim como PreviewOptions.preview_page_render. create_page_stream(page_number) devolve um stream gravável, como um arquivo aberto com "wb" ou um io.BytesIO; as páginas são numeradas a partir de 1. O mecanismo fecha o arquivo que recebeu e chama release_page_stream(page_number) assim que a página é gravada. Na 25.12 esses eram as classes ICreatePageStream, IReleasePageStream e 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)

Atributos digitados incorretamente levantam AttributeError

Atribuir uma propriedade que um objeto da API não possui levanta AttributeError com uma sugestão “Você quis dizer”. A 25.12 aceitava a atribuição, armazenava um atributo apenas em Python e deixava a configuração do mecanismo inalterada.

from groupdocs.parser.options import TextOptions

options = TextOptions()
try:
    options.include_annotation = True
except AttributeError as error:
    print(error)

Um único wheel para Python 3.5 – 3.14

A 25.12 era uma extensão compilada, com um módulo binário por versão do Python e um runtime .NET Core 3.1. A 26.10 é um wheel py3-none-<platform> por plataforma, Python puro sobre um runtime .NET 10 incorporado, e declara python_requires=">=3.5,<3.15". O Python 3.14 é novo: a 25.12 declarava <3.14. A maior parte do código da 25.12 funciona sem alterações, e todos os 129 exemplos da Docs que rodavam na 25.12 rodam na 26.10. get_text() e get_formatted_text() ainda retornam um str, que agora também responde a read_to_end().

Tags de plataforma atualizadas e wheel Windows 64 bits

O wheel Linux tem a tag manylinux_2_27_x86_64, a glibc mais antiga que o runtime .NET 10 incorporado suporta, e os wheels macOS macosx_13_0_x86_64 e macosx_13_0_arm64. Não há mais wheel Windows de 32 bits. A instalação requer pip 20.3 ou superior.

Exemplo de código

Extrair anotações de um documento Word e incluí-las no 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))

Como obter a atualização

PyPI

Instale ou atualize usando o PyPI:

groupdocs-parser-net 26.10.0 no PyPI

pip install groupdocs-parser-net==26.10.0

Download direto

Baixe wheels específicos por plataforma a partir da página de lançamento do GroupDocs.Parser for Python via .NET 26.10:

Recursos