Установить заполнитель подписи в существующем файле PDF

У меня есть pdf-файл. Есть ли способ установить заполнитель подписи с помощью docusign в этом файле PDF?

Я не уверен, что здесь не так. поэтому я добавляю здесь полный код. Это не позволяет мне сохранить, поэтому добавьте еще немного текста.

public static EnvelopeDefinition MakeEnvelope(string signerEmail, string signerName, string signerClientId, string docPdf)
{
    byte[] buffer = System.IO.File.ReadAllBytes(docPdf);

    EnvelopeDefinition envelopeDefinition = new EnvelopeDefinition();
    envelopeDefinition.EmailSubject = "Please sign this document";
    Document doc1 = new Document();

    string doc1b64 = Convert.ToBase64String(buffer);

    doc1.DocumentBase64 = doc1b64;
    doc1.Name = "Lorem Ipsum"; // can be different from actual file name
    doc1.FileExtension = "pdf";
    doc1.DocumentId = "3";

    envelopeDefinition.Documents = new List<Document> { doc1 };

    Signer signer1 = new Signer
    {
        Email = signerEmail,
        Name = signerName,
        ClientUserId = signerClientId,
        RecipientId = "1",
    };

    SignHere signHere1 = new SignHere
    {
        AnchorString = "/sn1/",
        AnchorUnits = "pixels",
        AnchorXOffset = "10",
        AnchorYOffset = "20",
    };

    Tabs signer1Tabs = new Tabs
    {
        SignHereTabs = new List<SignHere> { signHere1 },
    };
    signer1.Tabs = signer1Tabs;

    Recipients recipients = new Recipients
    {
        Signers = new List<Signer> { signer1 },
    };
    envelopeDefinition.Recipients = recipients;

    envelopeDefinition.Status = "sent";

    return envelopeDefinition;
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, конечно, конечно. Вот статья, показывающая, как это сделать, и вот соответствующий код C#:

https://developers.docusign.com/docs/esign-rest-api/how-to/request-signature-email-remote/

EnvelopeDefinition env = new EnvelopeDefinition();
env.EmailSubject = "Please sign this document set";

// Create document objects, one per document
Document doc1 = new Document();
string b64 = Convert.ToBase64String(Document1(signerEmail, signerName, ccEmail, ccName));
doc1.DocumentBase64 = b64;
doc1.Name = "Order acknowledgement"; // can be different from actual file name
doc1.FileExtension = "html"; // Source data format. Signed docs are always pdf.
doc1.DocumentId = "1"; // a label used to reference the doc
Document doc2 = new Document
{
    DocumentBase64 = doc2DocxBytes,
    Name = "Battle Plan", // can be different from actual file name
    FileExtension = "docx",
    DocumentId = "2",
};
Document doc3 = new Document
{
    DocumentBase64 = doc3PdfBytes,
    Name = "Lorem Ipsum", // can be different from actual file name
    FileExtension = "pdf",
    DocumentId = "3",
};

// The order in the docs array determines the order in the envelope
env.Documents = new List<Document> { doc1, doc2, doc3 };

// create a signer recipient to sign the document, identified by name and email
// We're setting the parameters via the object creation
Signer signer1 = new Signer
{
    Email = signerEmail,
    Name = signerName,
    RecipientId = "1",
    RoutingOrder = "1",
};

// routingOrder (lower means earlier) determines the order of deliveries
// to the recipients. Parallel routing order is supported by using the
// same integer as the order for two or more recipients.

// create a cc recipient to receive a copy of the documents, identified by name and email
// We're setting the parameters via setters
CarbonCopy cc1 = new CarbonCopy
{
    Email = ccEmail,
    Name = ccName,
    RecipientId = "2",
    RoutingOrder = "2",
};

// Create signHere fields (also known as tabs) on the documents,
// We're using anchor (autoPlace) positioning
//
// The DocuSign platform searches throughout your envelope's
// documents for matching anchor strings. So the
// signHere2 tab will be used in both document 2 and 3 since they
// use the same anchor string for their "signer 1" tabs.
SignHere signHere1 = new SignHere
{
    AnchorString = "**signature_1**",
    AnchorUnits = "pixels",
    AnchorYOffset = "10",
    AnchorXOffset = "20",
};

SignHere signHere2 = new SignHere
{
    AnchorString = "/sn1/",
    AnchorUnits = "pixels",
    AnchorYOffset = "10",
    AnchorXOffset = "20",
};

// Tabs are set per recipient / signer
Tabs signer1Tabs = new Tabs
{
    SignHereTabs = new List<SignHere> { signHere1, signHere2 },
};
signer1.Tabs = signer1Tabs;

// Add the recipients to the envelope object
Recipients recipients = new Recipients
{
    Signers = new List<Signer> { signer1 },
    CarbonCopies = new List<CarbonCopy> { cc1 },
};
env.Recipients = recipients;

// Request that the envelope be sent by setting |status| to "sent".
// To request that the envelope be created as a draft, set to "created"
env.Status = envStatus;

return env;

Должен ли я добавить все Signhere

Sami In 12.07.2023 18:12

Я добавил свой код, о котором идет речь.. не могли бы вы проверить его, почему до сих пор не отображается заполнитель подписи?

Sami In 12.07.2023 18:19

Я не вижу твой код, только мой

Inbar Gazit 12.07.2023 18:25

Пожалуйста, проверьте сейчас

Sami In 12.07.2023 18:29

@Gazit, теперь он виден вам .. Кроме того, я использую встроенную сеть, поэтому мне не нужно отправлять электронное письмо только для того, чтобы обновить вас.

Sami In 12.07.2023 18:46

AnchorString = "/sn1/" является проблемой

Inbar Gazit 12.07.2023 19:18

У вас есть /sn1/ в вашем документе? возможно нет

Inbar Gazit 12.07.2023 19:18

Два варианта исправления: либо вы найдете текст в своем документе, где вы хотите, чтобы подпись отображалась, либо замените AnchorString = "/sn1/", на AnchorString = "{TEXT}", каким бы ни был ваш {TEXT}.

Inbar Gazit 12.07.2023 19:18

Или вы можете использовать фиксированное позиционирование следующим образом:

Inbar Gazit 12.07.2023 19:18

SignHere signHere = новый SignHere(); signHere.DocumentId = "1"; signHere.PageNumber = "1"; signHere.XPosition = "191"; signHere.YPosition = "148";

Inbar Gazit 12.07.2023 19:19

Теперь это работает. Большое спасибо за вашу помощь.

Sami In 12.07.2023 20:02

Мне нужна ваша еще одна помощь. Теперь, как только пользователь подпишет документ. Теперь, если я хочу получить URL-адрес этого подписанного файла, есть ли способ для этого?

Sami In 12.07.2023 20:21

да, но вам нужен URL-адрес или вы хотите загрузить подписанный DOC?

Inbar Gazit 12.07.2023 20:47

Вы можете сгенерировать URL-адрес так же, как и для подписи, просто нужно сделать это снова, нельзя использовать тот же URL-адрес.

Inbar Gazit 12.07.2023 20:47

Я хочу, чтобы после того, как пользователь подписал этот PDF-файл, он не смог подписать его снова. Теперь этот подписанный PDF-файл я хочу показать пользователю на другой странице.. поэтому, если я могу получить этот подписанный URL-адрес PDF, то на этой другой странице я могу напрямую показывать..

Sami In 12.07.2023 20:49

Дайте мне знать, если я хочу загрузить этот документ, как я могу это сделать?

Sami In 12.07.2023 21:28

Попробуйте то, что я предложил, и посмотрите, как это работает

Inbar Gazit 12.07.2023 22:26

Я пробовал этот код, чтобы получить информацию о конверте var apiClient = new ApiClient(basePath); apiClient.Configuration.DefaultHeader.Add("Authorization", "Bearer " + accessToken.access_token); var envelopesApi = new EnvelopesApi(apiClient); Envelope results = envelopesApi.GetEnvelope(clientId, "79846551-a551-4da6-87cd-589772318f9e");, но получаю эту ошибку Error calling GetEnvelope: {"errorCode":"PARTNER_AUTHENTICATION_FAILED","message":"The specified Integrator Key was not found or is disabled. Invalid account specified for user."}

Sami In 12.07.2023 23:37

Как вы получили токен доступа? и было ли это из той же учетной записи, что и конвертИд здесь?

Inbar Gazit 12.07.2023 23:44

clientId неверен, он должен быть accountId (в вызове GetEnvelope())

Inbar Gazit 12.07.2023 23:44

ОК .. Я изменю его .. Также у меня есть еще один вопрос, поскольку вы знаете, что я отобразил этот URL-адрес входа в iframe .. так что он работает нормально .. Но теперь, когда пользователь входит в pdf и нажимает кнопку «Готово», я хочу чтобы закрыть этот модальный iframe. Поскольку кнопка «Готово» перенаправляет обратно на URL-адрес перенаправления, так как я могу закрыть этот модальный модуль вместо перенаправления.. Спасибо

Sami In 12.07.2023 23:53

Вы перенаправляете на свою собственную страницу с кодом JavaScript, чтобы закрыть модальное окно внутри этой страницы...

Inbar Gazit 13.07.2023 00:57

Я делаю это, но в Iframe открывается тот же URL-адрес. Я не знаю, как закрыть этот модальный режим. Не могли бы вы дать мне какое-нибудь руководство или пример этого.

Sami In 13.07.2023 13:08

вы используете window.close();? а он не закрывается? вы получаете ошибку?

Inbar Gazit 13.07.2023 18:05

Привет .. Мне удается скрыть это всплывающее окно .. но теперь я столкнулся с одной проблемой .. это похоже на pdf в подписи, он показывает все старые подписи, сделанные пользователями .. Я имею в виду, если я подписал pdf, а затем для другой компании я Я отправляю другой pdf-файл, а затем также в этом pdf-файле, который ранее знак показывает этому новому пользователю. Я добавил изображение, о котором идет речь, для вашей справки. Так что я хочу, чтобы каждый раз, когда когда-либо новый пользователь открывал поле подписи pdf, не должно быть старый знак.. Пожалуйста, дайте мне знать, как я могу это сделать.. Большое спасибо, братан..

Sami In 13.07.2023 23:47

Другие вопросы по теме