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()eTextOptions.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
PreviewOptionscome 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
GroupDocsParserExceptione le sue sottoclassi invece diRuntimeError(PARSERPYTHONNET-34) - [Enhancement] Aggiornare
System.Security.Cryptography.Pkcsa 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 corruptedo con un’assemblySkiaSharp3.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,CorruptedDocumentExceptionoUnsupportedDocumentFormatExceptiondagroupdocs.parser.exceptions, dove la 25.12 sollevavaRuntimeErrorper tutti. Le classi esistevano nella 25.12, ma non derivavano daExceptione non venivano mai sollevate.except Exceptioncattura 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.ICreatePageStreamgroupdocs.parser.options.IReleasePageStreamgroupdocs.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()etable[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: