Hi, I have the same issue.
Using Nest.js, in my Controller:
@ApiOperation({ summary: 'Cadastra a agenda' })
@ApiBody({ type: AgendaPacienteDto })
@ApiResponse({ status: 201, description: 'Agendamento criado com sucesso' })
@ApiResponse({ status: 400, description: 'Erro ao criar agendamento' })
@Post('agendamento')
@UsePipes(new ValidationPipe({ transform: true }))
async criarAgendamento(
@Body() agendamentoDto: AgendaPacienteDto,
@Res() res: Response,
) {
const pdfBuffer = await this.agendaCidadaoService.criarAgendamento(
agendamentoDto,
);
res.setHeader('Content-Type', 'application/pdf');
res.setHeader(
'Content-Disposition',
'attachment; filename="comprovante.pdf"');
await res.send(pdfBuffer);
}
My Service:
async criarAgendamento(dto: AgendaPacienteDto) {
const dt_nascimento = moment(dto.dt_nascimento, 'YYYY-MM-DD').toDate();
const dt_agendamento = moment(dto.dt_agendamento, 'YYYY-MM-DD').toDate();
try {
const novoAgendamento = new AgendaPaciente();
novoAgendamento.pessoaId = dto.id_paciente;
novoAgendamento.nome = dto.nome;
novoAgendamento.nSus = dto.cns;
novoAgendamento.cpf = dto.cpf;
novoAgendamento.dtNascimento = dt_nascimento;
novoAgendamento.nacionalidade = dto.nacionalidade;
novoAgendamento.estabelecimentoId = dto.estabelecimentoId;
novoAgendamento.local = dto.nome_fantasia;
novoAgendamento.procedimento = dto.procedimento;
novoAgendamento.isAgendamento = dto.isagendamento;
novoAgendamento.medico = dto.nomeProfissional;
novoAgendamento.dtAgendamento = dt_agendamento;
novoAgendamento.profissionalId = dto.idProfissional;
novoAgendamento.horarioAtendimento = dto.horario_atendimento;
novoAgendamento.status = dto.status;
novoAgendamento.motivoCancelamento = dto.motivo_cancelamento;
novoAgendamento.motivoOutro = dto.motivo_outro;
const agendamentoSalvo = await this.agendaPacienteRepository.save(
novoAgendamento,
);
const templatePath = path.join(
__dirname,
'../../../templates/comprovanteAgendamento.hbs',
);
const templateContent = fs.readFileSync(templatePath, 'utf-8');
if (!this.jsreportInitialized) {
await this.jsreportInstance.init();
this.jsreportInitialized = true;
}
const imprime = await this.jsreportInstance.render({
template: {
content: templateContent,
engine: 'handlebars',
recipe: 'chrome-pdf',
},
data: {
teste: 'Desgraçaaaaaaaaaaaaaaaaaaaaaa!',
status: dto.status,
nome: dto.nome,
cpf: dto.cpf,
sus: dto.cns,
dt_nascimento: dto.dt_nascimento,
dt_agendamento: dto.dt_agendamento,
horario: dto.horario_atendimento,
local: dto.nome_fantasia,
endereco: dto.endereco_local,
procedimento: dto.procedimento,
profissional: dto.nomeProfissional,
},
pdf: {
format: 'A4',
margin: {
top: '2.54cm',
bottom: '2.54cm',
left: '1cm',
right: '1cm',
},
},
});
return {
agendamento: agendamentoSalvo,
imprime: await imprime.content,
};
} catch (error) {
throw new Error('Erro ao criar agendamento: ' + error.message);
}
}
Oh, my template I created a simple example to test:
'''<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Relatório</title>
</head>
<body>
<header>
<h1>Teste no template simples</h1>
</header>
<main>
<p>Nome: {{ nome }}</p>
<p>Data de Nascimento: {{ dt_nascimento }}</p>
</main>
</body>
</html>
Generate a Blank PDF.
I created another, using a GET data e works well, like this way.
Can someone help me to fix it?