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 PDFoutput_pdf(str): Path for output PDFsigner_name(str): Name of signerreason(str): Reason for signinglocation(str): Location of signingpage_number(int, optional): Page number (default: 1)coordinates(tuple, optional): (llx, lly, urx, ury)lock_pdf(bool, optional): Lock PDF after signingvisible(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 providertransaction_id(str): Unique transaction IDdocument_hash(str): Document hash from create_placeholder()document_info(str): Document descriptioncallback_url(str): Webhook URL for responseauth_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 PDFoutput_pdf(str): Path for signed PDFpkcs7_signature(str): Base64-encoded PKCS7 signaturefield_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:
- Email: info@axonatetech.com
- Website: https://axonatetech.com/
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file axonate_esign_sdk-1.1.0.tar.gz.
File metadata
- Download URL: axonate_esign_sdk-1.1.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3d58cdb108ce4ddf1d71a00e9dbcb3d85d0c54b0f4f7f676de7afcf4ee0776e4
|
|
| MD5 |
1ba6024c02504bfbdbff8c61beccd98b
|
|
| BLAKE2b-256 |
873939371c8140a062193e8f983379a74265462ca078a45ccf784927297128e5
|
File details
Details for the file axonate_esign_sdk-1.1.0-py3-none-any.whl.
File metadata
- Download URL: axonate_esign_sdk-1.1.0-py3-none-any.whl
- Upload date:
- Size: 1.5 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
31e8fd7e3df7229b911b954b2ceb940086ba7eb54d71cedde69c38faed524a61
|
|
| MD5 |
711425897e6225d2d76a98a1383d6775
|
|
| BLAKE2b-256 |
82482a00bd8dac7358d553dc5093e578acd2674b84c6f2b977f22697a4a9e968
|