Pular para o conteúdo principal

Baixar e listar documentos

Download das versões de um documento​

A partir do momento em que um documento é criado, é possível baixar diferentes versões dele, de acordo com o estágio em que ele se encontra. Utilize a API de Download de Documentos, informando o tipo desejado no parâmetro type:

GET /api/documents/b12cb1b2-5d6e-40b2-a050-097d068c4c11/content?type=Original

Tipos de versão (type)​

typeDescrição
OriginalArquivo original enviado
SignaturesArquivo assinado
PrinterFriendlyVersionVersão para impressão
SigningTagsEtiquetas de assinatura
SignatureMarksMarcas de assinatura
OriginalWithMarksArquivo original com as marcas de assinatura
SignaturesManifestManifesto de assinaturas
Formato de retorno

Existem dois métodos com tipos de retorno diferentes: um retorna uma Stream de dados referente ao documento e o outro retorna o documento em um vetor de bytes[].

Nas bibliotecas cliente:

ClienteO arquivo (GET .../content)Outras formas
C#GetDocumentContentAsync(id, DocumentDownloadTypes), uma StreamGetDocumentContentBytesAsync(id, DocumentDownloadTypes), um DocumentContentModel (Base64); GetDocumentBytesAsync(id, DocumentTicketType), um byte[]
JavagetDocumentContent(id, DocumentDownloadTypes), um InputStreamgetDocumentBytes(id, DocumentTicketType), um byte[]
Node.jsapiDocumentsIdContentGet(id, DocumentDownloadTypes, { responseType: "arraybuffer" }). Sem responseType: "arraybuffer", o axios decodifica o arquivo como texto e o corrompeapiDocumentsIdContentB64Get(id, DocumentDownloadTypes), os bytes em Base64
PHPgetDocumentContent($id, DocumentDownloadTypes::...), o conteúdo do arquivoGetDocumentContentBytesAsync($id, DocumentDownloadTypes::...), o JSON de content-b64, com os bytes em Base64

O DocumentDownloadTypes do cliente PHP 1.4.10 não tem constante para SignaturesManifest. O getDocumentContent põe o tipo na query string como o recebe, então passe o texto "SignaturesManifest".

Quando uma versão não pode ser baixada​

  • Signatures e PrinterFriendlyVersion só existem depois que pelo menos um participante assinou. Para um documento que ninguém assinou ainda, a API responde 422 com o código de erro DocumentHasNoSignatures. Enquanto o documento não está Concluded, Signatures traz as assinaturas coletadas até o momento.
  • Documentos cancelados, expirados ou recusados só podem ser baixados como Original e PrinterFriendlyVersion.

Antes de baixar, consulte o documento com a API de Detalhes do Documento e verifique os campos hasSignature e status, como fazem os exemplos. O formato do erro está em Respostas de erro.

Com uma biblioteca cliente, consulte o documento, verifique o status e então baixe Signatures e PrinterFriendlyVersion:

using Lacuna.Signer.Api;

// 1. Verifique o status
var details = await signerClient.GetDocumentDetailsAsync(documentId);
// details.IsConcluded: o fluxo inteiro terminou
// details.FlowActions[i].Status == ActionStatus.Completed: aquele participante terminou
if (!details.HasSignature)
{
return; // por enquanto só o Original pode ser baixado
}

// 2. Signatures: o arquivo assinado. Não existe para documentos cancelados, recusados ou expirados.
if (details.Status != DocumentStatus.Canceled && details.Status != DocumentStatus.Refused && details.Status != DocumentStatus.Expired)
{
using (var signed = await signerClient.GetDocumentContentAsync(documentId, DocumentDownloadTypes.Signatures))
using (var fileStream = new FileStream("signed.pdf", FileMode.Create, FileAccess.Write))
{
signed.CopyTo(fileStream);
}
}

// 3. PrinterFriendlyVersion: um PDF com as marcas de assinatura e o manifesto de assinaturas
using (var printerFriendly = await signerClient.GetDocumentContentAsync(documentId, DocumentDownloadTypes.PrinterFriendlyVersion))
using (var fileStream = new FileStream("printer-friendly.pdf", FileMode.Create, FileAccess.Write))
{
printerFriendly.CopyTo(fileStream);
}

O cliente é criado como em Criar documentos. Em produção, saiba que um documento mudou pelos webhooks, em vez de fazer polling dos detalhes.

Como cada cliente informa o erro, quando chamado sem a verificação prévia:

  • C#: o GetDocumentContentAsync lança uma SignerApiException.
  • Java: o getDocumentContent lança uma RestUnreachableException para qualquer erro HTTP, sem o código de status nem o código de erro; por isso, consulte o documento antes. Os demais métodos lançam uma RestErrorException, cujos getStatusCode(), getErrorCode() e getErrorMessage() trazem o status e o code e a message do ErrorModel.
  • Node.js: a promise é rejeitada com o erro do axios; error.response.status traz o status e error.response.data, o ErrorModel (com responseType: "arraybuffer", em bytes).
  • PHP: o getDocumentContent não lança exceção, como explica o aviso abaixo.
Cliente PHP

No cliente PHP, getDocumentContent não lança exceção em erros HTTP: ele devolve o corpo da resposta de erro, o JSON do ErrorModel, como se fosse o arquivo. Salvo sem verificação, esse conteúdo vira um "arquivo" que contém o erro. Consulte o documento antes, como descrito acima.

Exemplos no GitHub: C# · Java · PHP · Node.js

Listar documentos​

É possível listar os documentos de acordo com diferentes padrões e necessidades. Os parâmetros disponíveis estão descritos na API de Listagem de Documentos. Entre os tipos de listagem possíveis:

  • Documentos pendentes para um determinado participante
  • Documentos concluídos
  • Listar por pastas
  • Listar por organização

Filtrar por status​

O parâmetro status filtra pelo status do documento: Pending, Paused, Concluded, Refused, Canceled, Expired, PendingOrRefused ou CanceledOrExpired. O valor Pending também traz os documentos pausados. Para listar só os pausados, use Paused.

Filtrar por participante​

Para listar os documentos de um participante, envie dois parâmetros juntos:

ParâmetroDescrição
participantQO texto a pesquisar, por exemplo o CPF ou o e-mail do participante.
participantQueryTypeOnde pesquisar o texto: Name, Identifier, Email ou Phone.

Sem os dois parâmetros, o Signer não filtra por participante. Disponível a partir da versão 3.0.0, o parâmetro participantSituation filtra pela situação da ação do participante:

ValorDocumentos listados
PendingO participante ainda precisa agir, e o documento está em andamento ou pausado.
CompletedO participante já agiu: assinou, aprovou ou recusou.

Sem participantSituation, a listagem traz todas as situações.

GET /api/documents?participantQ=81976153069&participantQueryType=Identifier&participantSituation=Pending

Pastas​

Para listar as pastas da organização da chave de API, use GET /api/folders. O parâmetro q pesquisa pelo nome, e parentId com filterByParent=true lista as subpastas de uma pasta. Para listar os documentos de uma pasta, use o parâmetro folderId em GET /api/documents.

A interface web usa GET /api/folders/search para pesquisar as pastas que o usuário acessa em todas as organizações. Essa rota não aceita chave de API.

Exemplos no GitHub: C# · Java · PHP · Node.js

Ver em Markdown