ما خوشحالیم که انتشار GroupDocs.Parser for Python v26.10 را اعلام می‌کنیم که از نوامبر 2026 در دسترس است. این نسخه موتور زیرساخت را به نسخه 26.8 ارتقا می‌دهد و از .NET Core 3.1 به .NET 10.0.14 منتقل می‌شود، دو آسیب‌پذیری نوع denial-of-service در System.Security.Cryptography.Pkcs را رفع می‌کند. ویژگی‌های جدید عمده‌ای از جمله استخراج حاشیه‌نویسی، تجزیه جدول‌های HTML، OCR برای عربی و کره‌ای، یک logger پایتون، مدیریت منابع خارجی، callbackهای پیش‌نمایش به‌صورت توابع ساده، و ابزار خط فرمان groupdocs-parser را معرفی می‌کند. حالا wheel یک بستهٔ pure-Python است که برای Python 3.5 – 3.14 هدف‌گذاری شده، با برچسب‌های پلتفرم به‌روز شده (manylinux_2_27_x86_64, macosx_13_0_*) و حذف wheel ویندوز 32‑بیتی.

موارد جدید در این نسخه

  • [Feature] افزودن پشتیبانی از استخراج حاشیه‌نویسی‌ها با get_annotations() و TextOptions.include_annotations (PARSERPYTHONNET-23)
  • [Feature] افزودن ابزار خط فرمان groupdocs-parser (PARSERPYTHONNET-24)
  • [Feature] افزودن پشتیبانی از یک شی logger پایتون که رابط ILogger را پیاده‌سازی می‌کند (PARSERPYTHONNET-25)
  • [Feature] افزودن پشتیبانی از مدیریت بارگذاری منابع خارجی از پایتون (PARSERPYTHONNET-26)
  • [Feature] افزودن OCR برای متن عربی و کره‌ای (PARSERPYTHONNET-27)
  • [Feature] افزودن پشتیبانی از استخراج جدول‌ها از اسناد HTML (PARSERPYTHONNET-28)
  • [Feature] افزودن پشتیبانی از اعمال لایسنس از متغیر محیطی GROUPDOCS_LIC_PATH (PARSERPYTHONNET-36)
  • [Enhancement] به‌روزرسانی GroupDocs.Parser به 26.8 و زمان‌اجرای توکار به .NET 10.0.14 (PARSERPYTHONNET-29)
  • [Enhancement] ارائه یک بستهٔ pure-Python برای Python 3.5 – 3.14 به‌جای افزونهٔ کامپایل‌شده (PARSERPYTHONNET-30)
  • [Enhancement] پاس دادن callbackهای پیش‌نمایش به PreviewOptions به‌صورت توابع ساده پایتون (PARSERPYTHONNET-31)
  • [Enhancement] رد کردن تخصیص به ویژگی‌های ناشناختهٔ اشیاء API (PARSERPYTHONNET-32)
  • [Enhancement] به‌روزرسانی برچسب‌های پلتفرم به glibc 2.27 و macOS 13، و حذف wheel ویندوز 32‑بیتی (PARSERPYTHONNET-33)
  • [Enhancement] پرتاب GroupDocsParserException و زیرکلاس‌های آن به‌جای RuntimeError (PARSERPYTHONNET-34)
  • [Enhancement] به‌روزرسانی System.Security.Cryptography.Pkcs به 10.0.14 که دو آسیب‌پذیری denial-of-service را رفع می‌کند (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() and table[row, column].
  • DocumentData, Template: get().
  • TemplateCollection: append().
  • Resources: storage_path, writable.

ویژگی‌های جدید

استخراج حاشیه‌نویسی‌ها

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

logger پایتون

یک شی ساده پایتون با متدهای trace(message), warning(message) و error(message, exception) می‌تواند به‌عنوان logger به 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 به آن ارجاع می‌دهد، از یک handler منابع خارجی می‌پرسد. این handler می‌تواند یک تابع، یک شی با متد on_loading(args) یا یک زیرکلاس ExternalResourceHandler باشد؛ تنظیم args.skipped = True منبع را نادیده می‌گیرد. ParserSettings این handler را به‌صورت 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 در دایرکتوری کاری استخراج می‌کند، بدون نیاز به دانلود. برای انتخاب پوشه، قبل از اولین فراخوانی OCR مقدار Resources.storage_path را تنظیم کنید (from groupdocs.parser import Resources).

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>

callbackهای پیش‌نمایش به‌صورت توابع ساده

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 را با یک راهنمایی «آیا منظور شما این بود» پرتاب می‌کند. نسخه 25.12 این تخصیص را می‌پذیرفت، یک ویژگی فقط پایتونی ذخیره می‌کرد و تنظیمات موتور را تغییر نمی‌داد.

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 یک افزونهٔ کامپایل‌شده بود، با یک ماژول باینری برای هر نسخهٔ پایتون و زمان‌اجرای .NET Core 3.1. نسخه 26.10 یک wheel py3-none-<platform> برای هر پلتفرم است، پایتون خالص روی یک زمان‌اجرای توکار .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() را نیز پاسخ می‌دهد.

برچسب‌های پلتفرم به‌روز شده و wheel ویندوز 64‑بیتی

wheel لینوکس با برچسب manylinux_2_27_x86_64 (قدیمی‌ترین glibc که زمان‌اجرای توکار .NET 10 بر روی آن شروع می‌شود) و wheelهای macOS با برچسب‌های macosx_13_0_x86_64 و macosx_13_0_arm64 منتشر می‌شود. دیگر wheel 32‑بیتی ویندوز وجود ندارد. نصب نیاز به 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

دانلود مستقیم

چرخ‌های مخصوص پلتفرم را از صفحهٔ انتشار GroupDocs.Parser for Python via .NET 26.10 دریافت کنید:

منابع