GroupDocs.Signature for Python via .NET 26.10 Release Notes

This release upgrades the GroupDocs.Signature engine from 25.12 to 26.9. The embedded .NET runtime moves from .NET Core 3.1 to .NET 10.0.12. New features include Python-style callbacks for preview streams, logger, data encryption and custom sign hash, and support for Python 3.14. 18 members were renamed to their .NET spelling (z_order → zorder), and assigning an attribute a class does not have now raises AttributeError. Platform wheels now target manylinux_2_27_x86_64 and macosx_12_0_* and the 32-bit Windows wheel is removed.

Breaking change: 18 members were renamed (e.g., options.z_order → options.zorder), so existing code must use the new names. Assigning an attribute that a class does not have now raises AttributeError instead of silently ignoring it. Engine errors that previously raised RuntimeError now raise GroupDocsSignatureException, IncorrectPasswordException or PasswordRequiredException. The wheel platform tags changed to manylinux_2_27_x86_64, macosx_12_0_x86_64 and macosx_12_0_arm64, and the 32-bit Windows wheel was dropped, requiring pip 20.3+ for installation. See API Changes for the full list.

Full List of Changes in This Release

KeyCategorySummary
SIGNATUREPYTHON‑21FeatureAccept Python functions as page and signature preview callbacks
SIGNATUREPYTHON‑22FeatureAccept Python objects as ILogger, IDataEncryption and ICustomSignHash implementations
SIGNATUREPYTHON‑23FeatureAdd support for Python 3.14
SIGNATUREPYTHON‑24EnhancementUpdate GroupDocs.Signature engine from 25.12 to 26.9
SIGNATUREPYTHON‑25EnhancementUpdate the embedded .NET runtime from .NET Core 3.1 to .NET 10.0.12
SIGNATUREPYTHON‑26EnhancementRaise GroupDocsSignatureException, IncorrectPasswordException and PasswordRequiredException instead of RuntimeError
SIGNATUREPYTHON‑27EnhancementRaise AttributeError when code assigns an attribute a class does not have
SIGNATUREPYTHON‑28EnhancementRename members whose Python names split .NET words (z_order → zorder, x_ad_es_type → xad_es_type)
SIGNATUREPYTHON‑29EnhancementChoose overloads by the contents of a list, and pass datetime and Decimal values to .NET unchanged
SIGNATUREPYTHON‑30EnhancementUpdate wheel platform tags to manylinux_2_27 and macosx_12_0, and drop the 32-bit Windows wheel
SIGNATUREPYTHON‑31FixThe Linux wheel cannot be imported on current distributions
SIGNATUREPYTHON‑32FixGROUPDOCS_LIC_PATH is ignored

Major Features

Preview generation with Python callbacks

PreviewOptions can now be constructed with plain Python functions. The create callback receives a page_data object and must return a writable stream (file object or io.BytesIO). The release callback is called after the image is written and receives the same page_data and stream. In 26.1 this raised the error "type has no available constructor" because the class could not be instantiated from Python.

from groupdocs.signature import Signature
from groupdocs.signature.options import PreviewOptions

def create_page_stream(page_data):
    return open(f"page-{page_data.page_number}.png", "wb")

def release_page_stream(page_data, page_stream):
    page_stream.close()

with Signature("document.pdf") as signature:
    signature.generate_preview(PreviewOptions(create_page_stream, release_page_stream))

Python objects as logger, encryption, and custom hash callbacks

Plain Python objects can now implement the ILogger, IDataEncryption, and ICustomSignHash interfaces. A logger object with trace, warning, and error methods can be passed to SignatureSettings. An encryption object with encode and decode methods can be assigned to options.data_encryption on QR-code or metadata signatures. A custom hash signer can be a function or an object with a custom_sign_hash method and is used by DigitalSignOptions.custom_sign_hash. Previously these callbacks were unavailable from Python.

import base64

from groupdocs.signature import Signature, SignatureSettings
from groupdocs.signature.options import QrCodeSignOptions


