调用envelopesApi时,Docusign Node SDK中的getDocument,返回的数据格式是什么?如何将其写入文件?

shstlldc  于 2023-04-29  发布在  Node.js
关注(0)|答案(4)|浏览(119)

成功登录并从信封中获取文档列表后,我尝试使用DocuSign Node SDK从DocuSign检索签名文档,使用以下代码:

envelopesApi.getDocument(accountId, envelopeId, documents[0].documentId, function(err, data, response) {
  log.info({data: data.substring(0, 100)}, 'getDocument data');
  log.info({response}, 'getDocument response');
  fs.writeFile('/home/martin/downloaded.pdf', data, (err) => {
    next(err);
  });
});

data变量是一个字符串。它不是base64编码的。第一个日志语句(使用Bunyan日志模块)显示字符串以以下字符开头:

%PDF-1.4
%ûüýþ
4 0 obj
<<
/Parent 3 0 R
/Resources 5 0 R
/MediaBox [0.00000 0.00000 595.00000 842.00

因此我可以看到它不是base64编码的。在字符串中保存pdf文件的内容对我来说似乎很奇怪。我期待一个Buffer对象。
当我打开(在Chrome中)此代码保存的文件时,它似乎是一个有效的PDF文件(即。e. Chrome不会错误地说文件已损坏),它有正确的页数,但它完全不可读。页面上根本没有可辨认的文字,这表明有什么东西被损坏了。
从SDK中查看EnvelopesApi.jsApiClient.js文件,我可以看到它正在请求PDF,并且ApiClient中有专门用于处理PDF的代码-这似乎是从可读流中阅读并附加到字符串。
我知道有一种替代方法可以不使用NOde SDK,而直接使用REST API(根据官方REST API Recipe: Getting an Envelope's Document List中的示例),但如果可能的话,我希望使用SDK。
我是否错过了使用这个data参数应该做的事情?

3gtaxfhh

3gtaxfhh1#

请参阅API食谱,在这里下载文档
下面是下载文档的示例代码。

envelopesApi.getDocument(accountId, envelopeId, documentId, function (error, document, response) {
    if (error) {
      console.log('Error: ' + error);
      return;
    }

    if (document) {
      try {
        var fs = require('fs');
        var path = require('path');
        // download the document pdf
        var filename = accountId + '_' + envelopeId + '_' + documentId + '.pdf';
        var tempFile = path.resolve(__dirname, filename);
        fs.writeFile(tempFile, new Buffer(document, 'binary'), function (err) {
          if (err) console.log('Error: ' + err);
        });
        console.log('Document ' + documentId + ' from envelope ' + envelopeId + ' has been downloaded to ' + tempFile);
      } catch (ex) {
        console.log('Exception: ' + ex);
      }
    }
  });
xn1cxnb4

xn1cxnb42#

我们今天遇到了同样的问题,这不是因为Docusign API,而是因为我们使用了Amazon Lambda函数;为了让它工作,我们不得不改变一点我们的无服务器。yml文件并添加一个binaryMediaTypes部分,如下所示:

provider:
  name: aws
  runtime: nodejs12.x
  region: eu-west-3
  profile:xxxxx
  versionFunctions: false
  apiGateway:
    binaryMediaTypes:
      - 'text/html'

希望能有所帮助

dbf7pr2w

dbf7pr2w3#

var https = require('follow-redirects')。https; var fs = require('fs ');

var options = {
        'method': 'GET',
        'hostname': 'demo.docusign.net',
        'path': '/restapi/v2/accounts/{account_id}/envelopes/{envelope_id}/documents/combined',
        'headers': {
          'X-DocuSign-Authentication': ' {"Username": "*******","Password": "******","IntegratorKey": "*******"}'
        },
        'maxRedirects': 20
      };

      var req = https.request(options, function (res) {
        var chunks = [];

        res.on("data", function (chunk) {
          chunks.push(chunk);
        });

        res.on("end", function (chunk) {
          var body = Buffer.concat(chunks);

          var filename = '_combined.pdf';
        var tempFile = filename;
        fs.writeFile(tempFile, Buffer.from(body,"binary"), function (err) {
          if (err) console.log('Error: ' + err);
        });
        console.log('Document from envelope has been downloaded');

        });

        res.on("error", function (error) {
          console.error(error);
        });
      });

      req.end();
mkh04yzy

mkh04yzy4#

调用envelopesApi时。Docusign Node SDK中的getDocument,返回的数据格式是什么?
eSignature NodeJS SDK的getDocument方法默认返回二进制编码的字符串。或者,您可以请求它返回base64编码的字符串。
如何将其写入文件?
如果它是一个二进制编码的字符串,则需要使用Buffer.from(STRING, 'binary')将其解码为原始二进制缓冲区,然后将结果写入内存。如果它是base64编码的字符串,它是一样的,但您使用'base64'代替。
基于Promise的版本:

const fs = require('fs/promises');
const path = require('path');
const { Buffer } = require('buffer');
const docusign = require('docusign-esign');

async function writeDocument(dsApiClient, { accountId, envelopeId, documentId }) {
  try {
    const envelopesApi = new docusign.EnvelopesApi(dsApiClient);
    const binString = await envelopesApi.getDocument(accountId, envelopeId, documentId);
    const filepath = path.resolve(__dirname, `document_${documentId}`);
    await fs.writeFile(filepath, Buffer.from(binString, 'binary'));
  } catch (error) {
    throw new Error('Unable to write document to disk', { cause: error });
  });
}

你可以这样称呼它:

// Initialize DocuSign Api Client
const dsApiClient = new docusign.ApiClient();
dsApiClient.setBasePath(BASE_PATH);
dsApiClient.addDefaultHeader('Authorization', `Bearer ${ACCESS_TOKEN}`);

(async () => {
  try {
    await writeDocument(dsApiClient, { accountId, envelopeId, documentId });
  } catch(error) {
    console.log('Could not save DocuSign document', error);
  }
});

相关问题