Pular para o conteúdo principal

Renderização

Geração de documentos HTML e PDF a partir de templates publicados.

Renderizar HTML

POST /api/v1/document-templates/:id/render

Renderiza o template usando a última versão publicada e as variáveis fornecidas.

Request

{
"variables": {
"clientName": "Maria Santos",
"clientCpf": "987.654.321-00",
"loanAmount": 15000,
"installments": 24,
"installmentValue": 750.00,
"hasGuarantor": false
},
"businessId": "loan-12345",
"metadata": {
"source": "mobile-app",
"version": "2.1.0"
}
}
CampoTipoObrigatórioDescrição
variablesobjectSimVariáveis para renderização
businessIdstringNãoID de contexto de negócio (ex: ID do empréstimo)
metadataobjectNãoMetadados adicionais para auditoria

Response

{
"data": {
"type": "rendered-documents",
"id": "rendered-doc-uuid",
"attributes": {
"html": "<h1>Contrato de Empréstimo</h1>\n<p>Eu, Maria Santos, CPF 987.654.321-00, declaro...</p>\n<p>Valor: R$ 15000</p>\n<p>Parcelas: 24x de R$ 750</p>",
"templateId": "550e8400-e29b-41d4-a716-446655440000",
"templateVersionNumber": 3
}
}
}

Renderizar PDF

POST /api/v1/document-templates/:id/render/pdf

Renderiza o template e converte para PDF. Retorna o PDF codificado em base64.

Requisitos

Requer o microserviço pdf-renderer configurado via PDF_RENDERER_URL.

Request

{
"variables": {
"clientName": "Maria Santos",
"clientCpf": "987.654.321-00",
"loanAmount": 15000,
"installments": 24,
"installmentValue": 750.00
},
"businessId": "loan-12345"
}

Response

{
"data": {
"type": "rendered-documents",
"id": "rendered-doc-uuid",
"attributes": {
"templateId": "550e8400-e29b-41d4-a716-446655440000",
"templateVersionNumber": 3,
"outputFormat": "PDF",
"pdfBase64": "JVBERi0xLjQKJeLjz9MKNCAwIG9iago8PAovVHlwZSAvUGFnZQovUGFyZW50..."
}
}
}

Decodificando o PDF

// JavaScript/Node.js
const pdfBuffer = Buffer.from(response.data.attributes.pdfBase64, 'base64');
fs.writeFileSync('contrato.pdf', pdfBuffer);

// Browser
const blob = new Blob(
[Uint8Array.from(atob(pdfBase64), c => c.charCodeAt(0))],
{ type: 'application/pdf' }
);
const url = URL.createObjectURL(blob);
window.open(url);
# Python
import base64

pdf_bytes = base64.b64decode(response['data']['attributes']['pdfBase64'])
with open('contrato.pdf', 'wb') as f:
f.write(pdf_bytes)

Preview

POST /api/v1/document-templates/:id/preview

Renderiza o template para visualização prévia. Diferente do render:

  • Não cria registro de documento renderizado
  • Não valida variáveis obrigatórias (permite preview parcial)
  • Usa o conteúdo atual do template (não apenas versões publicadas)
  • Ideal para desenvolvimento e testes

Request

{
"variables": {
"clientName": "João Teste"
}
}

Se variables não for fornecido, usa o sampleData do template.

Response

{
"data": {
"type": "template-previews",
"attributes": {
"html": "<h1>Contrato de Empréstimo</h1>\n<p>Eu, João Teste, CPF , declaro...</p>"
}
}
}

Validação de Variáveis

A renderização valida todas as variáveis antes de processar o template:

Variáveis Obrigatórias

{
"code": "VALIDATION",
"message": "Required variable 'clientName' is missing",
"statusCode": 400
}

Tipos Incorretos

{
"code": "VALIDATION",
"message": "Variable 'loanAmount' must be a number",
"statusCode": 400
}

Valores Default

Variáveis opcionais com default definido são preenchidas automaticamente:

// Definição
{ "name": "hasGuarantor", "type": "BOOLEAN", "required": false, "default": false }

// Input (sem hasGuarantor)
{ "clientName": "Maria" }

// Resultado: hasGuarantor = false

Histórico de Documentos

Cada renderização (exceto preview) cria um registro em RenderedDocument contendo:

CampoDescrição
idUUID do documento renderizado
templateIdID do template usado
templateVersionNumberVersão exata usada na renderização
inputDataVariáveis fornecidas (para reprodutibilidade)
outputFormatHTML ou PDF
outputHtmlHTML gerado
businessIdContexto de negócio (opcional)
metadataMetadados adicionais
createdAtData/hora da renderização

Isso permite:

  • Auditoria: Saber exatamente o que foi renderizado, quando e com quais dados
  • Reprodutibilidade: Recriar o documento exato usando templateVersionNumber + inputData
  • Compliance: Rastreabilidade para documentos legais

Códigos de Erro

CódigoMensagemDescrição
404Template not foundTemplate não existe ou não pertence à organização
404Template version 'latest' not foundTemplate nunca foi publicado
400Template must be published before renderingTemplate ainda é rascunho
400Required variable 'X' is missingVariável obrigatória não fornecida
400Variable 'X' must be a YTipo de variável incorreto
400PDF rendering is not configuredPDF_RENDERER_URL não definida
500PDF renderer service is unavailableSidecar não está rodando

Exemplos de Uso

Gerar Contrato para Assinatura

// 1. Renderizar PDF
const response = await api.post(`/document-templates/${templateId}/render/pdf`, {
variables: {
clientName: customer.name,
clientCpf: customer.cpf,
loanAmount: loan.amount,
installments: loan.installments,
installmentValue: loan.installmentValue,
},
businessId: loan.id,
});

// 2. Usar com E-Signature
const signatureRequest = await api.post('/e-signature/signature-requests', {
documentBase64: response.data.attributes.pdfBase64,
signers: [{ email: customer.email, name: customer.name }],
});

Preview em Tempo Real (Editor)

// Debounce para não sobrecarregar a API
const debouncedPreview = debounce(async (variables) => {
const response = await api.post(`/document-templates/${templateId}/preview`, {
variables,
});
setPreviewHtml(response.data.attributes.html);
}, 500);

// Atualizar preview conforme usuário edita variáveis
useEffect(() => {
debouncedPreview(formValues);
}, [formValues]);