Wir freuen uns, die Veröffentlichung von GroupDocs.Parser for Python v26.10 bekannt zu geben, verfügbar seit November 2026. Dieses Release aktualisiert die zugrunde liegende Engine auf Version 26.8 und wechselt von .NET Core 3.1 zu .NET 10.0.14, wobei zwei Denial-of-Service‑Schwachstellen in System.Security.Cryptography.Pkcs behoben werden. Es führt wichtige neue Funktionen ein, darunter das Extrahieren von Anmerkungen, das Parsen von HTML‑Tabellen, OCR für Arabisch und Koreanisch, ein Python‑Logger, die Handhabung externer Ressourcen, Vorschau‑Callbacks als einfache Funktionen und ein groupdocs-parser‑Kommandozeilen‑Tool. Das Wheel ist jetzt ein reines Python‑Paket, das Python 3.5 – 3.14 unterstützt, mit aktualisierten Plattform‑Tags (manylinux_2_27_x86_64, macosx_13_0_*) und der Entfernung des 32‑Bit‑Windows‑Wheels.
Was ist neu in diesem Release
- [Feature] Unterstützung für das Extrahieren von Anmerkungen mit
get_annotations()undTextOptions.include_annotationshinzufügen (PARSERPYTHONNET-23) - [Feature] Das
groupdocs-parser‑Kommandozeilen‑Tool hinzufügen (PARSERPYTHONNET-24) - [Feature] Unterstützung für ein Python‑Logger‑Objekt, das
ILoggerimplementiert, hinzufügen (PARSERPYTHONNET-25) - [Feature] Unterstützung für das Laden externer Ressourcen aus Python hinzufügen (PARSERPYTHONNET-26)
- [Feature] OCR für Arabisch und Koreanisch hinzufügen (PARSERPYTHONNET-27)
- [Feature] Unterstützung für das Extrahieren von Tabellen aus HTML‑Dokumenten hinzufügen (PARSERPYTHONNET-28)
- [Feature] Unterstützung für das Anwenden der Lizenz aus der Umgebungsvariable
GROUPDOCS_LIC_PATHhinzufügen (PARSERPYTHONNET-36) - [Enhancement] GroupDocs.Parser auf 26.8 und die eingebettete Runtime auf .NET 10.0.14 aktualisieren (PARSERPYTHONNET-29)
- [Enhancement] Ein reines Python‑Paket für Python 3.5 – 3.14 anstelle der kompilierten Erweiterung bereitstellen (PARSERPYTHONNET-30)
- [Enhancement] Vorschau‑Callbacks an
PreviewOptionsals einfache Python‑Funktionen übergeben (PARSERPYTHONNET-31) - [Enhancement] Zuweisungen an unbekannte Attribute von API‑Objekten ablehnen (PARSERPYTHONNET-32)
- [Enhancement] Die Plattform‑Tags auf glibc 2.27 und macOS 13 aktualisieren und das 32‑Bit‑Windows‑Wheel entfernen (PARSERPYTHONNET-33)
- [Enhancement]
GroupDocsParserExceptionund seine Unterklassen anstelle vonRuntimeErrorauslösen (PARSERPYTHONNET-34) - [Enhancement]
System.Security.Cryptography.Pkcsauf 10.0.14 aktualisieren, wodurch zwei Denial-of-Service‑Schwachstellen behoben werden (PARSERPYTHONNET-37) - [Fix] Einige Word‑ und RTF‑Dokumente schlagen mit
The document appears to be corruptedfehl oder es fehlt dieSkiaSharp3.119‑Assembly (PARSERPYTHONNET-35) - [Fix] Speicher wächst bei jedem mit
BytesIOgeöffneten Dokument (PARSERPYTHONNET-38)
Änderungen der öffentlichen API
- Engine‑Fehler lösen
GroupDocsParserException,InvalidPasswordException,CorruptedDocumentExceptionoderUnsupportedDocumentFormatExceptionausgroupdocs.parser.exceptionsaus, wobei 25.12RuntimeErrorfür alle ausgelöst hat. Die Klassen existierten bereits in 25.12, leiteten jedoch nicht vonExceptionab und wurden nie ausgelöst.except Exceptionfängt die Fehler beider Releases ab. - Das Zuweisen eines unbekannten Attributs löst
AttributeErroraus. - Listen, die die Engine zurückgibt, unterstützen
len()und Indexierung; eine leere Liste ist falsch.
Entfernt
groupdocs.parser.options.ICreatePageStreamgroupdocs.parser.options.IReleasePageStreamgroupdocs.parser.options.IPreviewPageRender
Stattdessen Funktionen an PreviewOptions und PreviewOptions.preview_page_render übergeben.
Neue Klassen und Mitglieder
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()undtable[row, column].DocumentData,Template:get().TemplateCollection:append().Resources:storage_path, beschreibbar.
Neue Funktionen
Anmerkungen extrahieren
Parser.get_annotations() gibt die Kommentare und Notizen eines PDF-, Word‑ oder PowerPoint‑Dokuments als AnnotationItem‑Objekte zurück, die Wert, Typ, Seitenindex, Zeitstempel, Autorname und Initialen enthalten; get_annotations(page_index) liest eine einzelne Seite. TextOptions.include_annotations fügt den Anmerkungstext zum extrahierten Text hinzu, und parser.features.annotations gibt an, ob ein Format Anmerkungen unterstützt.
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))
Befehlszeile
Das Wheel installiert das Konsolenskript groupdocs-parser (auch python -m groupdocs.parser) mit den Befehlen text, info, metadata, images, annotations und list-formats. text akzeptiert --page N (gezählt ab 1), --format plain|markdown|html, --ocr, --include-annotations und -o FILE; info, metadata und annotations akzeptieren --json; images akzeptiert --out DIR; jeder Befehl akzeptiert --password. --license und --version stehen vor dem Befehl. Der Rückgabecode ist 0 bei Erfolg, 2 bei einem Benutzerfehler wie einer fehlenden Datei und 1 bei einem Engine‑Fehler oder einem Format, das die Operation nicht unterstützt.
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
Python‑Logger
Ein einfaches Python‑Objekt mit den Methoden trace(message), warning(message) und error(message, exception) kann als Logger an ParserSettings übergeben werden, und die Engine ruft es während des Extrahierens auf, etwa bei einer beschädigten Datei. Auch eine Funktion log(level, message, exception) funktioniert.
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)
Steuerung des Ladens externer Ressourcen
Die Engine fragt einen externen Ressourcen‑Handler, bevor sie jedes Bild lädt, das ein HTML‑ oder MHTML‑Dokument referenziert. Der Handler kann eine Funktion, ein Objekt mit einer on_loading(args)‑Methode oder eine Unterklasse von ExternalResourceHandler sein; das Setzen von args.skipped = True überspringt die Ressource. ParserSettings nimmt ihn als external_resource_handler entgegen.
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 für Arabisch und Koreanisch
OcrOptions.language wählt das Alphabet, das OCR erkennt; standardmäßig Englisch. Language.ARA und Language.KOR sind in dieser Engine neu. Die Erkennungsmodelle sind Teil der Engine: Der erste OCR‑Aufruf entpackt sie (ca. 80 MB) in einen aspose_data‑Ordner im Arbeitsverzeichnis, ohne Download. Um einen anderen Ordner zu wählen, setzen Sie Resources.storage_path (from groupdocs.parser import Resources) vor dem ersten OCR‑Aufruf.
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)))
Tabellen aus HTML‑Dokumenten
get_tables() findet jetzt die Tabellen von HTML‑Dokumenten, wie bei PDF, Word und Tabellen‑Dokumenten; 25.12 fand keine. Eine Zelle ist table[row, column] oder 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)])
Lizenz aus der Umgebung
Setzen Sie GROUPDOCS_LIC_PATH auf den Pfad einer Lizenzdatei oder auf eine URL, die eine solche bereitstellt; die Lizenz wird beim ersten Parser‑Aufruf angewendet, ohne Lizenzcode; 25.12 las die Variable nicht. Kann die Lizenz nicht angewendet werden (fehlende Datei, abgelaufenes Abonnement, Lizenz für ein anderes Produkt), wirft jeder Parser‑Aufruf LicenseError mit Hinweis auf die Variable und den Grund der Engine, bis License().set_license() eine Lizenz setzt. Setzen Sie GROUPDOCS_LIC_STRICT=0, um stattdessen eine LicenseWarning und den Evaluierungsmodus zu erhalten.
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>
Vorschau‑Callbacks als einfache Funktionen
PreviewOptions(create_page_stream, release_page_stream) akzeptiert gewöhnliche Funktionen, ebenso PreviewOptions.preview_page_render. create_page_stream(page_number) liefert einen beschreibbaren Stream, z. B. eine Datei, die mit "wb" geöffnet wurde, oder ein io.BytesIO; Seiten werden ab 1 nummeriert. Die Engine schließt eine übergebene Datei und ruft release_page_stream(page_number) auf, sobald die Seite geschrieben ist. In 25.12 waren dies die Klassen ICreatePageStream, IReleasePageStream und 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)
Schreibfehler bei Attributen lösen AttributeError aus
Das Zuweisen einer Eigenschaft, die ein API‑Objekt nicht besitzt, löst AttributeError mit einem Hinweis „Did you mean…“ aus. 25.12 akzeptierte die Zuweisung, speicherte ein rein Python‑Attribut und ließ die Engine‑Einstellung unverändert.
from groupdocs.parser.options import TextOptions
options = TextOptions()
try:
options.include_annotation = True
except AttributeError as error:
print(error)
Ein Wheel für Python 3.5 – 3.14
25.12 war eine kompilierte Erweiterung mit einem Binärmodul pro Python‑Version und einer .NET Core 3.1‑Runtime. 26.10 ist ein py3-none-<platform>‑Wheel pro Plattform, reines Python über einer eingebetteten .NET 10‑Runtime, und deklariert python_requires=">=3.5,<3.15". Python 3.14 ist neu: 25.12 deklarierte <3.14. Der Großteil des 25.12‑Codes läuft unverändert, und alle 129 Docs‑Beispiele, die auf 25.12 liefen, laufen auf 26.10. get_text() und get_formatted_text() geben weiterhin einen str zurück, der jetzt auch read_to_end() unterstützt.
Aktualisierte Plattform‑Tags und 64‑Bit‑Windows‑Wheel
Das Linux‑Wheel trägt das Tag manylinux_2_27_x86_64, die älteste glibc, auf der die eingebettete .NET 10‑Runtime startet, und die macOS‑Wheels macosx_13_0_x86_64 und macosx_13_0_arm64. Es gibt kein 32‑Bit‑Windows‑Wheel mehr. Die Installation erfordert pip 20.3 oder neuer.
Code‑Beispiel
Anmerkungen aus einem Word‑Dokument extrahieren und in den extrahierten Text einbinden:
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))
Wie Sie das Update erhalten
PyPI
Installation oder Upgrade über PyPI:
groupdocs-parser-net 26.10.0 auf PyPI
pip install groupdocs-parser-net==26.10.0
Direkter Download
Plattformspezifische Wheels von GroupDocs.Parser for Python via .NET 26.10 herunterladen: