DEV Community

Cover image for Merge de pdf's no PHP usando LARAVEL
João Pedro Gomes de Sena
João Pedro Gomes de Sena

Posted on

Merge de pdf's no PHP usando LARAVEL

Eai, bão demais? 🤙🏽

Esse é meu primeiro post, espero fazer isso com mais frequência, primeiro porque eu gosto de escrever e ainda mais que isso gosto de me sentir útil para outras pessoas, e espero que o conteúdo desse post lhe ajude, então borá lá.

Esse final de semana eu precisei lidar com o agrupamento de pdfs em um projeto laravel, resolvi documentar porque creio que poderá ser útil não só para outras pessoas mas para mim mesmo.

Como a task foi em um projeto legado, a lib que eu usei só é compatível com o PHP 5 ao 7 🥲 (Mas acompanha o exemplo porque a lógica é similar com as libs com essa finalidade).


⊕ Instalando a dependência ⊕

A lib que usarei é a PDFMerger, para instalar no seu projeto você precisará usar o comando:

composer require clegginabox/pdf-merger:dev-master
Enter fullscreen mode Exit fullscreen mode

Show me the code 👨🏽‍💻

Primeiro irei mostrar o exemplo completo e após irei detalhar como eu o usei:

    public function groupPdf(array $params): void
    {
        $storage   = \Storage::disk(storageDefineDisk());
        $basePath = "main-folder/";
        $pdfMerger = app(\Clegginabox\PDFMerger\PDFMerger::class);

        if (! $storage->exists($basePath)) {
            $storage->makeDirectory($basePath);
        }

        foreach ($params as $param) {
            $pdfName = 'name-' . uniqid() . '.pdf';
            $file = $basePath . $pdfName;
            $storage->put($file, $param['pdf']);

            $pdfMerger->addPDF($storage->path($file));
            $deleteFile[] = $file;
        }

        $fileMescled = "mescled-pdf-" . now() . '-' . uniqid() . '.pdf';
        $fullPath = $basePath . $fileMescled;

        $pdfMerger->merge('file', $storage->path($fullPath));

        $storage->delete($deleteFile);
    }
Enter fullscreen mode Exit fullscreen mode

Bom então vamos passo a passo:

  1. Logo de cara já podem observar que estou passando para o meu storage um helper, esse helper basicamente vai definir qual será o seu disk baseado no seu ambiente, se estiver em produção irá selecionar o disk que é usado em produção e caso contrário é selecionado o local.
  2. Depois definimos em uma variável a pasta principal onde será salvo todos os pdfs criados (tanto os que sofrerão o merge e o arquivo resultante).
  3. Agora precisamos instanciar a nossa lib, a mesma é instanciada com o app para a resolução das dependências.
  4. Verifico se a pasta principal existe, caso contrário eu a crio (eu sou bem chato com if's, eu colocaria isso em uma outra função, mas tudo bem, é só um exemplo).
  5. Logo após eu inicio o foreach com os pdf's recebidos pela função.

Dentro do foreach:

  1. dento do foreach o primeiro passo é criar o nome do arquivo pdf.
  2. Depois criamos uma variável onde concatenaremos o nome do arquivo base com o nome do pdf que criaremos.
  3. Agora chamaremos o storage e salvaremos o pdf no caminho definido.
  4. Finalmente chamaremos a lib, utilizando a função add pdf, passando para ela o path do pdf criado.
  5. Por fim colocamos o path completo do arquivo criado dentro de um array para excluirmos ele posteriormente.

Finalmente o merge:

Por fim, a $fileMescled é a variável que conterá o nome do arquivo pdf que irá ser criado, depois concatenamos com o basepath. E finalmente chamaremos a função MERGE da lib que fará o merge dos pdfs, para essa função primeiro passamos o primeiro parâmetro (output method) como file e o segundo argumento o caminho completo que o nosso arquivo resultante do merge deve ser salvo.

E na última linha apagamos todos os pdf's criados no foreach que foram "merjados".


Conclusão:

Uma coisa é certeza, uma hora ou outra em sua carreira você vai se deparar com um rolê desse. Espero que tenha sido útil, não hesite em perguntar caso tenha alguma dúvida, tmj e até a próxima!

Top comments (0)