Skip to main content

Axonate eSign SDK

Python SDK for Indian eSign (Digital Signature) Integration

A comprehensive, production-ready Python SDK for integrating Indian Government's eSign service (Digital Signature) into your applications. Supports eSign API v2.1 and v3.3.

Features

✅ PDF Signing - Create placeholder signatures and embed PKCS7 signatures ✅ XML Request Builder - Generate eSign-compliant XML requests ✅ Easy Integration - Simple API, minimal configuration ✅ Type Hints - Full type annotations for better IDE support ✅ Production Ready - Used in production by multiple applications

Installation

pip install axonate-esign-sdk

For XML signing support:

pip install axonate-esign-sdk[xml-signing]

Quick Start

1. Create Placeholder PDF with Signature Field

from esign_sdk import ESignSDK

# Initialize SDK
sdk = ESignSDK()

# Create placeholder PDF with signature field
hash_value = sdk.create_placeholder(
    input_pdf="document.pdf",
    output_pdf="placeholder.pdf",
    signer_name="John Doe",
    reason="Document Approval",
    location="New Delhi",
    page_number=1,
    coordinates=(100, 700, 300, 750)  # (llx, lly, urx, ury)
)

print(f"Document Hash: {hash_value}")

2. Build eSign XML Request

# Build XML request for eSign gateway
xml_request = sdk.build_xml_request(
    asp_id="your_asp_id",
    transaction_id="unique_txn_id",
    document_hash=hash_value,
    document_info="Important Document",
    callback_url="https://your-server.com/callback",
    auth_mode="1"  # OTP-based authentication
)

print(xml_request)

3. Embed Signature After eSign Response

# After receiving eSign gateway response with PKCS7 signature
sdk.embed_signature(
    placeholder_pdf="placeholder.pdf",
    output_pdf="signed.pdf",
    pkcs7_signature="<base64_encoded_pkcs7>",
    field_name="signature_field_1"
)

print("PDF signed successfully!")

Complete Workflow Example

from esign_sdk import ESignSDK
import requests

# Initialize SDK
sdk = ESignSDK()

# Step 1: Create placeholder
hash_value = sdk.create_placeholder(
    input_pdf="contract.pdf",
    output_pdf="contract_placeholder.pdf",
    signer_name="Alice Johnson",
    reason="Contract Signing",
    location="Mumbai"
)

# Step 2: Build XML request
xml_request = sdk.build_xml_request(
    asp_id="mycompany_asp",
    transaction_id="TXN123456",
    document_hash=hash_value,
    document_info="Employment Contract",
    callback_url="https://myapp.com/esign/callback"
)

# Step 3: Post to eSign gateway
response = requests.post(
    "https://demo.esign.digital/esign/2.1/signdoc/",
    data={'esigndoc': xml_request}
)

# Step 4: User completes OTP on eSign portal
# Step 5: Receive callback with PKCS7 signature

# Step 6: Embed signature (in callback handler)
def handle_callback(request_data):
    pkcs7_sig = extract_signature_from_response(request_data)

    sdk.embed_signature(
        placeholder_pdf="contract_placeholder.pdf",
        output_pdf="contract_signed.pdf",
        pkcs7_signature=pkcs7_sig
    )

    return "Signature embedded successfully"

Configuration

ASP Configuration

from esign_sdk import ESignSDK, Config

config = Config(
    asp_id="your_asp_id",
    auth_mode="1",  # 1=OTP, 2=Biometric, 3=Both
    response_sig_type="PKCS7",
    gateway_url="https://demo.esign.digital/esign/2.1/signdoc/"
)

sdk = ESignSDK(config)

PDF Signature Appearance

# Customize signature appearance
hash_value = sdk.create_placeholder(
    input_pdf="document.pdf",
    output_pdf="placeholder.pdf",
    signer_name="Jane Smith",
    reason="Approval",
    location="Delhi",
    page_number=1,
    coordinates=(50, 50, 250, 150),  # Position and size
    lock_pdf=True,  # Lock PDF after signing
    visible=True    # Make signature visible
)

API Reference

ESignSDK Class

Main SDK class for eSign operations.

create_placeholder()

Creates PDF with empty signature field and returns document hash.

Parameters:

  • input_pdf (str): Path to input PDF
  • output_pdf (str): Path for output PDF
  • signer_name (str): Name of signer
  • reason (str): Reason for signing
  • location (str): Location of signing
  • page_number (int, optional): Page number (default: 1)
  • coordinates (tuple, optional): (llx, lly, urx, ury)
  • lock_pdf (bool, optional): Lock PDF after signing
  • visible (bool, optional): Make signature visible

Returns: Document hash (str)

build_xml_request()

Builds eSign-compliant XML request.

Parameters:

  • asp_id (str): ASP ID from eSign provider
  • transaction_id (str): Unique transaction ID
  • document_hash (str): Document hash from create_placeholder()
  • document_info (str): Document description
  • callback_url (str): Webhook URL for response
  • auth_mode (str, optional): Authentication mode (default: "1")
  • ekyc_id (str, optional): Aadhaar number (if required)

Returns: XML request string

embed_signature()

Embeds PKCS7 signature in placeholder PDF.

Parameters:

  • placeholder_pdf (str): Path to placeholder PDF
  • output_pdf (str): Path for signed PDF
  • pkcs7_signature (str): Base64-encoded PKCS7 signature
  • field_name (str, optional): Signature field name

Returns: None

Requirements

  • Python 3.8+
  • PyPDF2 >= 3.0.0
  • reportlab >= 4.0.0
  • lxml >= 4.9.0
  • cryptography >= 41.0.0
  • requests >= 2.31.0

License

MIT License

Copyright (c) 2025 Axonate Tech

Support

For support and queries:

Contributing

Contributions are welcome! Please feel free to submit pull requests.

Changelog

v1.0.0 (2025-01-01)

  • Initial release
  • Support for eSign API v2.1 and v3.3
  • Pure Python implementation
  • PDF placeholder creation
  • XML request building
  • PKCS7 signature embedding

Metadata

Release files for axonate-esign-sdk 1.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for axonate-esign-sdk 1.2.1
File Size Uploaded
axonate_esign_sdk-1.2.1.tar.gz 1.5 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for axonate-esign-sdk 1.2.1
File Interpreter ABI Platform
axonate_esign_sdk-1.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 3.0 MB

Release files / axonate_esign_sdk-1.2.1.tar.gz

Download URL axonate_esign_sdk-1.2.1.tar.gz
Size 1.5 MB
Tags Source
SHA-256 checksum
How to use checksums
00d1a2c69752d4693e8432e73e060ff6415e075877729dac37c4477731f7431e
BLAKE2b-256 checksum
How to use checksums
5ee5946cbc61efb41ddf110cd5960ebfee9d74562a45b8c6f305ba4f7770fe18
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.5

Release files / axonate_esign_sdk-1.2.1-py3-none-any.whl

Download URL axonate_esign_sdk-1.2.1-py3-none-any.whl
Size 1.5 MB
Tags Python 3
SHA-256 checksum
How to use checksums
88db912062b8eb82696d2fe8560dfe16f256fd8c46b3b3ff2a8913e0a1c073c5
BLAKE2b-256 checksum
How to use checksums
7d92ec555be426815c5a4b9c478b90cf83cd4f194970381b2e7d4e027a7e165b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.5

Release history Release notifications | RSS feed

This release

1.2.1 This release

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page