Render empty pdf in Nest.js
-
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?
-
Well, are two returns in my service. I resolved to change my controller:
const fileName = 'comprovante.pdf'; res.setHeader('Content-Type', 'application/pdf'); res.setHeader('Content-Disposition', `attachment; filename="${fileName}"`); res.send(cadastroRealizado.imprime); return cadastroRealizado.agendamento;