Nous sommes heureux d’annoncer la sortie de GroupDocs.Parser for Python v26.10, disponible depuis novembre 2026. Cette version met à jour le moteur sous-jacent vers la version 26.8 et passe de .NET Core 3.1 à .NET 10.0.14, corrigeant deux vulnérabilités de type déni de service dans System.Security.Cryptography.Pkcs. Elle introduit de nouvelles fonctionnalités majeures, notamment l’extraction d’annotations, l’analyse de tableaux HTML, la reconnaissance OCR pour l’arabe et le coréen, un logger Python, la gestion des ressources externes, des callbacks de prévisualisation sous forme de fonctions simples, ainsi qu’un outil en ligne de commande groupdocs-parser. Le wheel est désormais un paquet pure‑Python ciblant Python 3.5 – 3.14, avec des balises de plateforme mises à jour (manylinux_2_27_x86_64, macosx_13_0_*) et la suppression du wheel Windows 32 bits.
Nouveautés de cette version
- [Fonctionnalité] Ajouter la prise en charge de l’extraction d’annotations avec
get_annotations()etTextOptions.include_annotations(PARSERPYTHONNET-23) - [Fonctionnalité] Ajouter l’outil en ligne de commande
groupdocs-parser(PARSERPYTHONNET-24) - [Fonctionnalité] Ajouter la prise en charge d’un objet logger Python implémentant
ILogger(PARSERPYTHONNET-25) - [Fonctionnalité] Ajouter la prise en charge de la gestion du chargement des ressources externes depuis Python (PARSERPYTHONNET-26)
- [Fonctionnalité] Ajouter l’OCR pour le texte arabe et coréen (PARSERPYTHONNET-27)
- [Fonctionnalité] Ajouter la prise en charge de l’extraction de tableaux à partir de documents HTML (PARSERPYTHONNET-28)
- [Fonctionnalité] Ajouter la prise en charge de l’application de la licence depuis la variable d’environnement
GROUPDOCS_LIC_PATH(PARSERPYTHONNET-36) - [Amélioration] Mettre à jour GroupDocs.Parser vers la version 26.8 et le runtime intégré vers .NET 10.0.14 (PARSERPYTHONNET-29)
- [Amélioration] Distribuer un paquet pure‑Python pour Python 3.5 – 3.14 à la place de l’extension compilée (PARSERPYTHONNET-30)
- [Amélioration] Passer les callbacks de prévisualisation à
PreviewOptionssous forme de fonctions Python simples (PARSERPYTHONNET-31) - [Amélioration] Refuser les affectations à des attributs inconnus des objets API (PARSERPYTHONNET-32)
- [Amélioration] Mettre à jour les balises de plateforme vers glibc 2.27 et macOS 13, et supprimer le wheel Windows 32 bits (PARSERPYTHONNET-33)
- [Amélioration] Lever
GroupDocsParserExceptionet ses sous‑classes au lieu deRuntimeError(PARSERPYTHONNET-34) - [Amélioration] Mettre à jour
System.Security.Cryptography.Pkcsvers 10.0.14, ce qui corrige deux vulnérabilités de type déni de service (PARSERPYTHONNET-37) - [Correction] Certains documents Word et RTF échouent avec
The document appears to be corruptedou une assemblySkiaSharp3.119 manquante (PARSERPYTHONNET-35) - [Correction] La mémoire augmente à chaque document ouvert depuis un
BytesIO(PARSERPYTHONNET-38)
Modifications de l’API publique
- Les erreurs du moteur lèvent
GroupDocsParserException,InvalidPasswordException,CorruptedDocumentExceptionouUnsupportedDocumentFormatExceptiondepuisgroupdocs.parser.exceptions, alors que la version 25.12 levaitRuntimeErrorpour toutes. Les classes existaient en 25.12, mais n’étaient pas dérivées deExceptionet n’étaient jamais levées.except Exceptioncapture les erreurs des deux versions. - L’affectation d’un attribut inconnu lève
AttributeError. - Les listes renvoyées par le moteur supportent
len()et l’indexation, et une liste vide est évaluée à false.
Supprimé
groupdocs.parser.options.ICreatePageStreamgroupdocs.parser.options.IReleasePageStreamgroupdocs.parser.options.IPreviewPageRender
Passez des fonctions à PreviewOptions et PreviewOptions.preview_page_render à la place.
Nouvelles classes et membres
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()ettable[row, column].DocumentData,Template:get().TemplateCollection:append().Resources:storage_path, writable.
Nouvelles fonctionnalités
Extraire les annotations
Parser.get_annotations() renvoie les commentaires et notes d’un document PDF, Word ou PowerPoint sous forme d’objets AnnotationItem contenant la valeur, le type, l’indice de page, le horodatage, le nom de l’auteur et les initiales ; get_annotations(page_index) lit une seule page. TextOptions.include_annotations ajoute le texte de l’annotation au texte extrait, et parser.features.annotations indique si un format supporte les annotations.
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))
Ligne de commande
Le wheel installe le script console groupdocs-parser (également python -m groupdocs.parser) avec les commandes text, info, metadata, images, annotations et list-formats. text accepte --page N (compté à partir de 1), --format plain|markdown|html, --ocr, --include-annotations et -o FILE ; info, metadata et annotations acceptent --json ; images accepte --out DIR ; chaque commande accepte --password. --license et --version précèdent la commande. Le code de sortie est 0 en cas de succès, 2 pour une erreur utilisateur comme un fichier manquant, et 1 pour une erreur du moteur ou un format qui ne supporte pas l’opération.
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 objet Python simple avec les méthodes trace(message), warning(message) et error(message, exception) peut être passé à ParserSettings comme logger, et le moteur l’appelle lorsqu’il rencontre un problème pendant l’extraction, par exemple un fichier endommagé. Une fonction log(level, message, exception) fonctionne également.
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)
Contrôler le chargement des ressources externes
Le moteur interroge un gestionnaire de ressources externes avant de charger chaque image référencée par un document HTML ou MHTML. Le gestionnaire peut être une fonction, un objet avec une méthode on_loading(args), ou une sous‑classe de ExternalResourceHandler ; définir args.skipped = True ignore la ressource. ParserSettings accepte ce gestionnaire via le paramètre 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 pour l’arabe et le coréen
OcrOptions.language sélectionne l’alphabet reconnu par l’OCR, anglais par défaut. Language.ARA et Language.KOR sont nouveaux dans ce moteur. Les modèles de reconnaissance font partie du moteur : le premier appel OCR les décompresse (environ 80 Mo) dans un dossier aspose_data du répertoire de travail, sans téléchargement. Pour choisir le dossier, définissez Resources.storage_path (from groupdocs.parser import Resources) avant le premier appel 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)))
Tableaux à partir de documents HTML
get_tables() trouve désormais les tableaux des documents HTML, comme il le fait pour les PDF, Word et les feuilles de calcul ; la version 25.12 n’en trouvait aucun. Une cellule s’obtient avec 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)])
Licence depuis l’environnement
Définissez GROUPDOCS_LIC_PATH vers le chemin d’un fichier de licence, ou vers une URL qui en fournit une, et la licence est appliquée lors du premier appel à Parser, sans code de licence ; la version 25.12 ne lisait pas cette variable. Si la licence ne peut pas être appliquée (fichier manquant, abonnement expiré, licence pour un autre produit), chaque appel à Parser lève LicenseError, indiquant la variable et la raison du moteur, jusqu’à ce que License().set_license() applique une licence. Définissez GROUPDOCS_LIC_STRICT=0 pour obtenir un seul LicenseWarning et le mode d’évaluation à la place.
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 prévisualisation sous forme de fonctions simples
PreviewOptions(create_page_stream, release_page_stream) accepte des fonctions ordinaires, tout comme PreviewOptions.preview_page_render. create_page_stream(page_number) renvoie un flux writable, par exemple un fichier ouvert en "wb" ou un io.BytesIO ; les pages sont numérotées à partir de 1. Le moteur ferme le fichier qui lui a été fourni, et appelle release_page_stream(page_number) une fois la page écrite. En 25.12, ces fonctions étaient les classes ICreatePageStream, IReleasePageStream et 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)
Les attributs mal orthographiés lèvent AttributeError
L’affectation d’une propriété inexistante sur un objet API lève AttributeError avec une suggestion « Did you mean ». La version 25.12 acceptait l’affectation, stockait un attribut uniquement Python et laissait le paramètre du moteur inchangé.
from groupdocs.parser.options import TextOptions
options = TextOptions()
try:
options.include_annotation = True
except AttributeError as error:
print(error)
Un seul wheel pour Python 3.5 – 3.14
La version 25.12 était une extension compilée, avec un module binaire par version de Python et un runtime .NET Core 3.1. La version 26.10 est un seul wheel py3-none-<platform> par plateforme, pure‑Python sur un runtime .NET 10 intégré, et déclare python_requires=">=3.5,<3.15". Python 3.14 est nouveau : la version 25.12 déclarait <3.14. La plupart du code 25.12 fonctionne sans modification, et les 129 exemples Docs qui fonctionnaient avec 25.12 fonctionnent avec 26.10. get_text() et get_formatted_text() renvoient toujours un str, qui répond désormais à read_to_end().
Balises de plateforme mises à jour et wheel Windows 64 bits
Le wheel Linux porte la balise manylinux_2_27_x86_64, la plus ancienne glibc supportée par le runtime .NET 10 intégré, et les wheels macOS macosx_13_0_x86_64 et macosx_13_0_arm64. Il n’existe plus de wheel Windows 32 bits. L’installation nécessite pip 20.3 ou plus récent.
Exemple de code
Extraire les annotations d’un document Word et les inclure dans le texte extrait :
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))
Comment obtenir la mise à jour
PyPI
Installez ou mettez à jour via PyPI :
groupdocs-parser-net 26.10.0 sur PyPI
pip install groupdocs-parser-net==26.10.0
Téléchargement direct
Téléchargez les wheels spécifiques à chaque plateforme depuis la page de version GroupDocs.Parser for Python via .NET 26.10 :