Screenshots com PHP

Salvar screenshots de um site não é uma tarefa muito comum de um programador, porém, esta é uma tarefa interessante de ser feita. Existem algumas soluções interessantes para se resolver esta tarefa, porém, existe um cara em especial que me chamou a atenção e atendeu muito bem as minhas necessidades. Requisito para prosseguir com a solução apresentada neste post é instalar o wkhtmltoimage. Se você acessar o site do projeto vai ver que o nome dele é wkhtmltopdf e não wkhtmltoimage, como é mencionado. O wkhtmltoimage existe nos downloads do projeto, você só precisa instalar a versão adequada para o seu sistema operacional. Tem versões para Linux, Mac e Windows. Vou guiá-los com base no texto Taking screenshots of websites with PHP.

O wkhtmltoimage é um simples utilitário para ser executado via shell que faz a conversão de HTML para imagem usando o WebKit Engine e QT. Não é bem uma conversão. A ferramenta renderiza o endereço requisitado utilizando o WebKit Engine e tira um screenshot desta renderização utilizando o QT.

Fazendo sua primeira screenshot

Levando em consideração que você já tenha o wkhtmltoimage instalado corretamente, abra o seu terminal e digite:

wkhtmltoimage http://www.google.com google.jpg

O código acima vai converter toda a representação HTML do Google e vai converter isso para jpg usando o wkhtmltoimage.

Customizando a saída

O comando wkhtmltoimage tem uma série de opções:

  • Desabilitar a renderização de imagens.
  • Controlar a qualidade da imagem de output.
  • Salvar o screenshot com uma resolução específica.
  • Salvar uma região especifíca do screenshot (crop).
  • Desabilitar o javascript da pagina requisitada.

Exemplos

//renderiza sem imagens
wkhtmltoimage --no-images http://www.google.com google.jpg

//não carrega os javascripts
wkhtmltoimage --no-javascript http://www.google.com google.jpg

//reduz a qualidade da imagem de output
wkhtmltoimage --quality 50 http://www.google.com google.jpg

//personaliza a largura e a altura do screenshot
wkhtmltoimage --height 600 --width 1800 http://www.google.com google.jpg

//faz um crop de 300x300 pixels partindo do eixo x0 e y0
wkhtmltoimage --crop-h 300 --crop-w 300 --crop-x 0 --crop-y 0 http://www.google.com google.jpg

Utilizando com PHP

Como já era de se imaginar, toda esta façanha não é feita somente com PHP. Você precisa da ajuda de alguns caras e para que o PHP consiga executar estes comandos, vamos precisar da ajuda de um método chamado shell_exec do PHP. Também podemos utilizar um wrapper escrito em PHP5 que abstrai os métodos do wkhtmltoimage e wkhtmltopdf chamado Snappy escrito em PHP5 do PHP.

Método 1: shell_exec

[php]shell_exec(‘./wkhtmltoimage –quality 50 http://www.google.com google.jpg’);[/php]

Método 2: Snappy

[php]
<?php

namespace Knplabs\Snappy;

require_once(‘Knplabs/Snappy/Media.php’);
require_once(‘Knplabs/Snappy/Image.php’);

/* ‘wkhtmltoimage’ executable is located in the current directory */
$snap = new Image(‘./wkhtmltoimage’);

/* Displays the bbc.com website index page screenshot in the browser */
header("Content-Type: image/jpeg");
$snap->output(‘http://www.bbc.com&#8217;);

?>
[/php]

Com alguns métodos adicionados…

[php]
<?php

namespace Knplabs\Snappy;

require_once(‘Knplabs/Snappy/Media.php’);
require_once(‘Knplabs/Snappy/Image.php’);

$options = array(‘zoom’ => 0.5, ‘no-images’ => true);

/* ‘wkhtmltoimage’ executable is located in the current directory */
$snap = new Image(‘./wkhtmltoimage-i386’,$options);

/* Displays the bbc.com website index page screen-shot in the browser */
header("Content-Type: image/jpeg");
$snap->output(‘http://www.bbc.com&#8217;);

?>
[/php]

É isso aí!

Qualquer dúvida, estou à disposição.

8 thoughts on “Screenshots com PHP

  1. Testei aqui no meu windows e não deu em nada. Muitos erros acontecem, fora que ele não consegue ler ficheiros temporáriosl.

    Like

  2. Amigo… Gostaria de tirar algumas dúvidas… esse programa eu utilizo no Wamp… consigo converter normalmente… Daí estou querendo utilizá-lo na minha hospedagem… ela é compartilhada… Mas me dá acesso SSH … tentei instalar mais não consegui… daí o que seria esse snappy … para eu utilizá-lo precisa apenas colocar no servidor os arquivos e converter as imagens sem o programa instalado… ou ele apenas substitui o exec_shell ?? se puder ajudar…

    Like

  3. Tudo bom Igor … Só uma dúvida… eu enviei para uma pasta de teste o arquivo e descompactei… Lá criei um arquivo php usando shell_exec … mas quando eu executo ele não funciona… é isso mesmo… ou possui algum lugar especifico para eu descompactar o arquivo… pois em um tutorial da net mostrava que deveria mover o arquivo para a pasta \bin… mas no meu caso foi negado o acesso a esta pasta… por isto tentei inserir no diretório raíz do site… ATT JV

    Like

  4. Após a instalação, verifiquei que não foi criado o aplicativo wkhtmltoimage.exe e sim o wkhtmltopdf.exe. Consigo converter uma página para pdf mas não para jpg.

    Like

Leave a comment