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() et TextOptions.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 à PreviewOptions sous 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 GroupDocsParserException et ses sous‑classes au lieu de RuntimeError (PARSERPYTHONNET-34)
  • [Amélioration] Mettre à jour System.Security.Cryptography.Pkcs vers 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 corrupted ou une assembly SkiaSharp 3.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, CorruptedDocumentException ou UnsupportedDocumentFormatException depuis groupdocs.parser.exceptions, alors que la version 25.12 levait RuntimeError pour toutes. Les classes existaient en 25.12, mais n’étaient pas dérivées de Exception et n’étaient jamais levées. except Exception capture 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.ICreatePageStream
  • groupdocs.parser.options.IReleasePageStream
  • groupdocs.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() et table[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 :

Ressources