אנחנו שמחים להודיע על שחרור GroupDocs.Parser for Python v26.10, זמין החל מ-נובמבר 2026. שחרור זה משדרג את המנוע הבסיסי לגרסה 26.8 ועובר מ-.NET Core 3.1 ל-.NET 10.0.14, ומתקן שתי פגיעות של שלילת שירות ב-System.Security.Cryptography.Pkcs. הוא מציג תכונות חדשות משמעותיות כולל חילוץ הערות, ניתוח טבלאות HTML, OCR לערבית וקוריאנית, רשם פייתון, טיפול במשאבים חיצוניים, קריאות חוזרות לתצוגה כפונקציות רגילות, וכלי שורת פקודה groupdocs-parser. גלגלת (wheel) היא כעת חבילה טהורה של פייתון המיועדת לפייתון 3.5 – 3.14, עם תגיות פלטפורמה מעודכנות (manylinux_2_27_x86_64, macosx_13_0_*) והסרת גלגלת Windows 32‑ביט.

מה חדש בשחרור זה

  • [תכונה] הוספת תמיכה בחילוץ הערות עם get_annotations() ו-TextOptions.include_annotations (PARSERPYTHONNET-23)
  • [תכונה] הוספת כלי שורת הפקודה groupdocs-parser (PARSERPYTHONNET-24)
  • [תכונה] הוספת תמיכה באובייקט רשם פייתון המיישם ILogger (PARSERPYTHONNET-25)
  • [תכונה] הוספת תמיכה בטיפול בטעינת משאבים חיצוניים מפייתון (PARSERPYTHONNET-26)
  • [תכונה] הוספת OCR לטקסט בערבית וקוריאנית (PARSERPYTHONNET-27)
  • [תכונה] הוספת תמיכה בחילוץ טבלאות ממסמכי HTML (PARSERPYTHONNET-28)
  • [תכונה] הוספת תמיכה ביישום הרישיון ממשתנה הסביבה GROUPDOCS_LIC_PATH (PARSERPYTHONNET-36)
  • [שיפור] עדכון GroupDocs.Parser לגרסה 26.8 והזמן ריצה המוטמע ל-.NET 10.0.14 (PARSERPYTHONNET-29)
  • [שיפור] הפצת חבילה טהורה של פייתון עבור פייתון 3.5 – 3.14 במקום ההרחבה המורכבת (PARSERPYTHONNET-30)
  • [שיפור] העברת קריאות חוזרות לתצוגה (PreviewOptions) כפונקציות פייתון רגילות (PARSERPYTHONNET-31)
  • [שיפור] דחיית השמת ערכים למאפיינים לא ידועים של אובייקטי API (PARSERPYTHONNET-32)
  • [שיפור] עדכון תגיות הפלטפורמה ל‑glibc 2.27 ו‑macOS 13, והסרת גלגלת Windows 32‑ביט (PARSERPYTHONNET-33)
  • [שיפור] הקפת GroupDocsParserException והמחלקות היורשות שלו במקום RuntimeError (PARSERPYTHONNET-34)
  • [שיפור] עדכון System.Security.Cryptography.Pkcs לגרסה 10.0.14, המתקן שתי פגיעות של שלילת שירות (PARSERPYTHONNET-37)
  • [תיקון] חלק ממסמכי Word ו‑RTF נכשלו עם The document appears to be corrupted או עם חוסר במרכיב SkiaSharp 3.119 (PARSERPYTHONNET-35)
  • [תיקון] זיכרון גדל עם כל מסמך שנפתח מ‑BytesIO (PARSERPYTHONNET-38)

שינויים בממשק API ציבורי

  • שגיאות המנוע מעלות GroupDocsParserException, InvalidPasswordException, CorruptedDocumentException או UnsupportedDocumentFormatException מ‑groupdocs.parser.exceptions, בעוד ב‑25.12 הועלה RuntimeError עבור כולן. המחלקות קיימות ב‑25.12, אך לא ירשו מ‑Exception ולא הועלו אף פעם. except Exception תופס את השגיאות משתי הגרסאות.
  • השמת מאפיין לא ידוע מעלה AttributeError.
  • רשימות שהמנוע מחזיר תומכות ב‑len() וב‑אינדקסציה, ורשימה ריקה נחשבת לשקרית.

הוסר

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

שורת פקודה

הגלגלת מתקינה את סקריפט הקונסול 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

רשם פייתון

אובייקט פייתון רגיל עם שיטות 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 MB, לתיקייה 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 עם רמז “Did you mean”. ב‑25.12 הקצאה כזו התקבלה, נשמר מאפיין פייתון בלבד והגדרת המנוע נשארה ללא שינוי.

from groupdocs.parser.options import TextOptions

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

גלגלת אחת עבור פייתון 3.5 – 3.14

ב‑25.12 הייתה הרחבה מורכבת, עם מודול בינארי אחד לכל גרסת פייתון וזמן ריצה של .NET Core 3.1. ב‑26.10 יש גלגלת py3-none-<platform> אחת לכל פלטפורמה, פייתון טהור מעל זמן ריצה מוטמע של .NET 10, והיא מציינת python_requires=">=3.5,<3.15". פייתון 3.14 הוא חדש: ב‑25.12 הוגדר <3.14. רוב הקוד של 25.12 פועל ללא שינוי, וכל 129 דוגמאות של Docs שפעלו ב‑25.12 פועלות ב‑26.10. get_text() ו‑get_formatted_text() עדיין מחזירים str, שעכשיו גם מחזיר read_to_end().

עדכון תגיות פלטפורמה וגלגלת Windows 64‑ביט

גלגלת הלינוקס מתויגת manylinux_2_27_x86_64, הגליבק הישן ביותר שהזמן ריצה המוטמע של .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 ב‑PyPI

pip install groupdocs-parser-net==26.10.0

הורדה ישירה

הורדת גלגלות ספציפיות לפלטפורמה מדף השחרור של GroupDocs.Parser for Python via .NET 26.10:

משאבים