Download the PHP package pdf-block/laravel without Composer
On this page you can find all versions of the php package pdf-block/laravel. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download pdf-block/laravel
More information about pdf-block/laravel
Files in pdf-block/laravel
Package laravel
Short Description Server-side PDF renderer for pdf-block DSL documents. Converts JSON DSL to native PDF via a local Chromium binary or a remote Browserless (v2) service.
License MIT
Homepage https://github.com/accusense-tech/pdf-block-laravel
Informations about the package laravel
pdf-block/laravel
Pacote Laravel para renderizar documentos da DSL do pdf-block em PDF nativo. Texto selecionável, links clicáveis, imagens embutidas — PDF de verdade, não screenshot.
Suporta dois drivers de renderização intercambiáveis:
| Driver | Como funciona | Quando usar |
|---|---|---|
local |
Chromium CLI no mesmo container que o PHP, via symfony/process |
Desenvolvimento e ambientes controlados |
browserless |
HTTP POST a um serviço Browserless v2 (auto-hospedado ou gerenciado) via libcurl nativo | Produção, escalabilidade horizontal, separação de responsabilidades |
Instalação
O service provider é registrado automaticamente via auto-discovery do Laravel.
Publicar config (opcional)
Cria config/pdf-block.php no projeto com todas as opções disponíveis.
Publicar views (opcional)
Permite customizar os Blade templates em resources/views/vendor/pdf-block/.
Uso
Injeção de dependência
API pública
Configuração
Variáveis de ambiente
Driver local:
Driver browserless:
Driver local
O driver padrão. Invoca o binário do Chromium diretamente via symfony/process com a flag --print-to-pdf. Não requer Node.js, Puppeteer ou Browsershot.
Pré-requisitos
Chromium instalado no servidor ou container:
fonts-noto-color-emoji: necessário para renderizar emojis. Sem ela, emojis aparecem como quadrados vazios no PDF.
Dockerfile (desenvolvimento)
Produção com www-data (PHP-FPM)
O chrome_crashpad_handler usa ptrace(PTRACE_ATTACH) no processo pai do Chromium. Quando o PHP roda como www-data sem CAP_SYS_PTRACE, o kernel nega essa chamada e o Chromium recebe SIGTRAP.
Os flags --disable-crash-reporter e --disable-breakpad (já incluídos nos defaults) reduzem a frequência desse problema, mas não o eliminam em todos os builds do Chromium no Debian/Ubuntu.
Solução definitiva via setcap (requer libcap2-bin):
Alternativa recomendada para produção: use o driver browserless, onde o Chromium roda isolado em um container próprio — o problema de permissão não existe nesse contexto.
Driver browserless
Envia o HTML via POST /pdf para qualquer serviço compatível com a API Browserless v2. Elimina o Chromium do container PHP por completo.
O driver é implementado sobre libcurl nativo (ext-curl) — sem Guzzle. Motivos:
- Roteamento confiável. libcurl emite sempre request-line em origin-form (
POST /pdf HTTP/1.1), que é o único formato aceito pelo router do Browserless v2. Clientes de alto nível podem serializar em absolute-form para hosts sem TLD (ex.:browserlessem rede Docker), resultando em HTTP 404 "No matching HTTP route handler". - Menor overhead. Sem wrappers PSR-7 / streams / middlewares — ~5 ms a menos por request e pegada de memória menor (útil em containers com
mem_limitbaixo). - Menos superfície de erro. Zero dependência transitiva.
O HTML gerado pelo Blade já carrega toda a lógica de dimensionamento: um script injeta @page { size: Wmm Hmm; margin: 0 } via beforeprint, medindo o scrollHeight real após fontes e imagens carregadas. O driver envia preferCSSPageSize: true para que o Puppeteer obedeça esse @page — tamanho, margens e orientação vêm direto da DSL via CSS, sem duplicação no JSON da requisição.
Otimizações ativas por padrão
| Otimização | Efeito |
|---|---|
waitUntil: 'load' |
Fontes são 100% locais (fontconfig), imagens já são aguardadas pelo load. Usar networkidle0 só é necessário se o template dispara XHR/fetch após o load. |
preferCSSPageSize: true |
Tamanho do papel lido do @page do HTML — evita duplicar config na request. |
rejectResourceTypes |
Cancela media, websocket, eventsource, manifest, texttrack, other antes da rede. |
rejectRequestPattern |
Bloqueia trackers conhecidos (Google Analytics, GTM, DoubleClick, Facebook Pixel, Hotjar, Mixpanel, Segment, FullStory, Clarity). |
CURLOPT_TCP_NODELAY |
Desliga Nagle — request chega ao Browserless sem o delay de 40 ms. |
Expect: header removido |
Evita handshake 100-continue que alguns proxies travam. |
| HTTP/1.1 forçado | Garante request-line em origin-form compatível com o router do Browserless. |
Docker Compose (desenvolvimento)
Budget de memória: com esse stack o pico observado é
api ~50 MB+browserless ~150 MBpor PDF de 1–5 páginas. Cabe confortavelmente em 400 MB totais.
DEFAULT_BLOCK_ADS=falseé intencional. O ad-blocker embutido do Browserless baixa listas de filtros em background e pode travar osetContent. O bloqueio de trackers é feito no nível do driver viareject_request_pattern— mais previsível e sem dependência de DNS externo.
Serviço gerenciado (browserless.io)
Driver customizado
Implemente a interface PdfBlock\Laravel\Contracts\PdfDriver e registre o binding no seu service provider:
Fontes locais
O pacote opera com fontes 100% locais — zero tráfego para fonts.googleapis.com em runtime. A imagem Docker do Browserless (ghcr.io/uotz/pdf-block-browserless:latest) já inclui as 20 famílias curadas abaixo, instaladas no fontconfig do sistema:
Sans-serif: Inter, Roboto, Open Sans, Lato, Source Sans 3, Noto Sans, Work Sans, DM Sans, Montserrat Serif: Spectral (padrão), Merriweather, Lora, Source Serif 4, PT Serif, EB Garamond, Libre Baskerville, Playfair Display, Noto Serif Display: Oswald Mono: Roboto Mono
A lista vive em config/pdf-block.php → fonts.local_fonts e está sincronizada com o FontPicker do pacote React.
Para adicionar uma família: atualize docker/install-fonts.sh (baixa os arquivos no build), config/pdf-block.php → local_fonts e o FontPicker do React. O workflow publish-browserless.yml detecta mudanças em install-fonts.sh e rebuilda automaticamente a imagem.
Imagem Docker pronta
A imagem ghcr.io/uotz/pdf-block-browserless é a maneira recomendada de rodar o driver browserless. Ela estende ghcr.io/browserless/chromium:latest com:
- Noto Color Emoji como família de emoji (mesmo visual do driver local).
- As 20 fontes corporativas instaladas no fontconfig.
- Sem alteração de entrypoint — todas as variáveis de ambiente do Browserless v2 continuam funcionando.
Tags disponíveis:
| Tag | Uso |
|---|---|
latest |
Última build da branch main |
vX.Y.Z |
Vinculada ao release correspondente do pacote Composer |
vX.Y |
Major.minor (atualiza em novos patches) |
Veja docs/image-build.md para detalhes do pipeline de build e como gerar uma nova versão da imagem.
Diagnóstico
O sandbox inclui dois endpoints para validar a configuração de cada driver sem gerar um PDF completo:
Verificar driver local
Executa chromium --version e retorna:
Verificar driver browserless
Faz um request de health check ao serviço e retorna:
Em caso de erro, ambos os endpoints retornam HTTP 500/502 com "status": "error" e uma "message" descritiva.
Arquitetura
Paridade visual
Os Blade templates replicam 1:1 os renderers React. Ambos usam 100% inline styles via as mesmas funções CSS helper (portadas de TypeScript para PHP em StyleHelpers.php).
DSL — Formato do documento
O pacote espera receber a mesma DSL JSON produzida pelo editor @pdf-block/react:
Blocos suportados
| Bloco | Descrição |
|---|---|
text |
Rich text via TipTap JSON → HTML (ueberdosis/tiptap-php) |
image |
Imagem com alignment, objectFit, bordas |
button |
Link estilizado como botão (clicável no PDF) |
divider |
Linha horizontal |
spacer |
Espaço vertical |
banner |
Imagem de fundo com overlay e textos |
table |
Tabela com header, zebra, bordas |
qrcode |
QR code |
chart |
Gráfico de barras (CSS puro) |
pagebreak |
Quebra de página forçada |
Customização de templates
Após publicar as views (--tag=pdf-block-views), edite os templates em resources/views/vendor/pdf-block/:
Integração com o editor React
Endpoint Laravel
No React
Requisitos
- PHP ≥ 8.2
- Extensões PHP:
ext-curl,ext-json - Laravel 11.x ou 12.x
- Driver local: Chromium instalado no servidor
- Driver browserless: Serviço Browserless v2 acessível via HTTP
Licença
MIT
pdf-block/laravel
Pacote Laravel para renderizar documentos da DSL do pdf-block em PDF nativo. Texto selecionável, links clicáveis, imagens embutidas — PDF de verdade, não screenshot.
Suporta dois drivers de renderização intercambiáveis:
| Driver | Como funciona | Quando usar |
|---|---|---|
local |
Chromium CLI no mesmo container que o PHP | Desenvolvimento e ambientes controlados |
browserless |
HTTP POST a um serviço Browserless v1 (auto-hospedado ou gerenciado) | Produção, servidores com www-data sem CAP_SYS_PTRACE |
Instalação
O service provider é registrado automaticamente via auto-discovery do Laravel.
Publicar config (opcional)
Cria config/pdf-block.php no projeto com todas as opções disponíveis.
Publicar views (opcional)
Permite customizar os Blade templates em resources/views/vendor/pdf-block/.
Uso
Injeção de dependência
API pública
Configuração
Variáveis de ambiente
Driver local:
Driver browserless:
Driver local
O driver padrão. Invoca o binário do Chromium diretamente via symfony/process com a flag --print-to-pdf. Não requer Node.js, Puppeteer ou Browsershot.
Pré-requisitos
Chromium instalado no servidor ou container:
fonts-noto-color-emoji: necessário para renderizar emojis. Sem ela, emojis aparecem como quadrados vazios no PDF.
Dockerfile (desenvolvimento)
Produção com www-data (PHP-FPM)
O chrome_crashpad_handler usa ptrace(PTRACE_ATTACH) no processo pai do Chromium. Quando o PHP roda como www-data sem CAP_SYS_PTRACE, o kernel nega essa chamada e o Chromium recebe SIGTRAP.
Os flags --disable-crash-reporter e --disable-breakpad (já incluídos nos defaults) reduzem a frequência desse problema, mas não o eliminam em todos os builds do Chromium no Debian/Ubuntu.
Solução definitiva via setcap (requer libcap2-bin):
Alternativa recomendada para produção: use o driver browserless, onde o Chromium roda como root em container isolado — o problema de permissão não existe nesse contexto.
Driver browserless
Envia o HTML via POST /pdf para qualquer serviço compatível com a API Browserless v1. Elimina o Chromium do container PHP por completo.
O HTML gerado pelo Blade já carrega toda a lógica de dimensionamento: um script injeta @page { size: Wmm Hmm; margin: 0 } via beforeprint, medindo o scrollHeight real após fontes e imagens carregadas. O driver envia preferCSSPageSize: true para que o Puppeteer obedeça esse @page — tamanho, margens e orientação vêm diretamente da DSL via CSS, sem duplicação no JSON da requisição.
Docker Compose (desenvolvimento)
Serviço gerenciado (browserless.io)
Driver customizado
Implemente a interface PdfBlock\Laravel\Contracts\PdfDriver e registre o binding no seu service provider:
Diagnóstico
O sandbox inclui dois endpoints para validar a configuração de cada driver sem gerar um PDF completo:
Verificar driver local
Executa chromium --version e retorna:
Verificar driver browserless
Faz um request de health check ao serviço e retorna:
Em caso de erro, ambos os endpoints retornam HTTP 500/502 com "status": "error" e uma "message" descritiva.
Arquitetura
Paridade visual
Os Blade templates replicam 1:1 os renderers React. Ambos usam 100% inline styles via as mesmas funções CSS helper (portadas de TypeScript para PHP em StyleHelpers.php).
DSL — Formato do documento
O pacote espera receber a mesma DSL JSON produzida pelo editor @pdf-block/react:
Blocos suportados
| Bloco | Descrição |
|---|---|
text |
Rich text via TipTap JSON → HTML (ueberdosis/tiptap-php) |
image |
Imagem com alignment, objectFit, bordas |
button |
Link estilizado como botão (clicável no PDF) |
divider |
Linha horizontal |
spacer |
Espaço vertical |
banner |
Imagem de fundo com overlay e textos |
table |
Tabela com header, zebra, bordas |
qrcode |
QR code |
chart |
Gráfico de barras (CSS puro) |
pagebreak |
Quebra de página forçada |
Customização de templates
Após publicar as views (--tag=pdf-block-views), edite os templates em resources/views/vendor/pdf-block/:
Integração com o editor React
Endpoint Laravel
No React
Migração da config anterior
Se você usava uma versão anterior do pacote, a estrutura de configuração foi alterada. Re-publique o arquivo de config e ajuste suas variáveis de ambiente:
Antes (configuração plana):
Depois (configuração por driver):
As variáveis PDF_BLOCK_CHROME_PATH e PDF_BLOCK_TIMEOUT continuam funcionando — apenas foram movidas para dentro de drivers.local.
Requisitos
- PHP ≥ 8.2
- Laravel ≥ 11.0
- Driver local: Chromium instalado no servidor
- Driver browserless: Serviço Browserless v1 acessível via HTTP
Licença
MIT
All versions of laravel with dependencies
ext-curl Version *
ext-json Version *
illuminate/http Version ^11.0|^12.0
illuminate/support Version ^11.0|^12.0
illuminate/view Version ^11.0|^12.0
symfony/process Version ^6.0|^7.0
ueberdosis/tiptap-php Version ^1.0|^2.0