Jesteśmy szczęśliwi, że możemy ogłosić wydanie GroupDocs.Parser for Python v26.10, dostępne od listopada 2026. To wydanie aktualizuje podstawowy silnik do wersji 26.8 i przechodzi z .NET Core 3.1 na .NET 10.0.14, naprawiając dwie luki typu denial-of-service w System.Security.Cryptography.Pkcs. Wprowadza ważne nowe funkcje, w tym wyodrębnianie adnotacji, parsowanie tabel HTML, OCR dla języków arabskiego i koreańskiego, logger Pythona, obsługę zasobów zewnętrznych, wywołania podglądu jako zwykłe funkcje oraz narzędzie wiersza poleceń groupdocs-parser. Koło (wheel) jest teraz czystym pakietem Python skierowanym do Pythona 3.5 – 3.14, z zaktualizowanymi tagami platform (manylinux_2_27_x86_64, macosx_13_0_*) i usunięciem koła 32‑bitowego dla Windows.
Co nowego w tym wydaniu
- [Feature] Dodaj obsługę wyodrębniania adnotacji przy użyciu
get_annotations()iTextOptions.include_annotations(PARSERPYTHONNET-23) - [Feature] Dodaj narzędzie wiersza poleceń
groupdocs-parser(PARSERPYTHONNET-24) - [Feature] Dodaj obsługę obiektu loggera Pythona implementującego
ILogger(PARSERPYTHONNET-25) - [Feature] Dodaj obsługę ładowania zasobów zewnętrznych z Pythona (PARSERPYTHONNET-26)
- [Feature] Dodaj OCR dla tekstu arabskiego i koreańskiego (PARSERPYTHONNET-27)
- [Feature] Dodaj obsługę wyodrębniania tabel z dokumentów HTML (PARSERPYTHONNET-28)
- [Feature] Dodaj obsługę stosowania licencji z zmiennej środowiskowej
GROUPDOCS_LIC_PATH(PARSERPYTHONNET-36) - [Enhancement] Zaktualizuj GroupDocs.Parser do wersji 26.8 oraz wbudowane środowisko uruchomieniowe do .NET 10.0.14 (PARSERPYTHONNET-29)
- [Enhancement] Udostępnij czysty pakiet Python dla Pythona 3.5 – 3.14 zamiast skompilowanego rozszerzenia (PARSERPYTHONNET-30)
- [Enhancement] Przekazuj wywołania podglądu do
PreviewOptionsjako zwykłe funkcje Pythona (PARSERPYTHONNET-31) - [Enhancement] Odrzucaj przypisania do nieznanych atrybutów obiektów API (PARSERPYTHONNET-32)
- [Enhancement] Zaktualizuj tagi platform do glibc 2.27 i macOS 13 oraz usuń koło 32‑bitowe dla Windows (PARSERPYTHONNET-33)
- [Enhancement] Rzuć
GroupDocsParserExceptioni jego podklasy zamiastRuntimeError(PARSERPYTHONNET-34) - [Enhancement] Zaktualizuj
System.Security.Cryptography.Pkcsdo wersji 10.0.14, co naprawia dwie luki typu denial-of-service (PARSERPYTHONNET-37) - [Fix] Niektóre dokumenty Word i RTF kończą się błędem
The document appears to be corruptedlub brakującym zestawemSkiaSharp3.119 (PARSERPYTHONNET-35) - [Fix] Pamięć rośnie przy każdym otwarciu dokumentu z
BytesIO(PARSERPYTHONNET-38)
Zmiany w publicznym API
- Błędy silnika podnoszą
GroupDocsParserException,InvalidPasswordException,CorruptedDocumentExceptionlubUnsupportedDocumentFormatExceptionzgroupdocs.parser.exceptions, podczas gdy w wersji 25.12 podnoszonoRuntimeErrordla wszystkich. Klasy istniały w 25.12, ale nie dziedziczyły poExceptioni nigdy nie były podnoszone.except Exceptionprzechwytuje błędy obu wydań. - Przypisanie nieznanego atrybutu powoduje podniesienie
AttributeError. - Listy zwracane przez silnik obsługują
len()i indeksowanie, a pusta lista jest falsy.
Usunięto
groupdocs.parser.options.ICreatePageStreamgroupdocs.parser.options.IReleasePageStreamgroupdocs.parser.options.IPreviewPageRender
Przekazuj funkcje do PreviewOptions i PreviewOptions.preview_page_render zamiast tego.
Nowe klasy i członkowie
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()itable[row, column].DocumentData,Template:get().TemplateCollection:append().Resources:storage_path, zapisywalny.
Nowe funkcje
Wyodrębnianie adnotacji
Parser.get_annotations() zwraca komentarze i notatki z dokumentu PDF, Word lub PowerPoint jako obiekty AnnotationItem zawierające wartość, typ, indeks strony, znacznik czasu, nazwę autora i inicjały; get_annotations(page_index) odczytuje jedną stronę. TextOptions.include_annotations dodaje tekst adnotacji do wyodrębnionego tekstu, a parser.features.annotations informuje, czy dany format obsługuje adnotacje.
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))
Wiersz poleceń
Koło instaluję skrypt konsolowy groupdocs-parser (również python -m groupdocs.parser) z poleceniami text, info, metadata, images, annotations i list-formats. text przyjmuje --page N (liczone od 1), --format plain|markdown|html, --ocr, --include-annotations oraz -o FILE; info, metadata i annotations przyjmują --json; images przyjmuje --out DIR; każde polecenie przyjmuje --password. --license i --version podaje się przed poleceniem. Kod wyjścia to 0 przy sukcesie, 2 dla błędu użytkownika, takiego jak brakujący plik, oraz 1 dla błędu silnika lub formatu nieobsługującego operacji.
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 Pythona
Zwykły obiekt Pythona z metodami trace(message), warning(message) i error(message, exception) może być przekazany do ParserSettings jako logger, a silnik wywołuje go w trakcie przetwarzania, np. przy uszkodzonym pliku. Działa także funkcja log(level, message, exception).
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)
Kontrola ładowania zasobów zewnętrznych
Silnik pyta obsługę zasobów zewnętrznych przed załadowaniem każdego obrazu, na który odwołuje się dokument HTML lub MHTML. Obsługa może być funkcją, obiektem z metodą on_loading(args) lub podklasą ExternalResourceHandler; ustawienie args.skipped = True pomija zasób. ParserSettings przyjmuje to jako 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 dla języka arabskiego i koreańskiego
OcrOptions.language wybiera alfabet rozpoznawany przez OCR, domyślnie angielski. Language.ARA i Language.KOR są nowe w tym silniku. Modele rozpoznawania są częścią silnika: pierwsze wywołanie OCR rozpakowuje je (ok. 80 MB) do folderu aspose_data w katalogu roboczym, bez pobierania. Aby wybrać folder, ustaw Resources.storage_path (from groupdocs.parser import Resources) przed pierwszym wywołaniem 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)))
Tabele z dokumentów HTML
get_tables() teraz znajduje tabele w dokumentach HTML, tak jak w PDF, Word i arkuszach; w wersji 25.12 nie znajdował żadnych. Komórka to table[row, column] lub 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)])
Licencja z środowiska
Ustaw GROUPDOCS_LIC_PATH na ścieżkę do pliku licencji lub na URL, który go udostępnia; licencja zostaje zastosowana przy pierwszym wywołaniu Parser, bez kodu licencyjnego; wersja 25.12 nie odczytywała tej zmiennej. Jeśli licencja nie może zostać zastosowana (brak pliku, wygasła subskrypcja, licencja dla innego produktu), każde wywołanie Parser podnosi LicenseError, podając nazwę zmiennej i przyczynę silnika, aż License().set_license() zastosuje licencję. Ustaw GROUPDOCS_LIC_STRICT=0, aby otrzymać jedynie LicenseWarning i tryb ewaluacji.
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>
Wywołania podglądu jako zwykłe funkcje
PreviewOptions(create_page_stream, release_page_stream) przyjmuje zwykłe funkcje, podobnie PreviewOptions.preview_page_render. create_page_stream(page_number) zwraca zapisywalny strumień, np. plik otwarty w trybie "wb" lub io.BytesIO; strony numerowane są od 1. Silnik zamyka podany plik i wywołuje release_page_stream(page_number) po zapisaniu strony. W wersji 25.12 były to klasy ICreatePageStream, IReleasePageStream i 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)
Błędnie napisane atrybuty podnoszą AttributeError
Przypisanie właściwości, której obiekt API nie posiada, podnosi AttributeError z podpowiedzią „Did you mean”. W wersji 25.12 przypisanie było akceptowane, przechowywano atrybut tylko w Pythonie i nie wpływało na ustawienia silnika.
from groupdocs.parser.options import TextOptions
options = TextOptions()
try:
options.include_annotation = True
except AttributeError as error:
print(error)
Jedno koło dla Pythona 3.5 – 3.14
Wersja 25.12 była skompilowanym rozszerzeniem, z osobnym modułem binarnym dla każdej wersji Pythona i środowiskiem .NET Core 3.1. Wersja 26.10 to jedno koło py3-none-<platform> na platformę, czysty Python nad wbudowanym środowiskiem .NET 10, deklarujące python_requires=">=3.5,<3.15". Python 3.14 jest nowy: 25.12 deklarowało <3.14. Większość kodu z 25.12 działa bez zmian, a wszystkie 129 przykładów Docs, które działały w 25.12, działa również w 26.10. get_text() i get_formatted_text() nadal zwracają str, który teraz także obsługuje read_to_end().
Zaktualizowane tagi platform i koło 64‑bitowe dla Windows
Koło Linux jest otagowane manylinux_2_27_x86_64, najstarsza glibc, na której uruchamia się wbudowane środowisko .NET 10, a koła macOS to macosx_13_0_x86_64 i macosx_13_0_arm64. Koło 32‑bitowe dla Windows nie jest już dostępne. Instalacja wymaga pip 20.3 lub nowszego.
Przykład kodu
Wyodrębnij adnotacje z dokumentu Word i dołącz je do wyodrębnionego tekstu:
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))
Jak uzyskać aktualizację
PyPI
Zainstaluj lub zaktualizuj za pomocą PyPI:
groupdocs-parser-net 26.10.0 na PyPI
pip install groupdocs-parser-net==26.10.0
Bezpośrednie pobranie
Pobierz koła specyficzne dla platformy z strony wydania GroupDocs.Parser for Python via .NET 26.10: