DEV Community

Leonardo Theodoro
Leonardo Theodoro

Posted on

Incluindo gráficos em um PDF usando Laravel e Chartjs

Se você teve que gerar algum pdf que precisasse utilizar gráficos, sabe o quão difícil é conseguir incluir um gráfico dentro de um pdf, principalmente se você estiver usando gráficos em Javascript.

Referências

Quickchart.io
Chartjs
Laravel

Quickchart.io

Depois de procurar várias formas para incluir os gráficos dentro de um pdf, acabei encontrando um site que se chama quickchart.io, o que ele faz é basicamente transformar gráficos javascript em imagens estáticas que podem ser utilizadas em qualquer lugar, inclusive em um pdf.

Ele funciona da seguinte maneira:

https://quickchart.io/chart?c={type:'bar',data:{labels:[2012,2013,2014,2015,2016],datasets:[{label:'Users',data:[120,60,50,180,120]}]}}
Enter fullscreen mode Exit fullscreen mode

Você envia um query param na url do site com o nome c e o valor é um objeto com as configurações e dados do gráfico, da mesma forma que você cria no chartjs

O resultado dessa requisição é uma imagem png com o gráfico:

Imagem do gráfico

Incluindo a imagem no PDF usando Laravel

Nesse caso, estarei usando o dompdf e o Laravel 5.5.

Primeiro passo, tenha os dados na estrutura correta que pede o chartjs.

$chartData = [
  "type" => 'horizontalBar',
    "data" => [
      "labels" => ['Coluna 1', 'Coluna 2', 'Coluna 3'],
        "datasets" => [
          [
            "label" => "Dados", 
            "data" => [100, 60, 20],
            "backgroundColor" => ['#27ae60', '#f1c40f', '#e74c3c']
          ], 
        ],
      ]
  ];     
Enter fullscreen mode Exit fullscreen mode

Depois, transforme essa estrutura em json

$chartData = json_encode($chartData);
Enter fullscreen mode Exit fullscreen mode

e mande ela pra URL do quickchart.io usando urlencode

$chartURL = "https://quickchart.io/chart?width=300&height=200&c=".urlencode($chartData);
Enter fullscreen mode Exit fullscreen mode

Sim, é possível você escolher o width e o height do gráfico. A api fornece alguns parâmetros personalizáveis, é só dar uma olhadinha na documentação do quickchart.io 🥰

Feito isso, se você colocar a variável $chartURL dentro de uma tag <img>, a imagem deve aparecer. Porém, eu tive alguns problemas com inserir a variável direto e a imagem não aparecer dentro do pdf, então eu prefiro transformar essa imagem em base64 e ai sim enviar para o pdf.

Para transformar a imagem em base64 é simples:

$chartData = file_get_contents($chartURL); 
$chart = 'data:image/png;base64, '.base64_encode($chartData);
Enter fullscreen mode Exit fullscreen mode

Após, isso a variável $chart já vai possuir o base64 da imagem, como vocês podem notar, eu concatenei no começo da variável o data:image/png;base64,' porque é algo necessário para a tag <img> entender que a fonte da imagem é base64.

Após todos esses passos, estamos prontos para enviar essa variável para o template blade que irá gerar o pdf e incluir o gráfico dentro dele.

Para enviar e incluir a imagem é simples, basta fazer isso:

$pdf = PDF::loadView('report.pdf', ['chart' => $chart]);
return $pdf->stream();
Enter fullscreen mode Exit fullscreen mode

E no arquivo report.blade.php (template do report.pdf)

<img src="{{$chart}}">
Enter fullscreen mode Exit fullscreen mode

Dessa maneira, o gráfico aparecerá corretamente dentro do seu pdf.

Qualquer dúvida, fico a disposição para ajudar.

Meu github
https://github.com/leotheodoro

Top comments (2)

Collapse
 
internick profile image
Nick Granados

Excelente! Muito obrigado pelo artigo, me ajudou muito

Collapse
 
stivenlovera profile image
stiven lovera

super... gracias por el articulo