如何使用自定义 pdf 创建 Docusign 信封(Python,Django)

How to create a Docusign envelope with a custom pdf (Python, Django)

我的目标是使用 Wea​​syPrint 创建一个 pdf,并在请求创建信封时将其添加到发送到 Docusign Api 的有效负载中。

这是我的步骤:

  1. 使用 Wea​​syPrint 和 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")
  1. 创建我的信封定义:
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
  1. 创建一个 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
  1. 创建并发送 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 不应在此处使用,这可能是您出错的原因。