نحن سعداء بالإعلان عن إصدار 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 للغة العربية والكورية، مسجل Python، معالجة الموارد الخارجية، ردود معاينة كدوال عادية، وأداة سطر أوامر groupdocs-parser. الآن العجلة هي حزمة Python صافية تستهدف Python 3.5 – 3.14، مع وسوم منصة محدثة (manylinux_2_27_x86_64, macosx_13_0_*) وإزالة عجلة Windows 32‑بت.

ما الجديد في هذا الإصدار

  • [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 وتحديث وقت التشغيل المدمج إلى .NET 10.0.14 (PARSERPYTHONNET-29)
  • [Enhancement] توفير حزمة Python صافية لـ Python 3.5 – 3.14 بدلاً من الامتداد المترجم (PARSERPYTHONNET-30)
  • [Enhancement] تمرير ردود المعاينة إلى PreviewOptions كدوال Python عادية (PARSERPYTHONNET-31)
  • [Enhancement] رفض تعيينات الخصائص غير المعروفة لكائنات API (PARSERPYTHONNET-32)
  • [Enhancement] تحديث وسوم المنصات إلى glibc 2.27 و macOS 13، وإزالة عجلة Windows 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() و 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))

سطر الأوامر

تُثبت العجلة سكريبت وحدة التحكم 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>

ردود معاينة كدوال عادية

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 كان يقبل التعيين، يخزن خاصية خاصة بـ Python ويترك إعداد المحرك دون تغيير.

from groupdocs.parser.options import TextOptions

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

عجلة واحدة لـ Python 3.5 – 3.14

كان الإصدار 25.12 امتدادًا مُترجمًا، مع وحدة ثنائية واحدة لكل نسخة Python ووقت تشغيل .NET Core 3.1. الإصدار 26.10 هو عجلة py3-none-<platform> واحدة لكل منصة، Python صافي فوق وقت تشغيل .NET 10 مدمج، ويُعلن python_requires=">=3.5,<3.15". Python 3.14 جديد: 25.12 كان يحد بـ <3.14. معظم كود 25.12 يعمل دون تعديل، وجميع أمثلة Docs الـ 129 التي كانت تعمل على 25.12 تعمل الآن على 26.10. لا يزال get_text() و get_formatted_text() يُعيدان str، والآن يدعمان أيضًا read_to_end().

تحديث وسوم المنصات وعجلة Windows 64‑بت

عجلة Linux تحمل الوسم manylinux_2_27_x86_64، أقدم نسخة glibc يبدأ عليها وقت تشغيل .NET 10 المدمج، وعجلات macOS هي macosx_13_0_x86_64 و macosx_13_0_arm64. لم تعد هناك عجلة Windows 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 on PyPI

pip install groupdocs-parser-net==26.10.0

التحميل المباشر

حمّل العجلات الخاصة بالمنصة من صفحة إصدار GroupDocs.Parser for Python via .NET 26.10:

الموارد