Gerando PDF no CodeIgniter com a biblioteca mPDF

Gerando PDF no CodeIgniter com a biblioteca mPDF

30/10/2019 0 Por Jonathan Lamim

Gerar PDF é uma rotina bastante utilizada em aplicações web e o CodeIgniter, infelizmente, não possui nenhum recurso nativo para esse tipo de necessidade.

Sendo assim, vou mostrar como integrar a biblioteca mPDF ao CodeIgniter para que seja possível gerar PDFs.

Para que tenhamos um processo otimizado e bem organizado, vamos utilizar o Composer para criar tanto o projeto em CodeIgniter quanto para instalar a biblioteca mPDF.

Para instalar o CodeIgniter via Composer basta abrir o terminal (Linux/MacOS) ou o prompt de comando (Windows) e executar o comando a seguir dentro do seu diretório de projetos e será criado um novo diretório chamado mpdf-no-codeigniter com a estrutura completa da versão 3.1.11 do CodeIgniter.

composer create-project CodeIgniter/framework mpdf-no-codeigniter --no-dev

Instalando a biblioteca mPDF

Após o processo de criação do projeto ser concluído, execute o comando a seguir para que a biblioteca mPDF seja adicionada ao projeto.

Será instalada a versão mais recente da biblioteca, que no momento em que esse tutorial foi desenvolvido era a versão 7.x.

composer require mpdf/mpdf

Feito isso é hora de começar o processo de configuração e integração da biblioteca ao projeto.

Configurando o autoload

Como estamos utilizando o Composer é necessário configurar seu autoload para que a biblioteca mPDF possa ser utilizada no projeto.

Abre o arquivo application/config/config.php e altere o valor de $config['composer_autoload'] para './vendor/autoload.php', assim todas as bibliotecas e recursos instalados via Composer estarão disponíveis para a aplicação.

Gerando PDF a partir do conteúdo de uma view

Vamos implementar a geração de um PDF a partir da view que já vem na estrutura padrão do CodeIgniter.

Toda a lógica para a geração do PDF será executada no controlador application/controllers/Welcome.php.

Abra esse controlador e atualize o conteúdo do método index() conforme o código a seguir:

public function index()
{
    // Instancia a Classe apontando uma configuração
    // que nesse caso é a orientação da página para Landscape
    $mpdf = new \Mpdf\Mpdf(['orientation' => 'L']);
    // Recupera o código HTML da view sem exibí-lo na tela
    $conteudoPDF = $this->load->view('welcome_message', '', true);
    // Informa o código HTML da view para a biblioteca
    $mpdf->WriteHTML($conteudoPDF);
    // Abre o PDF na tela
    $mpdf->Output();
}

Nessa rotina o arquivo PDF será carregado no browser, sem a necessidade de geração e armazenamento de um arquivo físico no servidor.

Salvando o arquivo PDF no servidor

Para salvar o arquivo em PDF no servidor ao invés de exibí-lo diretamente no browser você só precisa passar 2 parâmetros para o método Output() e se certificar de que o diretório onde o arquivo será gravada exista e tenha permissão de escrita.

Os parâmetros passados para o método Output() seriam o seguinte:

// primeiro parâmetro o path com o nome do arquivo a ser salvo
// segundo parâmetro é o formato de saída
// \Mpdf\Output\Destination::INLINE (padrão da biblioteca)
// \Mpdf\Output\Destination::DOWNLOAD
// \Mpdf\Output\Destination::FILE
// \Mpdf\Output\Destination::STRING_RETURN
$mpdf->Output('path/nome_do_arquivo.pdf',\Mpdf\Output\Destination::FILE);

Forçando o download do arquivo PDF

A biblioteca mPDF também permite forçar o download do arquivo sem a necessidade de utilizar recursos nativos do PHP ou do próprio CodeIgniter e muito menos salvar o arquivo em disco antes de chamar a caixa de diálogo de download.

Para isso basta alterar os parâmetros do método Output() como a seguir:

$mpdf->Output('nome_do_arquivo.pdf',\Mpdf\Output\Destination::DOWNLOAD);

Dicas Úteis

Veja a seguir algumas dicas úteis para evitar dores de cabeça com erros e problemas mais frequentes.

Arquivo não é salvo no servidor

A biblioteca mPDF não faz o gerenciamento de diretórios, então se você informar um path para gravação do PDF que seja inválido, será emitido um erro na aplicação.

Antes de executar o Output() para salvar o arquivo, verifique a existência do diretório.

Arquivos sobrepostos

Assim como não é feito o gerenciamento de diretórios, a biblioteca mPDF não faz gerenciamento de arquivos, sendo assim, se o nome do arquivo a ser salvo for igual ao de um arquivo já existente, este será sobreposto.

Verifique a existência do arquivo antes de chamar o método Output() ou então trabalhe com nomes únicos.

Aqui no portal temos um artigo muito útil nessa questão, vale a pena conferir. Como gerar tokens únicos com CodeIgniter

Teste as views em tela antes de usá-las em arquivos PDF

Pode ser que você precise utilizar dados vindo de consultas ao banco na geração de relatórios, e isso vai envolver algumas rotinas PHP dentro da view, e caso haja algum erro ou problema com a codificação PHP existente na view, o arquivo PDF não será gerado.

Antes de imprimir o conteúdo das views no arquivo PDF, faça a verificação das mesmas imprimindo-as na tela, assim você pode se assegurar de que a renderização dos dados vindos do banco está correta.

Configurações adicionais da biblioteca mPDF

As configurações adicionais relacionadas ao arquivo gerado ou ao processo devem seguir as orientações da documentação oficial da biblioteca, então vale a pena separar um tempo para conhecer melhor a biblioteca e assim poder extrair o máximo dela em seus projetos.

Gostou desse tutorial? Então não deixe de compartilhá-lo em sua rede e de comentar dizendo o que achou, ou com suas dúvidas e até mesmo com sugestões!

Bons estudos!!!