如何使用自定义 pdf 创建 Docusign 信封(Python,Django)
How to create a Docusign envelope with a custom pdf (Python, Django)
我的目标是使用 WeasyPrint 创建一个 pdf,并在请求创建信封时将其添加到发送到 Docusign Api 的有效负载中。
这是我的步骤:
- 使用 WeasyPrint 和 return based64 字符串生成 pdf
def generate_envelope_document(document_name: str, context: dict):
content = render_to_string(f"insurance_contracts/{document_name}.html",
context=context)
css = find(f"insurance_contracts/{document_name}.css")
doc = HTML(string=content, media_type="screen").write_pdf(stylesheets=[css],
zoom=0.8)
return base64.b64encode(doc).decode("utf-8")
- 创建我的信封定义:
def create_envelope_definition(envelope_data: dict, context: dict, custom_fields: dict = None):
mandate = Document(
document_base64=generate_envelope_document("name1", context),
name="name1",
file_extension="pdf",
document_id=1,
)
conditions = Document(
document_base64=generate_envelope_document("name2", context),
name="name2",
file_extension="pdf",
document_id=2,
)
signer = Signer(
email=envelope_data["signer_email"],
name=envelope_data["signer_name"],
recipient_id="1",
routing_order="1",
)
signer.tabs = Tabs(
sign_here_tabs=[
SignHere(
anchor_string="Sign",
anchor_units="pixels",
anchor_y_offset="50",
anchor_x_offset_metadata="50",
)
]
)
envelope_definition = EnvelopeDefinition(
status="sent", documents=[mandate, conditions], recipients=Recipients(signers=[signer])
)
if custom_fields:
envelope_definition.custom_fields = CustomFields(
text_custom_fields=[
TextCustomField(name=field_name, value=field_value, required=False)
for field_name, field_value in enumerate(custom_fields)
]
)
return envelope_definition
- 创建一个 Docusign Api 对象:
def get_envelopes_api_client():
"""
Create the docusign api client object
Return EnvelopesApi object
"""
api_client = ApiClient()
api_client.host = settings.DOCUSIGN_BASE_PATH
api_client.set_default_header("Authorization", "Bearer " + get_access_token())
envelope_api = EnvelopesApi(api_client)
return envelope_api
- 创建并发送 Docusign 信封:
envelope_api = get_envelopes_api_client()
try:
envelope = envelope_api.create_envelope(
settings.DOCUSIGN_ACCOUNT_ID, envelope_definition=envelope_definition
)
except ApiException as e:
logger.error(e.body.decode())
return None
return envelope
目前我收到此错误:
{"errorCode":"INVALID_REQUEST_BODY","message":"请求正文丢失或格式不正确。无法从 System.String 转换或转换为 API_REST.Models。 v2_1.propertyMetadata。"}
我不明白我做错了什么。我的信封定义不正确还是我还缺少其他东西。我似乎找不到有关如何执行此操作的官方文档。我发现的只是 [https://developers.docusign.com/docs/esign-rest-api/how-to/send-binary/][1],它不使用 docusign SDK。
欢迎任何帮助。谢谢!
email_subject
需要添加到 envelope_definition
并且具有一定的价值。这是 DocuSign 发出的电子邮件的主题。
document_id="2"
而不是 document_id=2
anchor_x_offset_metadata
不应在此处使用,这可能是您出错的原因。
我的目标是使用 WeasyPrint 创建一个 pdf,并在请求创建信封时将其添加到发送到 Docusign Api 的有效负载中。
这是我的步骤:
- 使用 WeasyPrint 和 return based64 字符串生成 pdf
def generate_envelope_document(document_name: str, context: dict):
content = render_to_string(f"insurance_contracts/{document_name}.html",
context=context)
css = find(f"insurance_contracts/{document_name}.css")
doc = HTML(string=content, media_type="screen").write_pdf(stylesheets=[css],
zoom=0.8)
return base64.b64encode(doc).decode("utf-8")
- 创建我的信封定义:
def create_envelope_definition(envelope_data: dict, context: dict, custom_fields: dict = None):
mandate = Document(
document_base64=generate_envelope_document("name1", context),
name="name1",
file_extension="pdf",
document_id=1,
)
conditions = Document(
document_base64=generate_envelope_document("name2", context),
name="name2",
file_extension="pdf",
document_id=2,
)
signer = Signer(
email=envelope_data["signer_email"],
name=envelope_data["signer_name"],
recipient_id="1",
routing_order="1",
)
signer.tabs = Tabs(
sign_here_tabs=[
SignHere(
anchor_string="Sign",
anchor_units="pixels",
anchor_y_offset="50",
anchor_x_offset_metadata="50",
)
]
)
envelope_definition = EnvelopeDefinition(
status="sent", documents=[mandate, conditions], recipients=Recipients(signers=[signer])
)
if custom_fields:
envelope_definition.custom_fields = CustomFields(
text_custom_fields=[
TextCustomField(name=field_name, value=field_value, required=False)
for field_name, field_value in enumerate(custom_fields)
]
)
return envelope_definition
- 创建一个 Docusign Api 对象:
def get_envelopes_api_client():
"""
Create the docusign api client object
Return EnvelopesApi object
"""
api_client = ApiClient()
api_client.host = settings.DOCUSIGN_BASE_PATH
api_client.set_default_header("Authorization", "Bearer " + get_access_token())
envelope_api = EnvelopesApi(api_client)
return envelope_api
- 创建并发送 Docusign 信封:
envelope_api = get_envelopes_api_client()
try:
envelope = envelope_api.create_envelope(
settings.DOCUSIGN_ACCOUNT_ID, envelope_definition=envelope_definition
)
except ApiException as e:
logger.error(e.body.decode())
return None
return envelope
目前我收到此错误:
{"errorCode":"INVALID_REQUEST_BODY","message":"请求正文丢失或格式不正确。无法从 System.String 转换或转换为 API_REST.Models。 v2_1.propertyMetadata。"}
我不明白我做错了什么。我的信封定义不正确还是我还缺少其他东西。我似乎找不到有关如何执行此操作的官方文档。我发现的只是 [https://developers.docusign.com/docs/esign-rest-api/how-to/send-binary/][1],它不使用 docusign SDK。
欢迎任何帮助。谢谢!
email_subject
需要添加到envelope_definition
并且具有一定的价值。这是 DocuSign 发出的电子邮件的主题。document_id="2"
而不是document_id=2
anchor_x_offset_metadata
不应在此处使用,这可能是您出错的原因。