Siamo felici di annunciare il rilascio di GroupDocs.Parser for Python v26.10, disponibile a partire da novembre 2026. Questa versione aggiorna il motore sottostante alla versione 26.8 e passa da .NET Core 3.1 a .NET 10.0.14, correggendo due vulnerabilità di denial-of-service in System.Security.Cryptography.Pkcs. Introduce importanti nuove funzionalità tra cui l’estrazione di annotazioni, l’analisi di tabelle HTML, OCR per arabo e coreano, un logger Python, la gestione di risorse esterne, callback di anteprima come funzioni semplici e uno strumento da riga di comando groupdocs-parser. Il wheel è ora un pacchetto pure-Python che supporta Python 3.5 – 3.14, con tag di piattaforma aggiornati (manylinux_2_27_x86_64, macosx_13_0_*) e la rimozione del wheel Windows a 32‑bit.

Novità di questa versione

  • [Feature] Aggiungere il supporto per l’estrazione di annotazioni con get_annotations() e TextOptions.include_annotations (PARSERPYTHONNET-23)
  • [Feature] Aggiungere lo strumento da riga di comando groupdocs-parser (PARSERPYTHONNET-24)
  • [Feature] Aggiungere il supporto per un oggetto logger Python che implementa ILogger (PARSERPYTHONNET-25)
  • [Feature] Aggiungere il supporto per la gestione del caricamento di risorse esterne da Python (PARSERPYTHONNET-26)
  • [Feature] Aggiungere OCR per testi arabi e coreani (PARSERPYTHONNET-27)
  • [Feature] Aggiungere il supporto per l’estrazione di tabelle da documenti HTML (PARSERPYTHONNET-28)
  • [Feature] Aggiungere il supporto per applicare la licenza dalla variabile d’ambiente GROUPDOCS_LIC_PATH (PARSERPYTHONNET-36)
  • [Enhancement] Aggiornare GroupDocs.Parser a 26.8 e il runtime incorporato a .NET 10.0.14 (PARSERPYTHONNET-29)
  • [Enhancement] Distribuire un pacchetto pure-Python per Python 3.5 – 3.14 al posto dell’estensione compilata (PARSERPYTHONNET-30)
  • [Enhancement] Passare i callback di anteprima a PreviewOptions come funzioni Python semplici (PARSERPYTHONNET-31)
  • [Enhancement] Rifiutare assegnazioni a attributi sconosciuti degli oggetti API (PARSERPYTHONNET-32)
  • [Enhancement] Aggiornare i tag di piattaforma a glibc 2.27 e macOS 13, e rimuovere il wheel Windows a 32‑bit (PARSERPYTHONNET-33)
  • [Enhancement] Sollevare GroupDocsParserException e le sue sottoclassi invece di RuntimeError (PARSERPYTHONNET-34)
  • [Enhancement] Aggiornare System.Security.Cryptography.Pkcs a 10.0.14, che corregge due vulnerabilità di denial-of-service (PARSERPYTHONNET-37)
  • [Fix] Alcuni documenti Word e RTF fallivano con The document appears to be corrupted o con un’assembly SkiaSharp 3.119 mancante (PARSERPYTHONNET-35)
  • [Fix] La memoria cresceva ad ogni documento aperto da un BytesIO (PARSERPYTHONNET-38)

Modifiche all’API pubblica

  • Gli errori del motore sollevano GroupDocsParserException, InvalidPasswordException, CorruptedDocumentException o UnsupportedDocumentFormatException da groupdocs.parser.exceptions, dove la 25.12 sollevava RuntimeError per tutti. Le classi esistevano nella 25.12, ma non derivavano da Exception e non venivano mai sollevate. except Exception cattura gli errori di entrambe le versioni.
  • Assegnare un attributo sconosciuto solleva AttributeError.
  • Le liste restituite dal motore supportano len() e l’indicizzazione, e una lista vuota è valutata come false.

Rimosso

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

Passare funzioni a PreviewOptions e PreviewOptions.preview_page_render invece.

Nuove classi e membri

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

Nuove funzionalità

Estrarre annotazioni

Parser.get_annotations() restituisce i commenti e le note di un documento PDF, Word o PowerPoint come oggetti AnnotationItem contenenti valore, tipo, indice della pagina, timestamp, nome dell’autore e iniziali; get_annotations(page_index) legge una singola pagina. TextOptions.include_annotations aggiunge il testo dell’annotazione al testo estratto, e parser.features.annotations indica se un formato supporta le annotazioni.

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

Riga di comando

