Skip to main content

Pure Python SDK for Indian eSign (Digital Signature) Integration

Project description

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

axonate_esign_sdk-1.0.0.tar.gz (1.5 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

axonate_esign_sdk-1.0.0-py3-none-any.whl (1.5 MB view details)

Uploaded Python 3

File details

Details for the file axonate_esign_sdk-1.0.0.tar.gz.

File metadata

  • Download URL: axonate_esign_sdk-1.0.0.tar.gz
  • Upload date:
  • Size: 1.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.5

File hashes

Hashes for axonate_esign_sdk-1.0.0.tar.gz
Algorithm Hash digest
SHA256 1e77481efdd5167c61be2cd406a6e73f8ec3918c1afc8a04d95f184447c4061b
MD5 0e0566c3da5cf8b2d8999c5f0c0a279c
BLAKE2b-256 9522a9775d648170ef589318ff8c50b7f0127f0cb47538a2e5fd9e63806df3bf

See more details on using hashes here.

File details

Details for the file axonate_esign_sdk-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for axonate_esign_sdk-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 40961ab037fa39e08ab6b2b0ccc413fdfad4058c911d4d43df8b633aedd2e4a4
MD5 ac7d330d3a1984defafa4b6a782df2f1
BLAKE2b-256 824c839ce280dd179db10be61d2589061cdd6198adf39b7fb4fb5c2cf3168c7d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page