PHPackages                             ivanilsonsousa/agnostic-pdf - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [PDF &amp; Document Generation](/categories/documents)
4. /
5. ivanilsonsousa/agnostic-pdf

ActiveLibrary[PDF &amp; Document Generation](/categories/documents)

ivanilsonsousa/agnostic-pdf
===========================

Manipulação de arquivos PDF agnóstica de drivers para aplicações Laravel

v0.0.7(6mo ago)532MITPHP

Since Sep 13Pushed 6mo agoCompare

[ Source](https://github.com/ivanilsonsousa/agnostic-pdf)[ Packagist](https://packagist.org/packages/ivanilsonsousa/agnostic-pdf)[ RSS](/packages/ivanilsonsousa-agnostic-pdf/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (8)Versions (8)Used By (0)

Agnostic PDF (Laravel)
======================

[](#agnostic-pdf-laravel)

Manipulação de PDFs para projetos **Laravel**, com **drivers intercambiáveis** (mPDF e Dompdf). Fornece uma API simples para renderizar de *views* ou HTML, *streamar*, baixar, salvar e — quando suportado pelo driver — **clonar páginas de PDFs existentes**. Inclui ainda um serviço de **compressão** de PDFs.

> Foco: DX simples no Laravel, mantendo o código da aplicação desacoplado do driver.

---

Sumário
-------

[](#sumário)

- [Instalação](#instala%C3%A7%C3%A3o)
- [Configuração](#configura%C3%A7%C3%A3o)
- [Uso rápido](#uso-r%C3%A1pido)
- [API do Serviço de PDF](#api-do-servi%C3%A7o-de-pdf)
- [Clonagem de PDFs (MPDF)](#clonagem-de-pdfs-mpdf)
- [Compressão de PDFs](#compress%C3%A3o-de-pdfs)
- [Facade e Manager](#facade-e-manager)
- [Contratos e Drivers](#contratos-e-drivers)
- [Requisitos](#requisitos)
- [Licença](#licen%C3%A7a)

---

Instalação
----------

[](#instalação)

```
composer require ivanilsonsousa/agnostic-pdf
```

O *Service Provider* é descoberto automaticamente pelo Laravel (auto-discovery).

---

Configuração
------------

[](#configuração)

Publique o arquivo de configuração:

```
php artisan vendor:publish --tag=pdf-config
```

Isso criará `config/pdf.php`. Nele você define o **driver** principal e as opções específicas de cada driver.

Exemplo (conceitual):

```
return [
    'driver' => 'mpdf', // 'mpdf' (padrão) ou 'dompdf'

    'mpdf' => [
        // opções nativas do mPDF (ex.: 'tempDir', 'format', 'orientation', 'margin_*', etc.)
    ],

    'dompdf' => [
        // opções nativas do Dompdf (ex.: 'options' => [...], 'paper', 'orientation', etc.)
    ],
];
```

> **Nota:** A clonagem de PDFs é um recurso do **MPDF**.

---

Uso rápido
----------

[](#uso-rápido)

### 1) Renderizando uma *view* para resposta HTTP (controller)

[](#1-renderizando-uma-view-para-resposta-http-controller)

```
use AgnosticPDF\Services\PDFService;

public function showInvoice(PDFService $pdf)
{
    $pdf->loadView('pdf.invoice', ['order' => $order]);

    // Retorne uma Response padrão do Laravel (sem 'exit'):
    return $pdf->streamResponse('invoice.pdf');
}
```

### 2) Renderizando HTML arbitrário e salvando em disco

[](#2-renderizando-html-arbitrário-e-salvando-em-disco)

```
use AgnosticPDF\Services\PDFService;

public function generate(PDFService $pdf)
{
    $html = 'Olá PDFGerado pela aplicação.';

    $pdf->loadHtml($html)->save(storage_path('app/pdfs/hello.pdf'));

    return 'ok';
}
```

### 3) Download direto

[](#3-download-direto)

```
use AgnosticPDF\Services\PDFService;

public function download(PDFService $pdf)
{
    $pdf->loadView('pdf.report')->download('relatorio.pdf');
    // Baixa o arquivo no navegador do usuário.
}
```

> Dica: para pipelines HTTP no Laravel, prefira `streamResponse()` (retorna `Illuminate\Http\Response`).

---

API do Serviço de PDF
---------------------

[](#api-do-serviço-de-pdf)

A interface comum aos drivers é `AgnosticPDF\Contracts\PDFServiceInterface`. Os métodos expostos pelo **serviço principal** (`AgnosticPDF\Services\PDFService`) espelham essa interface:

- `loadHtml(string $html): self`Carrega HTML (da página em memória) para ser renderizado pelo driver.
- `loadView(string $view, array $data = []): self`Renderiza uma *view* do Laravel e carrega o HTML resultante.
- `output(): string`Retorna o binário do PDF renderizado como *string*.
- `download(string $filename): void`Força o *download* no navegador.
- `save(string $path): void`Salva o PDF no caminho indicado.
- `stream(string $filename): void`Envia o PDF e finaliza a resposta.

    > Para integração limpa com Laravel, prefira `streamResponse()`.
- `streamResponse(string $filename): \Illuminate\Http\Response`Retorna uma `Response` com o PDF em *inline*.

---

Clonagem de PDFs (MPDF)
-----------------------

[](#clonagem-de-pdfs-mpdf)

A clonagem (importar páginas de um PDF existente para o documento atual) é implementada pelo contrato `AgnosticPDF\Contracts\PDFClonerDriverInterface` e está disponível com o **driver MPDF**.

### Serviço de clonagem

[](#serviço-de-clonagem)

```
use AgnosticPDF\Services\PDFClonerService;

public function cloneAll(PDFClonerService $cloner /* driver: MPDF */)
{
    // Clona todas as páginas do arquivo de origem
    $cloner->cloneFromFile(storage_path('app/input.pdf'));

    // A partir daqui, as páginas clonadas estão no documento do driver em uso.
    // Para emitir o PDF, utilize o fluxo da sua aplicação (ver seção "Facade e Manager").
}
```

Assinatura (resumo) do método principal:

```
cloneFromFile(string $file, ?callable $callback = null, bool $force = true): self
```

- `$callback` (opcional): será chamado a cada página clonada como `fn(PDFClonerService $svc, int $pageNo, int $pageCount)`.
- `$force` (opcional): comportamento de fluxo conforme sua aplicação.

> **Importante:** Para orquestrar **clonagem + renderização** no **mesmo documento**, utilize o **Manager** (abaixo), que garante que clonagem e emissão compartilham a mesma instância de driver MPDF.

---

Compressão de PDFs
------------------

[](#compressão-de-pdfs)

Há um serviço de compressão baseado em *processo externo* (executado via `Symfony\Component\Process\Process`):

```
use AgnosticPDF\Services\PDFCompressor;

public function compress(PDFCompressor $compressor)
{
    $compressedPath = $compressor->reduce(storage_path('app/pdfs/original.pdf'));
    // $compressedPath aponta para o arquivo comprimido (normalmente em diretório temporário)
}
```

Erros de compressão lançam `AgnosticPDF\Exceptions\PDFCompressException`, que expõe `getContext(): array` com detalhes úteis de depuração (comando, saída, caminho de entrada, etc.).

---

Facade e Manager
----------------

[](#facade-e-manager)

A *facade* `AgnosticPDF\Facades\PDF` resolve o **Manager** (`AgnosticPDF\Services\PDFManagerService`), que agrega:

- o serviço de PDF (renderização),
- o serviço de clonagem (quando disponível),
- o compressor.

O Manager oferece um **builder** para cenários em que você quer **encadear** operações (ex.: clonar páginas e em seguida renderizar/salvar) compartilhando a **mesma instância de driver**:

```
use AgnosticPDF\Facades\PDF;

$builder = PDF::builder();

// Exemplo ilustrativo de pipeline (os métodos encadeáveis são do seu builder):
// $builder
//     ->cloneFromFile(storage_path('app/input.pdf'))
//     ->loadView('pdf.cover', ['title' => 'Meu PDF'])
//     ->streamResponse('final.pdf');
```

> O **builder** é útil principalmente para **clonagem com MPDF** seguida de emissão do PDF, assegurando que tudo ocorra no mesmo documento interno.

---

Contratos e Drivers
-------------------

[](#contratos-e-drivers)

### Contratos

[](#contratos)

- `AgnosticPDF\Contracts\PDFServiceInterface`Operações de renderização/saída: `loadHtml`, `loadView`, `output`, `download`, `save`, `stream`, `streamResponse`.
- `AgnosticPDF\Contracts\PDFClonerDriverInterface` (**MPDF**) Clonagem de páginas:

    - `prepareClone(string $pathFile): int` → retorna o número de páginas do PDF origem;
    - `clonePage(int $pageNo): void` → importa a página para o documento atual.

### Drivers disponíveis

[](#drivers-disponíveis)

- `AgnosticPDF\Drivers\MPDFDriver`Implementa `PDFServiceInterface` **e** `PDFClonerDriverInterface`. Fornece `getMpdf(): \Mpdf\Mpdf` para configurações avançadas do mPDF.
- `AgnosticPDF\Drivers\DompdfDriver`Implementa `PDFServiceInterface`. Por padrão, habilita recursos remotos e usa `A4 portrait`.

> Você seleciona o driver ativo via `config('pdf.driver')`.

---

Requisitos
----------

[](#requisitos)

- Laravel `^12.0` (auto-discovery de provider já configurado)
- Drivers:

    - `mpdf/mpdf:^8.2`
    - `dompdf/dompdf:^3.1`
- PHP: utilize a versão suportada pelo seu Laravel/driver.

---

### Namespace &amp; Provider

[](#namespace--provider)

As classes públicas estão sob `AgnosticPDF\...` e o *Service Provider* é `AgnosticPDF\PDFServiceProvider` (auto-discovery via `composer.json`).

---

Exemplos rápidos (copie-e-cole)
-------------------------------

[](#exemplos-rápidos-copie-e-cole)

**Controller – stream inline**

```
use AgnosticPDF\Services\PDFService;

public function show(PDFService $pdf)
{
    return $pdf->loadView('pdf.ticket', ['ticket' => $ticket])
               ->streamResponse('ticket.pdf');
}
```

**Salvar em disco**

```
use AgnosticPDF\Services\PDFService;

$pdf->loadHtml('Relatório')->save(storage_path('app/pdfs/relatorio.pdf'));
```

**Compressão**

```
use AgnosticPDF\Services\PDFCompressor;

$compressed = app(PDFCompressor::class)->reduce(storage_path('app/pdfs/relatorio.pdf'));
```

**Clonagem (MPDF) + emissão via Builder**

```
use AgnosticPDF\Facades\PDF;

PDF::builder()
   ->cloneFromFile(storage_path('app/pdfs/base.pdf'))
   ->loadView('pdf.appendix', ['data' => $data])
   ->streamResponse('final.pdf');
```

###  Health Score

31

—

LowBetter than 66% of packages

Maintenance67

Regular maintenance activity

Popularity12

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity31

Early-stage or recently created project

 Bus Factor1

Top contributor holds 60% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~16 days

Recently: every ~24 days

Total

7

Last Release

195d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/115515311?v=4)[Pedro](/maintainers/pedrodevelops)[@pedrodevelops](https://github.com/pedrodevelops)

![](https://www.gravatar.com/avatar/d09dd623be3b4b37df57d373a0f9e893e3f569bb169e2ee7b54dff2c75dce08d?d=identicon)[ivanilsonsousa](/maintainers/ivanilsonsousa)

---

Top Contributors

[![ivanilsonsousa](https://avatars.githubusercontent.com/u/42950766?v=4)](https://github.com/ivanilsonsousa "ivanilsonsousa (6 commits)")[![pedrodevelops](https://avatars.githubusercontent.com/u/115515311?v=4)](https://github.com/pedrodevelops "pedrodevelops (4 commits)")

###  Code Quality

TestsPHPUnit

Code StylePHP CS Fixer

### Embed Badge

![Health badge](/badges/ivanilsonsousa-agnostic-pdf/health.svg)

```
[![Health](https://phpackages.com/badges/ivanilsonsousa-agnostic-pdf/health.svg)](https://phpackages.com/packages/ivanilsonsousa-agnostic-pdf)
```

###  Alternatives

[bagisto/bagisto

Bagisto Laravel E-Commerce

27.6k172.1k9](/packages/bagisto-bagisto)[helsingborg-stad/municipio

A bootstrap theme for creating municipality sites.

4028.5k10](/packages/helsingborg-stad-municipio)[statamic-rad-pack/runway

Eloquently manage your database models in Statamic.

135224.7k7](/packages/statamic-rad-pack-runway)[elegantly/laravel-invoices

Store invoices safely in your Laravel application

23546.8k2](/packages/elegantly-laravel-invoices)[api-platform/laravel

API Platform support for Laravel

58171.6k14](/packages/api-platform-laravel)[ecotone/laravel

Ecotone for Laravel — CQRS, Event Sourcing, Sagas, Durable Workflows, and Outbox on top of Laravel Queue, via PHP attributes.

21318.6k3](/packages/ecotone-laravel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
