Skip to main content

Generator PDF API

mm-print-generator PDF-api

API (NestJS) para:

  1. Gerar PDF a partir de HTML (retorno em binário ou base64)
  2. Fazer merge de PDFs (lista em base64) (retorno em binário ou base64)

Fluxo interno (funcional)

Geracao de PDF (HTML -> PDF)

  1. Valida entrada e prepara o documento:
    • body é o HTML principal.
    • se header/footer estiverem habilitados, eles sao encapsulados em wrappers <div id="header">...</div> e <div id="footer">...</div>.
    • quando margin existe, os valores sao validados por expressao regular (precisam ser strings com unidade: px, mm, cm, %, etc.).
    • pageSize tem fallback (default a4) e existe um modo thermalPrintResolution que usa dimensoes 80mm x 300mm.
  2. Montagem do HTML final:
    • o HTML final é composto por header (opcional), body (principal) e footer (opcional).
    • se o HTML não tiver “imagem de fundo” detectável, o gerador aplica regras para deixar fundo transparente (reduz artefatos de background; o comportamento fica condicionado por hasImage).
    • quando há indícios de background-image em elementos, o gerador tenta converter para <img ...> com object-fit (para melhorar o print em PDF).
  3. Renderização do documento:
    • o HTML é carregado em uma página do Puppeteer (page.setContent(..., { waitUntil: 'networkidle0' })).
    • puppeteer-report gera o PDF e salva temporariamente em disco; depois o arquivo é lido para montar o Buffer final.
    • a página do Puppeteer usa rotinas auxiliares para:
      • estimar altura real de header/rodape (avaliadores com base em elementos #header e #footer)
      • ajustar margens via regras @page antes de gerar o PDF
      • adicionar header/rodape por número de página (clone e inserção repetida ao longo das páginas)
  4. Marca d'agua (opcional):
    • se watermark for enviada e o body nao indicar background-image (condicao do gerador), a API baixa a imagem via fetch.
    • a imagem e carregada no pdf-lib (png/jpg/jpeg) e desenhada em todas as páginas:
      • isFullPage = true: desenha escalando para cobrir a página
      • isFullPage = false: desenha centralizado com escala limitada
      • opacity controla a trânsparencia (default aproximado 0.3 no pipeline)
  5. Saida:
    • no modo binário, retorna application/pdf com Content-Length e stream do Buffer.
    • no modo base64, converte o Buffer para string base64.

Merge de PDFs (base64[] -> PDF)

  1. Valida a lista:
    • exige pelo menos 2 itens em pdfs
    • cada item precisa ser string (base64)
  2. Carregamento e copia de páginas:
    • para cada PDF base64: converte para Buffer e carrega com pdf-lib.
    • copia todas as páginas do documento carregado para um PDF final (copyPages + addPage).
  3. Saida:
    • no modo binário, retorna o Buffer do PDF mesclado.
    • no modo base64, converte para string base64.

Observacoes de execucao

  • O timeout por requisicao e controlado pelo decorator @SetRequestTimeout(120000) via TimeoutInterceptor.
  • SIZE_LIMIT (env) controla o limite do body JSON (padrao no codigo: 1000mb).
  • Existe HealthMonitor que periodicamente loga CPU/memoria para observabilidade.