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' })
      @UsePipes(new ValidationPipe({ transform: true }))
      async criarAgendamento(
        @Body() agendamentoDto: AgendaPacienteDto,
        @Res() res: Response,
      ) {
        const pdfBuffer = await this.agendaCidadaoService.criarAgendamento(
        res.setHeader('Content-Type', 'application/pdf');
          '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
          const templatePath = path.join(
          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">
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <h1>Teste no template simples</h1>
        <p>Nome: {{ nome }}</p>
        <p>Data de Nascimento: {{ dt_nascimento }}</p>

    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}"`);
        return cadastroRealizado.agendamento;

Log in to reply

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