DocuSign API:当通过标签填充模板的 PDF 表单域时,为什么文本标签会在每个文档的左上角重复出现?

DocuSign API: When populating template's PDF form fields by tag, why do Text tabs get duplicated in the upper-left corner of every document?

我们的团队使用 Docusign Python API 大约一年了,我们一直注意到这个问题,然后消失几周,现在又回来了。每次我们生成一个新模板时,文本选项卡锚定在文档的某处,选项卡就会复制到文档的左上角。生成的文档在第一页的角落有一堆重叠的文本字段,看起来很不专业和凌乱。

这是模板的样子。这两个堆叠在彼此顶部的字段很难看到,因为它们已缩小到最小尺寸,但如果我单击它们,我可以看到它们的选项卡标签与页面上的两个字段匹配(broker_name 和 sign_date).

然后在使用此模板构建的信封的签字仪式上,空白字段会填充数据,并显示在角落里。

我们使用以下代码生成 Tabs 对象:

# Returns a Tabs object with name and date tabs. For envelopes that only contain those two fields.
def generate_name_date_tabs(name, date):
    name = Text(document_id = '1', page_number = '1', recipient_id = '1', value=name, tab_label = 'eh_broker_name')
    date = Text(document_id = '1', page_number = '1', recipient_id = '1', value=date, tab_label = 'eh_sign_date')

    return Tabs(text_tabs=[name, date])

我们在这里生成模板和信封:

def create_application_envelope(destination_email, base64_file_content, signer_name="PlanProvide", signer_tabs=None, is_embedded_signing=False):
    # Create an application envelope
    # docusign_auth.DSClient.login("jwt")
    account_id = session["ds_account_id"]
    envelope_api = docusign_api_handler.get_envelope_api()
    templates_api = docusign_api_handler.get_templates_api()

    access_code = generate_access_code()
    
    signer = Signer(
        email=destination_email,
        name=signer_name,
        recipient_id="1",
        routing_order="1",
        role_name="signer",
        # Use a six-character access code so URL doesn't expire
        access_code=access_code,
        tabs=signer_tabs
    )

    doc = Document(
        document_base64 = base64_file_content,
        name = "Your application generated by PlanProvide",
        file_extension = "pdf",
        document_id = 1,
        # Detect Adobe form field names
        transform_pdf_fields = True
    )
    documents = [doc]
    template_req_object = EnvelopeTemplate(
        documents=documents, email_subject="Please sign this document",
        recipients=Recipients(signers=[signer]),
        description="Template created via the API",
        name="Application Template",
        shared="false",
        status="created"
    )
    try:
        res = templates_api.create_template(account_id=account_id, envelope_template=template_req_object)
    except Exception as e:
        raise DocusignError(e)

    try:
        template_id = res.templates[0].template_id
    except:
        template_id = res.template_id
    envelope_definition = EnvelopeDefinition(
        email_subject="Please sign this document sent from the Python SDK",
        template_id=template_id,
        template_roles=[signer],
        status="sent"  # requests that the envelope be created and sent.
    )
    # Send it to an email
    try:
        results = envelope_api.create_envelope(account_id=account_id, envelope_definition=envelope_definition)
    except Exception as e:
        raise DocusignError(e)

    return {
        "envelope_id": results.envelope_id,
        "access_code": access_code
    }

据我所知,Tabs 对象在创建模板之前仍然只有两个文本字段,所以我不确定为什么会出现重复项。非常感谢有关此问题的任何帮助或想法!

编辑: 这是我们调用 generate_name_date_tabs():

的地方
tabs = docusign_api_handler.generate_name_date_tabs(name, datetime.today().strftime('%m-%d-%y'))

    try:
        resp = application_services.create_application_envelope(
            destination_email,
            base64_file_content,
            signer_name=name,
            signer_tabs=tabs, is_embedded_signing=False)

我想我明白问题了。

您通过提供 tabs 字段来定义 signer 内的选项卡。稍后在代码中,当您创建信封时,您再次在 templateRoles:

中提供相同的 signer
  except:
        template_id = res.template_id
    envelope_definition = EnvelopeDefinition(
        email_subject="Please sign this document sent from the Python SDK",
        template_id=template_id,
        template_roles=[signer],
        status="sent"

我会将 template_roles=[signer] 更改为 templateRoles=[{"email":"email@domain.com", "name": "name", "roleName" : "signer"}] 并更新

signer = Signer(
        recipient_id="1",
        routing_order="1",
        role_name="signer",
        # Use a six-character access code so URL doesn't expire
        access_code=access_code,
        tabs=signer_tabs
    )

不包括姓名和电子邮件。

如果这不起作用,我们需要挖掘一些内容 more.Can 请说明您的电话 generate_name_date_tabs?

您还可以在下面的代码中显示分配给 signer_tabs 的内容吗?

signer = Signer(
        email=destination_email,
        name=signer_name,
        recipient_id="1",
        routing_order="1",
        role_name="signer",
        # Use a six-character access code so URL doesn't expire
        access_code=access_code,
        **tabs=signer_tabs**
    )

如果您发现问题在不同的版本中消失和出现,我很可能是一个错误。让我们知道以上任何一项是否有助于缩小问题范围。

首先,如果你想在签名时使用 date/time,请不要使用 textTab,而是使用 dateSignedTab.那个在文档签名时自动填写date/time。

其次,您使用的是模板。如果您的模板定义了选项卡 - 除了代码中的选项卡之外,它们还会存在。

第三,如果你不提供位置(X/Y坐标)并且没有anchorText,标签将被放置在位置0/0或左上角就像你看到的那样。

所以,正确位置的可能是来自模板,您代码中的那个显示在左上角,因为没有指定位置。