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;
    

Log in to reply
 

Looks like your connection to jsreport forum was lost, please wait while we try to reconnect.