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.2.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.2.0-py3-none-any.whl (1.5 MB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: axonate_esign_sdk-1.2.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.2.0.tar.gz
Algorithm Hash digest
SHA256 0ec2961b5afefb22f7312470e8cffe1674a72000ae47f5df8002b1e168ea796c
MD5 303c439865cf51870cd250e262b45415
BLAKE2b-256 f34bd5276483a4b5237176b28b8f321437f9b438be85d09219e84739b508f2d4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for axonate_esign_sdk-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c6e504836022162bbc00be0ee0cd9adf82e88c894451de0163219afd9d32665c
MD5 e0e743b358f06536421b6dd741649c63
BLAKE2b-256 6db3471b926b6add2aa9174799ac4024eb4ccdf4e97c35235b8b7160f4494972

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