我们很高兴宣布 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” 错误或缺少
SkiaSharp3.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.ICreatePageStreamgroupdocs.parser.options.IReleasePageStreamgroupdocs.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: