我們很高興宣布 GroupDocs.Parser for Python v26.10 已於 2026 年 11 月 正式發佈。此版本將底層引擎升級至 26.8,並從 .NET Core 3.1 迁移至 .NET 10.0.14,修復了 System.Security.Cryptography.Pkcs 中的兩個拒絕服務漏洞。它引入了多項重大新功能,包括註解抽取、HTML 表格解析、阿拉伯語與韓語 OCR、Python 日誌記錄器、外部資源處理、以純函式形式的預覽回呼,以及 groupdocs-parser 命令列工具。此 wheel 現已成為純 Python 套件,支援 Python 3.5 – 3.14,平台標籤已更新為 (manylinux_2_27_x86_64, macosx_13_0_*),且移除了 32 位元 Windows wheel。

本次發佈的新增功能

  • [Feature] 新增支援使用 get_annotations() 與 TextOptions.include_annotations 抽取註解 (PARSERPYTHONNET-23)
  • [Feature] 新增 groupdocs-parser 命令列工具 (PARSERPYTHONNET-24)
  • [Feature] 新增支援實作 ILogger 的 Python 日誌記錄器物件 (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] 允許將預覽回呼以純 Python 函式傳遞給 PreviewOptions (PARSERPYTHONNET-31)
  • [Enhancement] 拒絕對 API 物件未知屬性的賦值 (PARSERPYTHONNET-32)
  • [Enhancement] 更新平台標籤至 glibc 2.27 與 macOS 13,並移除 32 位元 Windows wheel (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 日誌記錄器

只要提供具備 trace(message)、warning(message) 與 error(message, exception) 方法的純 Python 物件,即可作為 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 資料夾,無需下載。若要自訂資料夾,可在首次 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>

預覽回呼以純函式形式

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 物件不存在的屬性賦值時,會拋出帶有「Did you mean」提示的 AttributeError。在 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 版本都有一個二進位模組,且使用 .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 個在 25.12 上可運行的 Docs 範例亦能在 26.10 上執行。get_text() 與 get_formatted_text() 仍回傳 str,現在也支援 read_to_end()。

更新平台標籤與 64 位元 Windows wheel

Linux wheel 標籤為 manylinux_2_27_x86_64(嵌入式 .NET 10 執行環境支援的最舊 glibc 版本),macOS wheel 為 macosx_13_0_x86_64 與 macosx_13_0_arm64。已不再提供 32 位元 Windows wheel。安裝時需使用 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 釋出頁面下載各平台專屬的 wheel:

資源