GroupDocs.Signature for Python 26.1 的新功能 (2026年1月)

ID 类别 摘要
SIGNATURENET‑5528 ✨ 功能 支持图像数字签名及其验证(针对 PNG 和 JPG 的隐写 LSB 嵌入)。
SIGNATURENET‑5445 ✨ 功能 条形码和二维码签名预览的自适应渲染——可显式控制宽度/高度。
SIGNATURENET‑5479 ✨ 功能 支持对条形码和二维码预览图像进行旋转。
SIGNATURENET‑5478 ✨ 功能 新增对 APNG 和 TGA 图像格式的处理,可用于基于图像的签名。
SIGNATURENET‑5500 ⚡ 改进 针对签名搜索和验证的 LINQ 风格查询优化(谓词过滤)。
SIGNATURENET‑5480 ⚡ 改进 支持条形码/二维码预览的背景透明度。
SIGNATURENET‑5477 ⚡ 改进 在具有背景颜色的数字签名中支持覆盖图像(前景图像标志)。
SIGNATURENET‑5422 ⚡ 改进 移除不安全的加密算法(RC2、DES、TripleDES 和弱 AES 模式)。
SIGNATURENET‑5555 🐞 错误修复 修复了在 Linux 上处理 DOC 文件时 GeneratePreview() 的类型初始化器异常。

以下是对最具影响力的更改进行的简短技术演练。

1. 图像数字签名(隐写)

  • 签名隐藏在 PNG/JPG 像素的最低有效位中。
  • 支持密码保护、流兼容,并且适用于任意尺寸 ≥ 8 × 8 像素的图像。

对图像进行签名

import groupdocs.signature as gs
import groupdocs.signature.options as gso

input_file  = "image.png"
output_file = "signed_image.png"
password    = "MySecurePassword123"

# Sign the image
with gs.Signature(input_file) as signature:
    sign_options = gso.ImageDigitalSignOptions()
    sign_options.password = password

    sign_result = signature.sign(output_file, sign_options)

    if sign_result.succeeded and len(sign_result.succeeded) > 0:
        print("Image signed successfully!")
        print(f"Signatures added: {len(sign_result.succeeded)}")

验证已签名的图像

import groupdocs.signature as gs
import groupdocs.signature.options as gso

signed_file = "signed_image.png"
password    = "MySecurePassword123"

with gs.Signature(signed_file) as signature:
    verify_options = gso.ImageDigitalVerifyOptions()
    verify_options.password = password
    verify_options.detection_threshold_percent = 75  # optional 0‑100%

    verify_result = signature.verify(verify_options)

    if verify_result.is_valid:
        print("Digital signature is valid!")
        print(f"Verified signatures: {len(verify_result.succeeded)}")
    else:
        print("Digital signature is invalid or not found.")

高级验证(完整数据提取)

with gs.Signature("signed_image.png") as signature:
    verify_options = gso.ImageDigitalVerifyOptions()
    verify_options.password = "MySecurePassword123"
    verify_options.use_full_data_extraction = True
    verify_options.detection_threshold_percent = 85

    verify_result = signature.verify(verify_options)

    if verify_result.is_valid and verify_options.detected_probability is not None:
        print(f"Signature detected with {verify_options.detected_probability}% probability")

2. 条形码和二维码预览的自适应渲染

开发者现在可以为预览生成指定精确的 width 和 height,消除之前“自动大小”带来的不一致性。

import groupdocs.signature as gs
import groupdocs.signature.options as gso
import uuid

# QR code options
qr_sign_options = gso.QrCodeSignOptions("GROUP DOCS", gs.QrCodeTypes.QR)
qr_sign_options.width  = 250
qr_sign_options.height = 270
qr_sign_options.fore_color = gs.Color.red
qr_sign_options.code_text_alignment = gs.CodeTextAlignment.BELOW
qr_sign_options.text = "GROUP DOCS"

# Preview generation
preview_options = gso.PreviewSignatureOptions(
    qr_sign_options,
    create_signature_stream,   # user‑provided delegate
    release_signature_stream   # user‑provided delegate
)
preview_options.signature_id   = str(uuid.uuid4())
preview_options.preview_format = gso.PreviewSignatureOptions.PreviewFormats.PNG

gs.Signature.generate_signature_preview(preview_options)

3. 条形码和二维码预览的旋转支持

在条形码/二维码选项上设置 rotation_angle(度)即可渲染旋转后的预览。

import groupdocs.signature as gs
import groupdocs.signature.options as gso
import uuid

barcode_sign_options = gso.BarcodeSignOptions("GROUP DOCS", gs.BarcodeTypes.MaxiCode)
barcode_sign_options.width          = 400
barcode_sign_options.height         = 400
barcode_sign_options.fore_color     = gs.Color.red
barcode_sign_options.code_text_alignment = gs.CodeTextAlignment.BELOW
barcode_sign_options.text           = "GROUP DOCS"
barcode_sign_options.rotation_angle = 45   # rotate 45°

