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() i TextOptions.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 PreviewOptions jako 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ć GroupDocsParserException i jego podklasy zamiast RuntimeError (PARSERPYTHONNET-34)
  • [Enhancement] Zaktualizuj System.Security.Cryptography.Pkcs do 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 corrupted lub brakującym zestawem SkiaSharp 3.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, CorruptedDocumentException lub UnsupportedDocumentFormatException z groupdocs.parser.exceptions, podczas gdy w wersji 25.12 podnoszono RuntimeError dla wszystkich. Klasy istniały w 25.12, ale nie dziedziczyły po Exception i nigdy nie były podnoszone. except Exception przechwytuje 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.ICreatePageStream
  • groupdocs.parser.options.IReleasePageStream
  • groupdocs.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() i table[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:

Zasoby