Ми раді оголосити про випуск GroupDocs.Parser for Python v26.10, доступний з листопада 2026. Цей випуск оновлює базовий движок до версії 26.8 і переходить з .NET Core 3.1 на .NET 10.0.14, виправляючи дві вразливості типу відмова в обслуговуванні в System.Security.Cryptography.Pkcs. Він вводить важливі нові можливості, включаючи витягування анотацій, парсинг HTML‑таблиць, OCR для арабської та корейської, Python‑логер, обробку зовнішніх ресурсів, callbacks попереднього перегляду як прості функції та інструмент командного рядка groupdocs-parser. Пакет wheel тепер є чистим Python‑пакетом, орієнтованим на Python 3.5 – 3.14, з оновленими тегами платформи (manylinux_2_27_x86_64, macosx_13_0_*) та без 32‑бітного wheel для Windows.

Що нового у цьому випуску

  • [Feature] Додана підтримка витягування анотацій за допомогою get_annotations() та TextOptions.include_annotations (PARSERPYTHONNET-23)
  • [Feature] Додано інструмент командного рядка groupdocs-parser (PARSERPYTHONNET-24)
  • [Feature] Додана підтримка Python‑логера, що реалізує ILogger (PARSERPYTHONNET-25)
  • [Feature] Додана підтримка обробки завантаження зовнішніх ресурсів з Python (PARSERPYTHONNET-26)
  • [Feature] Додано OCR для арабської та корейської (PARSERPYTHONNET-27)
  • [Feature] Додана підтримка витягування таблиць з HTML‑документів (PARSERPYTHONNET-28)
  • [Feature] Додана підтримка застосування ліцензії з змінної середовища GROUPDOCS_LIC_PATH (PARSERPYTHONNET-36)
  • [Enhancement] Оновлено GroupDocs.Parser до 26.8 та вбудований runtime до .NET 10.0.14 (PARSERPYTHONNET-29)
  • [Enhancement] Поставляється чистий Python‑пакет для Python 3.5 – 3.14 замість скомпільованого розширення (PARSERPYTHONNET-30)
  • [Enhancement] Передача callbacks попереднього перегляду до PreviewOptions як простих Python‑функцій (PARSERPYTHONNET-31)
  • [Enhancement] Відхилення присвоєння невідомих атрибутів об’єктів API (PARSERPYTHONNET-32)
  • [Enhancement] Оновлені теги платформи до glibc 2.27 і macOS 13, видалено 32‑бітний wheel для Windows (PARSERPYTHONNET-33)
  • [Enhancement] Підняття GroupDocsParserException та його підкласів замість RuntimeError (PARSERPYTHONNET-34)
  • [Enhancement] Оновлено System.Security.Cryptography.Pkcs до 10.0.14, що виправляє дві вразливості типу відмова в обслуговуванні (PARSERPYTHONNET-37)
  • [Fix] Деякі документи Word і RTF завершувалися помилкою The document appears to be corrupted або бракували збірки SkiaSharp 3.119 (PARSERPYTHONNET-35)
  • [Fix] Пам’ять зростає при відкритті кожного документа з BytesIO (PARSERPYTHONNET-38)

Зміни у публічному API

  • Помилки движка піднімають GroupDocsParserException, InvalidPasswordException, CorruptedDocumentException або UnsupportedDocumentFormatException з groupdocs.parser.exceptions, тоді як у 25.12 піднімався RuntimeError для всіх. Класи існували в 25.12, але не успадковували Exception і ніколи не піднімалися. except Exception ловить помилки обох випусків.
  • Присвоєння невідомого атрибуту піднімає AttributeError.
  • Списки, які повертає движок, підтримують len() і індексацію, а порожній список оцінюється як False.

Видалено

  • groupdocs.parser.options.ICreatePageStream
  • groupdocs.parser.options.IReleasePageStream
  • groupdocs.parser.options.IPreviewPageRender

Тепер передавайте функції до PreviewOptions та PreviewOptions.preview_page_render.

Нові класи та члени

  • 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() і table[row, column].
  • DocumentData, Template: get().
  • TemplateCollection: append().
  • Resources: storage_path, записуваний.

Нові функції

Витягування анотацій

Parser.get_annotations() повертає коментарі та нотатки PDF, Word або PowerPoint у вигляді об’єктів AnnotationItem зі значенням, типом, індексом сторінки, міткою часу, ім’ям автора та ініціалами; get_annotations(page_index) читає одну сторінку. TextOptions.include_annotations додає текст анотації до витягнутого тексту, а parser.features.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))

Командний рядок