class SimpleLogger:
    def trace(self, message):
        print("TRACE:", message)

    def warning(self, message):
        print("WARN:", message)

    def error(self, message, exception=None):
        print("ERROR:", message, exception)


class Base64Encryption:
    def encode(self, source):
        return base64.b64encode(source.encode()).decode()

    def decode(self, source):
        return base64.b64decode(source).decode()


options = QrCodeSignOptions("Private text")
options.data_encryption = Base64Encryption()

with Signature("document.pdf", SignatureSettings(logger=SimpleLogger())) as signature:
    signature.sign("signed.pdf", options)

Support for Python 3.14

The wheel now declares python_requires=">=3.5,<3.15" and a single wheel per platform covers Python 3.5 – 3.14. In 26.1 the wheel declared <3.14, so pip install failed on Python 3.14. No code changes are required; the same import and usage work on the newer interpreter.

Updated platform tags and 64-bit Windows wheel

Wheel platform tags have been updated to manylinux_2_27 for Linux and macosx_12_0 for macOS, reflecting the oldest OS versions the embedded runtime supports. The 32-bit Windows wheel has been removed; only an x64 Windows wheel is provided. Installing therefore requires pip 20.3 or newer. No code changes are needed; the package can be installed on the supported platforms as before.

API Changes

Upgraders need to adjust to renamed members, new exception types, and the updated platform tags. Attribute assignments now raise AttributeError and callbacks can be plain Python callables.

New classes and members

  • groupdocs.signature: ProcessCompleteEventHandler, ProcessProgressEventHandler, ProcessStartEventHandler.
  • groupdocs.signature.domain: OoxmlCompliance.
  • groupdocs.signature.options: CreateSignatureStream, ReleaseSignatureStream, PreviewOptions.CreateDocPageStream, PreviewOptions.ReleaseDocPageStream, PreviewOptions.PreviewFormats, PreviewSignatureOptions.PreviewFormats.
  • ConsoleLogger: error().
  • DigitalSignOptions: allow_expired, allow_not_yet_valid.
  • DigitalSignature: certificate_store_location, certificate_store_name.
  • FileLogger: error().
  • ILogger: error().
  • ImageSignOptions: dispose().
  • LoadOptions: skip_external_resources, whitelisted_resources.
  • Mailmark2D: class_.
  • MetadataSignatureCollection: append(), get().
  • PreviewOptions: a constructor; it had none.
  • PreviewSignatureOptions: a constructor; it had none.
  • SearchResult: get_enumerator(), to_list().
  • Signature: dispose().
  • SignatureSettings: default_culture.
  • WordProcessingSaveOptions: ooxml_compliance.

Renamed

ClassOld nameNew name
BarcodeTypesDATA_LOGIC_2OF_5DATA_LOGIC_2OF5
BarcodeTypesGS1_CODE_128GS1_CODE128
BarcodeTypesGS1_MICRO_PDF_417GS1_MICRO_PDF417
BarcodeTypesIATA2OF_5IATA2OF5
BarcodeTypesINTERLEAVED_2OF_5INTERLEAVED_2OF5
BarcodeTypesMATRIX_2OF_5MATRIX_2OF5
BarcodeTypesSTANDARD_2OF_5STANDARD_2OF5
BarcodeTypesUPCA_GS_1_CODE_128_COUPONUPCA_GS1_CODE_128_COUPON
BarcodeTypesUPCA_GS_1_DATABAR_COUPONUPCA_GS1_DATABAR_COUPON
DigitalSignaturex_ad_es_typexad_es_type
FileTypeG_ZIPGZIP
FileTypeL_ZIPLZIP
XAdESTypeX_AD_ESXAD_ES
DigitalSignOptionsx_ad_es_typexad_es_type
JpegCompressionColorModeY_CB_CRYCB_CR
SignOptionsz_orderzorder
PdfTextAnnotationAppearanceh_corner_radiushcorner_radius
PdfTextAnnotationAppearancev_corner_radiusvcorner_radius

