Generator PDF API
mm-print-generator PDF-api
API (NestJS) para:
- Gerar PDF a partir de HTML (retorno em binário ou base64)
- Fazer merge de PDFs (lista em base64) (retorno em binário ou base64)
Fluxo interno (funcional)
Geracao de PDF (HTML -> PDF)
- Valida entrada e prepara o documento:
bodyé o HTML principal.- se
header/footerestiverem habilitados, eles sao encapsulados em wrappers<div id="header">...</div>e<div id="footer">...</div>. - quando
marginexiste, os valores sao validados por expressao regular (precisam ser strings com unidade:px,mm,cm,%, etc.). pageSizetem fallback (defaulta4) e existe um modothermalPrintResolutionque usa dimensoes80mm x 300mm.
- Montagem do HTML final:
- o HTML final é composto por
header(opcional),body(principal) efooter(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 ...>comobject-fit(para melhorar o print em PDF).
- o HTML final é composto por
- Renderização do documento:
- o HTML é carregado em uma página do Puppeteer (
page.setContent(..., { waitUntil: 'networkidle0' })). puppeteer-reportgera o PDF e salva temporariamente em disco; depois o arquivo é lido para montar oBufferfinal.- a página do Puppeteer usa rotinas auxiliares para:
- estimar altura real de header/rodape (avaliadores com base em elementos
#headere#footer) - ajustar margens via regras
@pageantes de gerar o PDF - adicionar header/rodape por número de página (clone e inserção repetida ao longo das páginas)
- estimar altura real de header/rodape (avaliadores com base em elementos
- o HTML é carregado em uma página do Puppeteer (
- Marca d'agua (opcional):
- se
watermarkfor enviada e obodynao indicar background-image (condicao do gerador), a API baixa a imagem viafetch. - 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áginaisFullPage = false: desenha centralizado com escala limitadaopacitycontrola a trânsparencia (default aproximado0.3no pipeline)
- se
- Saida:
- no modo binário, retorna
application/pdfcomContent-Lengthe stream doBuffer. - no modo base64, converte o
Bufferpara string base64.
- no modo binário, retorna
Merge de PDFs (base64[] -> PDF)
- Valida a lista:
- exige pelo menos 2 itens em
pdfs - cada item precisa ser
string(base64)
- exige pelo menos 2 itens em
- Carregamento e copia de páginas:
- para cada PDF base64: converte para
Buffere carrega compdf-lib. - copia todas as páginas do documento carregado para um
PDFfinal (copyPages+addPage).
- para cada PDF base64: converte para
- Saida:
- no modo binário, retorna o
Bufferdo PDF mesclado. - no modo base64, converte para string base64.
- no modo binário, retorna o
Observacoes de execucao
- O timeout por requisicao e controlado pelo decorator
@SetRequestTimeout(120000)viaTimeoutInterceptor. SIZE_LIMIT(env) controla o limite do body JSON (padrao no codigo:1000mb).- Existe
HealthMonitorque periodicamente loga CPU/memoria para observabilidade.