Wheel встановлює консольний скрипт groupdocs-parser (також python -m groupdocs.parser) з командами text, info, metadata, images, annotations та list-formats. text приймає --page N (нумерація з 1), --format plain|markdown|html, --ocr, --include-annotations і -o FILE; info, metadata і annotations приймають --json; images приймає --out DIR; кожна команда приймає --password. --license і --version вказуються перед командою. Код виходу 0 — успіх, 2 — помилка користувача (наприклад, відсутній файл), 1 — помилка движка або формат, що не підтримує операцію.

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-логгер

Простий Python‑об’єкт з методами trace(message), warning(message) і error(message, exception) можна передати до ParserSettings як логер, і движок викликатиме його під час обробки, наприклад, при пошкодженому файлі. Працює також функція 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)

Керування завантаженням зовнішніх ресурсів

Движок запитує зовнішній обробник перед завантаженням кожного зображення, на яке посилається HTML або MHTML документ. Обробник може бути функцією, об’єктом з методом on_loading(args) або підкласом ExternalResourceHandler; встановлення args.skipped = True пропускає ресурс. ParserSettings приймає його як 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 для арабської та корейської

OcrOptions.language вибирає алфавіт, який розпізнає OCR; за замовчуванням — англійська. Language.ARA і Language.KOR нові в цьому движку. Моделі розпізнавання входять до складу движка: перший виклик OCR розпаковує їх (близько 80 МБ) у папку aspose_data у робочому каталозі, без завантаження. Щоб задати іншу папку, встановіть Resources.storage_path (from groupdocs.parser import Resources) перед першим викликом 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)))

Таблиці з HTML‑документів

get_tables() тепер знаходить таблиці в HTML‑документах, так само як у PDF, Word та електронних таблицях; у 25.12 їх не знаходило. Комірка доступна як table[row, column] або 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)])

Ліцензія з середовища

Встановіть GROUPDOCS_LIC_PATH у шлях до файлу ліцензії або URL, що його повертає, і ліцензія буде застосована при першому виклику Parser, без коду ліцензії; у 25.12 змінна не читалася. Якщо ліцензію не вдається застосувати (відсутній файл, прострочена підписка, ліцензія для іншого продукту), кожен виклик Parser піднімає LicenseError, вказуючи змінну та причину движка, доки License().set_license() не застосує ліцензію. Встановіть GROUPDOCS_LIC_STRICT=0, щоб отримати один LicenseWarning і режим оцінки.

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 попереднього перегляду як прості функції

PreviewOptions(create_page_stream, release_page_stream) приймає звичайні функції, так само як PreviewOptions.preview_page_render. create_page_stream(page_number) повертає записуваний потік, наприклад файл, відкритий у режимі "wb" або io.BytesIO; нумерація сторінок починається з 1. Движок закриває переданий файл і викликає release_page_stream(page_number) після запису сторінки. У 25.12 це були класи ICreatePageStream, IReleasePageStream і 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)

Помилкові атрибути викликають AttributeError

Присвоєння властивості, якої немає у об’єкта API, піднімає AttributeError з підказкою «Did you mean». У 25.12 таке присвоєння приймалося, зберігалося лише як Python‑атрибут і не впливало на налаштування движка.

from groupdocs.parser.options import TextOptions

options = TextOptions()
try:
    options.include_annotation = True
except AttributeError as error:
    print(error)

Один wheel для Python 3.5 – 3.14

У 25.12 це було скомпільоване розширення з окремим двійковим модулем для кожної версії Python і runtime .NET Core 3.1. У 26.10 — один py3-none-<platform> wheel на платформу, чистий Python над вбудованим .NET 10, і вказано python_requires=">=3.5,<3.15". Python 3.14 новий: у 25.12 було <3.14. Більшість коду 25.12 працює без змін, і всі 129 прикладів Docs, що працювали на 25.12, працюють на 26.10. get_text() і get_formatted_text() і далі повертають str, який тепер також підтримує read_to_end().

Оновлені теги платформи та 64‑бітний wheel для Windows

Linux‑wheel має тег manylinux_2_27_x86_64, найстаріший glibc, на якому стартує вбудований .NET 10, а macOS‑wheel — macosx_13_0_x86_64 і macosx_13_0_arm64. 32‑бітний wheel для Windows більше не існує. Для встановлення потрібен pip 20.3 або новіший.

Приклад коду

Витягування анотацій з Word‑документа та включення їх у витягнутий текст:

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))

Як отримати оновлення

PyPI

Встановіть або оновіть через PyPI:

groupdocs-parser-net 26.10.0 на PyPI

pip install groupdocs-parser-net==26.10.0

Пряме завантаження

Завантажте wheel‑файли для конкретних платформ зі сторінки випуску GroupDocs.Parser for Python via .NET 26.10:

Ресурси