Merge de pdf's no PHP usando LARAVEL
Tags: php, laravel, programming, webdev
Published: 2023-10-30 20:35:26

## 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
```

---

###<u>Show me the code</u> 👨🏽‍💻

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

```php
    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);
    }
```

### <u>Bom então vamos passo a passo:</u>

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.

### <u>Dentro do foreach:</u>
1. Já **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.

### <u>Finalmente o merge:</u>

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".

---

### <u>Conclusão:</u>

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!