Fixed

  • The Linux wheel cannot be imported on current distributions (SIGNATUREPYTHON‑31). Importing groupdocs.signature on Linux raised version 'GLIBC_2.38' not found (Debian 12) or Couldn't find a valid ICU package (Debian 13) because the 26.1 extension required glibc 2.38 and its embedded .NET Core 3.1 does not recognise current ICU versions. The 26.10 release ships a manylinux_2_27 wheel with the .NET 10 runtime, which runs on glibc 2.27+ with any ICU version, so the module now imports and boots on current Linux distributions.
  • GROUPDOCS_LIC_PATH is ignored (SIGNATUREPYTHON‑32). GROUPDOCS_LIC_PATH was ignored, so runs without License().set_license() stayed in evaluation mode. In 26.10 the variable is read at import and the license file or URL is applied automatically, enabling full functionality without extra code.

Known Issues

  • Without ICU the process aborts on the first engine call with Couldn't find a valid ICU package, and no Python exception is raised. Install ICU (apt-get install libicu-dev, any version) and do not set DOTNET_SYSTEM_GLOBALIZATION_INVARIANT.
  • On Linux and macOS, stamp and text-as-image signatures, barcode, QR code and image signatures with a border or transparency, every signature on PowerPoint and image files, and text and stamp signature previews need libgdiplus; without it they fail with The type initializer for 'Gdip' threw an exception. Install it with apt-get install libgdiplus or brew install mono-libgdiplus.
  • On Linux, PDF text and digital signatures with the default fonts fail with Font Times New Roman was not found or Font Arial was not found unless the Microsoft core fonts are installed (apt-get install ttf-mscorefonts-installer, then fc-cache -f); Liberation and other substitutes are not used.
  • On macOS, a stale system copy of libSkiaSharp.dylib in /usr/local/lib can shadow the bundled one and cause DllNotFoundException: libSkiaSharp. Rename it, e.g. sudo mv /usr/local/lib/libSkiaSharp.dylib /usr/local/lib/libSkiaSharp.dylib.bak.
  • With pip older than 20.3, or on Linux older than glibc 2.27 or macOS older than 12, pip cannot use the 26.10 wheels: an unpinned pip install groupdocs-signature-net falls back to 26.1, and a pinned one finds no matching distribution. Upgrade pip with python -m pip install --upgrade pip.
  • Passing a single SearchOptions object to search() returns a plain list; to get a SearchResult with .signatures pass a list of options (search([options])).

Requirements

  • Python 3.5 – 3.14 (python_requires = ">=3.5,<3.15") and pip 20.3 or newer
  • Linux x64 with glibc 2.27 or newer; macOS 12 or newer, Intel or Apple Silicon. On an Intel Mac, a Python built against a pre-11 macOS SDK reports the system as macOS 10.16 — use pip 24.1 or newer there, or SYSTEM_VERSION_COMPAT=0 pip install groupdocs-signature-net
  • Windows: no additional packages
  • Linux: ICU, fontconfig, libgdiplus and fonts — apt-get install libicu-dev libfontconfig1 libgdiplus ttf-mscorefonts-installer (on Debian, enable the contrib component first). libgdiplus: stamp and text-as-image signatures, barcode/QR/image signatures with a border or transparency, every signature on PowerPoint and image files, and text/stamp signature previews. The Microsoft core fonts: PDF text and digital signatures, whose default fonts are Times New Roman and Arial (Liberation substitutes are not picked up).
  • The .NET 10.0.12 runtime is embedded in the wheel; no separate install is needed

Wheel Distribution

PlatformWheel
Windows x64groupdocs_signature_net-26.10.0-py3-none-win_amd64.whl
Linux x64groupdocs_signature_net-26.10.0-py3-none-manylinux_2_27_x86_64.whl
macOS Intelgroupdocs_signature_net-26.10.0-py3-none-macosx_12_0_x86_64.whl
macOS Apple Silicongroupdocs_signature_net-26.10.0-py3-none-macosx_12_0_arm64.whl
pip install groupdocs-signature-net==26.10.0

Additional Resources

Feedback

Questions and issues are welcome on the GroupDocs.Signature forum.