Il wheel installa lo script console groupdocs-parser (anche python -m groupdocs.parser) con i comandi text, info, metadata, images, annotations e list-formats. text accetta --page N (contato da 1), --format plain|markdown|html, --ocr, --include-annotations e -o FILE; info, metadata e annotations accettano --json; images accetta --out DIR; ogni comando accetta --password. --license e --version vanno prima del comando. Il codice di uscita è 0 in caso di successo, 2 per un errore utente come un file mancante, e 1 per un errore del motore o un formato che non supporta l’operazione.

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

Un semplice oggetto Python con i metodi trace(message), warning(message) e error(message, exception) può essere passato a ParserSettings come logger, e il motore lo chiama con ciò che incontra durante l’estrazione, ad esempio un file danneggiato. Anche una funzione log(level, message, exception) funziona.

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)

Controllare il caricamento di risorse esterne

Il motore richiede un gestore di risorse esterne prima di caricare ogni immagine a cui un documento HTML o MHTML fa riferimento. Il gestore può essere una funzione, un oggetto con il metodo on_loading(args), o una sottoclasse di ExternalResourceHandler; impostare args.skipped = True salta la risorsa. ParserSettings lo accetta come 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 per arabo e coreano

OcrOptions.language seleziona l’alfabeto riconosciuto dall’OCR, per impostazione predefinita l’inglese. Language.ARA e Language.KOR sono nuovi in questo motore. I modelli di riconoscimento fanno parte del motore: la prima chiamata OCR li decomprime, circa 80 MB, in una cartella aspose_data nella directory di lavoro, senza download. Per scegliere la cartella, impostare Resources.storage_path (from groupdocs.parser import Resources) prima della prima chiamata 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)))

Tabelle da documenti HTML

get_tables() ora trova le tabelle dei documenti HTML, come fa per PDF, Word e fogli di calcolo; la 25.12 non ne trovava alcuna. Una cella è 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)])

Licenza dall’ambiente

Impostare GROUPDOCS_LIC_PATH sul percorso di un file di licenza, o su un URL che ne fornisce uno, e la licenza viene applicata alla prima chiamata Parser, senza codice di licenza; la 25.12 non leggeva la variabile. Se quella licenza non può essere applicata (file mancante, abbonamento scaduto, licenza per un altro prodotto), ogni chiamata Parser solleva LicenseError, indicando la variabile e il motivo del motore, fino a quando License().set_license() applica una licenza. Impostare GROUPDOCS_LIC_STRICT=0 per ottenere un solo LicenseWarning e la modalità di valutazione.

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>

Callback di anteprima come funzioni semplici

PreviewOptions(create_page_stream, release_page_stream) accetta funzioni ordinarie, così come PreviewOptions.preview_page_render. create_page_stream(page_number) restituisce uno stream scrivibile, ad esempio un file aperto con "wb" o un io.BytesIO; le pagine sono numerate a partire da 1. Il motore chiude il file che gli è stato fornito e chiama release_page_stream(page_number) una volta che la pagina è stata scritta. Nella 25.12 questi erano le classi 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)

Gli attributi errati sollevano AttributeError

Assegnare una proprietà che un oggetto API non possiede solleva AttributeError con un suggerimento “Intendevi”. La 25.12 accettava l’assegnazione, memorizzava un attributo solo Python e lasciava invariata l’impostazione del motore.

from groupdocs.parser.options import TextOptions

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

Un unico wheel per Python 3.5 – 3.14

La 25.12 era un’estensione compilata, con un modulo binario per ogni versione di Python e un runtime .NET Core 3.1. La 26.10 è un unico wheel py3-none-<platform> per piattaforma, Python puro su un runtime .NET 10 incorporato, e dichiara python_requires=">=3.5,<3.15". Python 3.14 è nuovo: la 25.12 dichiarava <3.14. La maggior parte del codice della 25.12 funziona invariata, e tutti i 129 esempi Docs che funzionavano sulla 25.12 funzionano sulla 26.10. get_text() e get_formatted_text() restituiscono ancora una str, che ora risponde anche a read_to_end().

Tag di piattaforma aggiornati e wheel Windows a 64‑bit

Il wheel Linux è etichettato manylinux_2_27_x86_64, la glibc più vecchia su cui parte il runtime .NET 10 incorporato, e i wheel macOS macosx_13_0_x86_64 e macosx_13_0_arm64. Non esiste più un wheel Windows a 32‑bit. L’installazione richiede pip 20.3 o versioni successive.

Esempio di codice

Estrai le annotazioni da un documento Word e includile nel testo estratto:

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

Come ottenere l’aggiornamento

PyPI

Installa o aggiorna usando PyPI:

groupdocs-parser-net 26.10.0 on PyPI

pip install groupdocs-parser-net==26.10.0

Download diretto

Scarica i wheel specifici per piattaforma da GroupDocs.Parser for Python via .NET pagina di rilascio 26.10:

Risorse