IglanCardeal / generate-and-encrypt-pdf

API para gerar arquivos PDFs a partir de templates HTML estáticos ou com dados dinâmicos usando templates Handlebars. Opcionalmente, pode gerar PDFs protegidos por senha e PDFs em formato Base64 para retornar em JSON.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Gerador de PDFs Seguros

drawing

A partir de arquivos HTML e templates Handlebars

Este projeto tem com intuito de ser uma boa consulta para tomar como base para casos em que é necessário implementar funções para geração de arquivos PDFs com base em templates ou arquivos HTML, no NodeJS.

Índice

  1. Sobre
  2. Endpoints
  3. Detalhes
  4. Bibliotecas e versão do NodeJS
  5. Iniciando o servidor
  6. Autor

Sobre

O projeto possui 3 endpoints de API para gerar arquivos PDF, variando desde PDFs gerados por um template estático de HTML até a geração de PDFs com dados dinâmicos resultando em string no formato Base64. Um dos endpoint permite gerar PDF com dados informados no corpo da requisição e ainda oferecendo a opção de adicionar uma senha ao arquivo gerado.

Um simples servidor HTTP feito em Express foi criado para oferecer os endpoints na porta padrão 3000 e são usadas as seguintes rotas com as devidas funcionalidades:

  • POST /dynamic, para criar um PDF com base em dados fornecidos no corpo da requisição.

  • GET /64, para gerar um PDF protegido em Base64 com dados fixos pré-determinados para exemplo.

  • GET /static, para gerar um PDF com corpo estático.

Endpoints


  • POST /dynamic: recebe um json com campos para serem preenchidos no template que é dinâmico.

    • Body:

      {
        "name": "Cardeal",
        "tool": "NodeJS",
        "location": "Brazil",
        "password": "123",
        "secure": true
      }

      A flag secure recebe um boolean que indica se deve gerar um PDF protegido pela senha informada em password.

      Teremos como saida o PDF com os dados informados: drawing


  • GET /64: retorna um texto em HTML com um link (a) com o atributo href="data:application/pdf;base64,<Base64>" com a string em Base64 para ser clicado e baixado o arquivo PDF.

    Teremos como saida o link para baixar o arquivo:

    drawing

    Opcionalmente, tem um código comentado que pode ser aplicado para ao invés de retornar um link para ser clicado, retornar um JSON com a string Base64 para ser manipulado no front.

    O código em questão:

    res.status(200).json({
      pdf: base64string,
    });

    Teremos como saida o JSON:

    drawing

  • GET /static: retorna um PDF gerado por um template estático em HTML.

    Teremos como saida o PDF:

    drawing

Detalhes

Dentro da pasta src temos os seguintes arquivos com as devidas funções:

  • compiler.js com a função de compilar os dados de um HTML e principalmente do Handlebars, passando os dados dinâmicos e resultando nos dados que serão usados para gerar o PDF.

  • pdf-create-async.js com as funções de gerar de forma assíncrona o PDF e retornar ou um Buffer ou um Stream.

  • encrypt-pdf.js com as funções de encriptar ou não o PDF, dependendo do parâmetro secureOptions e retornar uma string Base64 ou uma resposta em Stream.

  • utils.js com as funções para validar alguns dados de entrada e cachear e servir do cache os dados de um template lido anteriormente.

O fluxo para gerar o PDF é basicamente o mesmo para ambas as rotas, com alguns detalhes menores que diferenciam-as. Temos o seguinte:

sequenceDiagram
    participant Requisição HTTP
    participant Ler o template do sistema de arquivos
    participant Compila o template e gera uma string HTML
    participant Gera o PDF

    Requisição HTTP->>Ler o template do sistema de arquivos: GET ou POST
    Ler o template do sistema de arquivos->>Ler o template do sistema de arquivos: Salva um string Base64 do template em Cache
    Ler o template do sistema de arquivos->>Compila o template e gera uma string HTML: Envia um Buffer do template
    Compila o template e gera uma string HTML->>Gera o PDF: Envia a string HTML para gerar o PDF
    Gera o PDF-->>Requisição HTTP: Retorna um PDF estático, dinâmico, protegido (ou não), em Base64
Loading

Bibliotecas

O projeto usa a versão 14 do NodeJS, logo caso você use uma versão diferente, use o nvm para alterar facilmente a versão do NodeJS.

As principais bibliotecas usadas foram:

  • html-pdf para geração de PDFs a partir de dados de um template.
  • handlebars para renderizar templates no formato .hbs com dados dinâmicos.
  • hummus para criptografar arquivos PDFs.

Iniciando o servidor

Para subir a aplicação e começar os testes, siga o passa-a-passo abaixo:

  1. Clone este repositório com o comando git clone https://github.com/IglanCardeal/generate-and-encrypt-pdf.git
  2. Acesse a pasta do repositório com cd generate-and-encrypt-pdf
  3. Use a versão 14 do NodeJS com o comando nvm use 14
  4. Instale as dependências com o comando yarn >/dev/null
  5. E inicie o servidor com o comando yarn start

Por padrão, o servidor vai subir usando a porta 3000.

Autor

iglan cardeal

Iglan Cardeal

Desenvolvido e mantido por Iglan Cardeal 🔨
Desenvolvedor NodeJS 💻

Entre em contato! 👋🏽
cmtcardeal@outlook.com 📧
LinkedIn Iglan Cardeal
StackOverflow Cmte Cardeal

About

API para gerar arquivos PDFs a partir de templates HTML estáticos ou com dados dinâmicos usando templates Handlebars. Opcionalmente, pode gerar PDFs protegidos por senha e PDFs em formato Base64 para retornar em JSON.

License:MIT License


Languages

Language:JavaScript 85.7%Language:Handlebars 9.4%Language:HTML 4.9%