Rafael Camargo

Como transformar HTML em imagem facilmente via NodeJS ou via Browser

Se você alguma vez já pensou em transformar um trecho de HTML em uma imagem, saiba que isso é sim possível. Não só é possível, como pode ser feito tanto no servidor quanto no próprio browser.

NodeJS

Para gerar uma imagem a partir de um trecho HTML no servidor, você precisará adicionar ao seu projeto uma biblioteca chamada Puppeteer.

O Puppeteer é uma biblioteca Node.js que permite o controle do Chrome ou Chromium de forma automatizada e sem que seja necessário abrir a janela do navegador (headless). Você pode usá-lo para automatizar tarefas na web como fazer screenshots, gerar PDFs, e interagir com sites dinâmicos baseados em JavaScript, dos quais seria impossível obter o conteúdo através de um simples requisição HTTP.

npm install puppeteer

Uma vez instalada a biblioteca, você precisará:

  1. Inicializar um browser.
  2. Criar uma nova página.
  3. Definir o conteúdo HTML para a página criada.
  4. Transformar o HTML da página em imagem (screenshot).
  5. Encerrar o browser.
const puppeteer = require('puppeteer');

async function init(){
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  const htmlContent = `
    <html>
    <body>
      <h1>Hello world!</h1>
    </body>
    </html>
  `;
  await page.setContent(htmlContent);
  await page.screenshot({
    path: 'imagem.png',
    fullPage: true
  });
  await browser.close();
}

init();

Caso você queira gerar uma imagem contendo apenas um pedaço da página, ou queira gerar uma imagem num formato que não seja PNG, o método page.screenshot possui alguma opções que permitem personalizar o resultado:

await page.screenshot({
  path: String,                      // Local onde a imagem será salva
  type: 'png' || 'jpeg' || 'webp',   // Formato da imagem (padrão: 'png')
  quality: Number,                   // Qualidade JPEG/WebP (0-100)
  fullPage: Boolean,                 // Captura toda a página (padrão: false)
  clip: {                            // Captura uma região da página
    x: Number,                       // Coordenada X
    y: Number,                       // Coordenada Y
    width: Number,                   // Largura da região capturada
    height: Number,                  // Altura da região capturada
  },
  omitBackground: Boolean,           // Remove o fundo (padrão: false)
  encoding: 'binary' || 'base64',    // Formato dos dados (padrão: 'binary')
  captureBeyondViewport: Boolean,    // Captura além da dobra da página (padrão: true)
  optimizeForSpeed: Boolean,         // Acelera a conversão (padrão: false)
});

OBS: A versão do Puppeteer usada neste post é a 24.2.1.

Browser

Se no servidor foi necessário instalar a biblioteca Puppeteer, no Browser precisaremos da ajuda da biblioteca html2canvas.

Você pode instalar a biblioteca via NPM:

npm install html2canvas

Ou pode baixar a biblioteca de uma CDN diretamente no HTML da sua página web:

<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>

Baseada num processo bem mais simples que o utilizado no browser, a biblioteca html2canvas apenas transforma um trecho de código HTML em um canvas de maneira assíncrona. Assim que a transformação é concluída, basta converter o canvas para imagem e disparar o processo de download da imagem.

function htmlToImage(elementId) {
  html2canvas(document.getElementById(elementId))
    .then(canvas => {
      const img = canvas.toDataURL('image/png');
      let link = document.createElement('a');
      link.href = img;
      link.download = 'imagem.png';
      link.click();
    });
}

Convertendo HTML para imagem no browser

Mão na massa: Neste Gist você encontra, em um único arquivo HTML, todo o código necessário para rodar localmente o exemplo apresentado no vídeo acima. Já neste repositório, você encontra o código necessário para converter HTML em imagem usando o NodeJS.

Saiba mais: Se você curtiu este post, talvez se interesse em saber como definir múltiplas bordas para um elemento HTML usando apenas CSS.


Se você curtiu o conteúdo, considere deixar uma gorjeta. Sua contribuição me ajuda a cobrir os custos do site e a continuar produzindo conteúdo de qualidade. Obrigado!


Todo mês, uma nova dica de programação pro seu dia a dia.

Você pode ser notificado também por RSS