preview_options = gso.PreviewSignatureOptions(
    barcode_sign_options,
    create_signature_stream,
    release_signature_stream
)
preview_options.signature_id   = str(uuid.uuid4())
preview_options.preview_format = gso.PreviewSignatureOptions.PreviewFormats.PNG

gs.Signature.generate_signature_preview(preview_options)

4. 新增图像格式支持 – APNG 与 TGA

现在可以将 APNG(动画 PNG)和 TGA(Targa)文件 作为 图像签名使用,插入、预览和验证方式与 PNG/JPG 完全相同。

5. 条形码/二维码预览的背景透明度

在条形码/二维码选项上设置 transparency 属性(0 – 1),即可生成具有透明画布的预览。

barcode_sign_options = gso.BarcodeSignOptions("GROUP DOCS", gs.BarcodeTypes.Codabar)
barcode_sign_options.width  = 400
barcode_sign_options.height = 400
barcode_sign_options.fore_color = gs.Color.red
barcode_sign_options.code_text_alignment = gs.CodeTextAlignment.BELOW
barcode_sign_options.text = "GROUP DOCS"
barcode_sign_options.transparency = 0.5   # 50 % transparent background

preview_options = gso.PreviewSignatureOptions(
    barcode_sign_options,
    create_signature_stream,
    release_signature_stream
)
preview_options.signature_id = str(uuid.uuid4())
preview_options.preview_format = gso.PreviewSignatureOptions.PreviewFormats.PNG

gs.Signature.generate_signature_preview(preview_options)

6. 数字签名的覆盖图像支持

PdfDigitalSignatureAppearance 现在可以同时使用覆盖图像 以及 背景颜色且不会遮挡图像。可通过 SignatureCustomAppearance.IsForegroundImage 控制层次。

import groupdocs.signature as gs
import groupdocs.signature.options as gso

signature_image_path = "signature.png"
certificate_path      = "JohnSmithCertificate.pfx"

input_pdf  = "SampleDocument.pdf"
output_pdf = "SignedDocument.pdf"

with gs.Signature(input_pdf) as signature:
    sign_options = gso.DigitalSignOptions(certificate_path)
    sign_options.password = "1234567890"
    sign_options.reason   = "Document approval"
    sign_options.contact  = "John Smith"
    sign_options.location = "Head Office"

    # Visible signature placement
    sign_options.visible = True
    sign_options.left    = 350
    sign_options.top     = 100
    sign_options.width   = 200
    sign_options.height  = 70
    sign_options.image_file_path = signature_image_path

    appearance = gso.PdfDigitalSignatureAppearance()
    appearance.foreground = gs.Color.from_argb(50, gs.Color.brown)
    appearance.font_family_name = "Times New Roman"
    appearance.font_size = 12
    appearance.background = gs.Color.from_argb(50, gs.Color.light_gray)
    appearance.is_foreground_image = True   # image on top of text

    sign_options.appearance = appearance

    sign_result = signature.sign(output_pdf, sign_options)

    print(f"\nDocument signed successfully with {len(sign_result.succeeded)} signature(s).")
    print(f"Signed file saved at: {output_pdf}")

7. 安全强化 – 移除不安全的算法

RC2、DES、TripleDES 以及弱 AES 模式已从加密栈中 移除。现在仅提供现代的、NIST 认可的算法,提升已签署文档的默认安全姿态。

8. LINQ 风格查询优化

签名的 search 与 verify 现在接受 谓词函数,在进行繁重处理步骤之前过滤签名。此举可降低内存使用并加快批处理操作。

使用谓词进行搜索

import groupdocs.signature as gs
import groupdocs.signature.options as gso
import groupdocs.signature.domain as gsd

with gs.Signature("document.pdf") as signature:
    search_options = [gso.TextSearchOptions()]

    # Keep only text signatures that contain the word "Approved"
    result = signature.search(search_options,
        lambda sig: isinstance(sig, gsd.TextSignature) and "Approved" in sig.text)

    for sig in result.signatures:
        print(f"Found: {sig.text}")

使用谓词进行验证

with gs.Signature("signed_document.pdf") as signature:
    verify_options = gso.TextVerifyOptions("John Smith")

    # Verify only signatures on page 1
    result = signature.verify(verify_options,
        lambda sig: sig.page_number == 1)

    print(f"Found {len(result)} verified signatures on page 1")

9. 修复 Linux 上 DOC 预览崩溃问题

GeneratePreview() 在 Linux 上处理 Microsoft Word(.doc)文件时不再抛出 TypeInitializerException,恢复了跨平台预览功能。


升级说明

pip install --upgrade groupdocs-signature-net

注意: 包名 groupdocs-signature-net 用于 Python‑via‑.NET 包装器。


资源

敬请关注即将发布的版本,并关注官方博客以获取性能技巧和最佳实践指南。