我们很高兴宣布 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 3.5 – 3.14 提供纯 Python 包,取代编译扩展 (PARSERPYTHONNET-30)
  • [Enhancement] 将预览回调传递给 PreviewOptions 时使用普通 Python 函数 (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 对象赋予不存在的属性会抛出 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 版本都有单独的二进制模块,并使用 .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 上可运行的文档示例在 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 在 PyPI 上

pip install groupdocs-parser-net==26.10.0

直接下载

从 GroupDocs.Parser for Python via .NET 26.10 发布页面下载对应平台的 wheel:

资源