TCPDF e FPDI no Laravel

Posted on: March 16, 2026 01:32 AM

Posted by: Renato

Categories: Laravel

Views: 27

TCPDF e FPDI no Laravel

Perfeito! Para preencher um formulário PDF automaticamente no Laravel usando os dados do seu banco, o segredo está no sistema de coordenadas (X, Y). Como o PDF não é um HTML fluido, você precisa dizer exatamente em que milímetro da página o texto deve aparecer.

Aqui está um guia prático de como estruturar isso:

1. O Fluxo Lógico

O Laravel busca os dados do banco (ex: um Pedido ou Usuário), o FPDI abre o seu arquivo "modelo.pdf" e o TCPDF escreve as variáveis por cima dos espaços em branco.


2. Exemplo de Código (Preenchendo um Contrato)

Imagine que você tem um modelo de contrato em storage/app/templates/contrato_base.pdf.

PHP

use App\Models\User;
use setasign\Fpdi\Tcpdf\Fpdi;

public function preencherPdf($userId)
{
    // 1. Busca os dados do banco
    $user = User::findOrFail($userId);

    // 2. Configura o PDF
    $pdf = new Fpdi();
    $pdf->SetMargins(0, 0, 0);
    $pdf->SetAutoPageBreak(false);
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);

    // 3. Importa o template
    $path = storage_path('app/templates/contrato_base.pdf');
    $pageCount = $pdf->setSourceFile($path);
    
    // Loop para importar todas as páginas (ou apenas a que você quer preencher)
    $templateId = $pdf->importPage(1);
    $pdf->AddPage();
    $pdf->useTemplate($templateId, 0, 0, 210, 297); // A4 completo

    // 4. Escreve os dados (O "pulo do gato")
    $pdf->SetFont('helvetica', '', 12);
    $pdf->SetTextColor(0, 0, 0);

    // Nome do Cliente - Posição X=50mm, Y=65mm
    $pdf->SetXY(50, 65);
    $pdf->Cell(0, 0, $user->name, 0, 0, 'L');

    // CPF/CNPJ - Posição X=50mm, Y=72mm
    $pdf->SetXY(50, 72);
    $pdf->Cell(0, 0, $user->documento, 0, 0, 'L');

    // Data Atual
    $pdf->SetXY(140, 250);
    $pdf->Cell(0, 0, now()->format('d/m/Y'), 0, 0, 'L');

    // 5. Retorna o PDF para download ou visualização
    return response($pdf->Output('contrato_finalizado.pdf', 'S'))
            ->header('Content-Type', 'application/pdf');
}

3. Dicas de Ouro para Não Passar Raiva:

  • Como achar as coordenadas? Abra o seu PDF de modelo no Chrome ou em um editor de imagem e use a régua. Se preferir, crie um loop no código que imprime números de 10 em 10 na tela para você ver onde cada um cai e usar como guia visual.

  • Tratamento de Strings: O TCPDF às vezes se confunde com acentuação se o arquivo não estiver em UTF-8. Se o nome "João" aparecer estranho, use: $nome = mb_convert_encoding($user->name, 'UTF-8');

  • Multi-páginas: Se o seu contrato tiver 10 páginas, você precisa dar um AddPage() e importPage() para cada uma delas dentro de um for, caso contrário, o arquivo final terá apenas a página que você editou.

4. Alternativa Visual: PDF com Campos de Formulário

Se o seu PDF já tiver campos de formulário preenchíveis (aqueles que você clica e digita), o TCPDF consegue preenchê-los pelo nome do campo (ex: "nome_cliente"), mas isso exige que o PDF tenha sido criado com essa tecnologia (AcroForms). Se o seu PDF for apenas uma "imagem" estática, o método de coordenadas SetXY acima é o único caminho.


2

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

Laravel (227) PHP (151) linux (124) Variados (110) ubuntu (58) Dicas (58) developer (48) postgresql (45) database (44) sql (42) Docker (32) front-end (31) mysql (31) devops (26) webdev (24) programming (23) tecnologia (19) eloquent (19) aws (19) dba (18) OUTROS (17) backend (16) laravelphp (16) debian (12) dev (12) 100DaysOfCode (10) git (10) react (10) reactjs (10) inteligencia-artificial (9) PHP Swoole (9) node (9) javascript (9) nginx (9) Architecture (8) linux-tools (8) vue (7) github (7) ciencia (7) webservice (6) jwt (6) vim (6) windows (6) arquitetura (6) nodejs (6) api (6) vscode (6) reactnative (5) rest (5) DevSecOps (5) servers (5) apache (5) macox (5) s3 (5) authentication (5) ia (5) shell (4) mongodb (4) angular (4) autenticacao (4) wsl (4) Swoole (4) lets-encrypt (4) query (4) Raspberry (4) angularjs (4) inteligenciadedados (4) Padrao de design (4) artigo (4) google (4) npm (4) openai (4) Kubernetes (4) gitlab (4) opensource (4) mariadb (4) jenkins (4) json (3) authorization (3) phpswoole (3) ddd (3) blade (3) terminal (3) log (3) mac (3) fedora (3) containers (3) ssh (3) bash (3) hardware (3) tests (3) macos (3) web (2) jobs (3) websocket (3) db (3) politica (3) js (3) mysqli (3) Black Hat (3) RabbitMQ (3) educacao (3) intel (3) CMS (2) sail (3) script (3) performance (3) bancodedados (2) tailwind (2) homeOffice (2) html (2) openswoole (2) artificialintelligence (2) security (2) seguranca (2) auth (2) cron (2) phpunit (2) kube (2) multiple_authen (2) policia (2) neovim (2) golang (2) noticias (2) livros (2) Transcribe (2) ElonMusk (2) redis (2) claude (2) ArchLinux (2) java (2) saude (1) phpfpm (2) autorizacao (2) monitoring (2) laptop (2) gnome (2) powerbi (2) telefonia (2) nvm (2) imagick (2) maps (2) colors (2) Passport (2) JQuery (2) Curisidades (2) Solid (2) zsh (2) Go (2) BigLinux (2) POO (2) LazyVim (2) gource (2) Python (2) Oauth2 (2) android (2) unix (2) magento (2) iot (2) ffmpeg (2) combustivel (2) webhook (2) microservices (2) Migration (1) workflow (1) cqrs (1) kitematic (1) geospacial (1) yeshua (1) data (1) sonarqube (1) Axios (1) pipelines (1) Mozilla (1) kvm (1) GitOps (1) sqlite (1) podcast (1) n8n (1) LaravelFilament (1) God (1) DesenvolvimentoProfissional (1) sw (1) bigtech (1) postgres (1) NoCookies (1) LeetCode (1) governancadedados (1) prf (1) nosql (1) Lideranca (1) Hackers (1) Bots (1) pytorch (1) nuxt (1) liquid (1) ec2 (1) transaction (1) c4 (1) rancher (1) algoritimo (1) Observability (1) Elasticsearch (1) translate (1) certbot (1) Oh My Zsh (1) ibm (1) escopos (1) usb (1) ckeditor (1) API_KEY_GOOGLE_MAPS (1) Manjaro (1) vicuna (1) coding (1) rust (1) markdown (1) JasperReports (1) Fibonacci (1) community (1) Samurai (1) payment (1) messaging (1) Jesus (1) flutter (1) militar (1) fullsta (1) smartphones (1) automacao (1) Monitor (1) zend (1) spaceship (1) PKCE (1) l2tp (1) Glacier (1) laraveloctane (1) Deus (1) binaural (1) gpt (1) bolsonaro (1) privacidade (1) linkedin (1) documentation (1) brain (1) adb (1) nvidia (1) host (1) ecommerce (1) c4-models (1) altadisponibilidade (1) octane (1) lucena (1) http (1) TypeScript (1) chatgpt (1) idiomas (1) eventdrive (1) uuid (1) restfull (1) aplicativo (1) optimization (1) mapas (1) Fetch (1) collections (1) RustLang (1) matematica (1) Filament (1) compactar (1) paypal (1) microg (1) forcas armadas (1) front (1) cor (1) auth (1) modelagemdedados (1) k8s (1) gasolina (1) wsl2 (1) csv (1) soap (1) piada (1) KubeCon (1) zorin-os (1) spring-boot (1) backup (1) playwright (1) Deepin (1) storage (1) benchmark (1) networking (1) Swoole (1) biologia (1) node-red (1) LETSENCRYPT (1) Grunt (1) Diagramas (1) boot (1) haru (1) dracula (1) TrabalhoEmEquipe (1) Brasil (1) queue (1) agi (1) llama (1) hotfix (1) economia (1) transcription (1) cache (1) Amazon (1) October (1) lumen (1) Hyperf (1) replication (1) faceapp (1) vala (1) cloudstack (1) rpi (1) apple (1) oracle (1) iode (1) ffaa (1) vpn (1) MeioAmbiente (1) firefox (1) composer (1) scheduling (1) Asahi (1) pendrive (1) microservice (1) front (1) wine (1) covid19 (0) services (1) phpjasper (1) models (1) kali-linux (1) geojson (1) yarn (1) picpay (1) Monolith (1) banco (1) PNPM (1) Desenvolvedor (1) Structurizr (1) symfony (1) presenter (1) lider (1) guard (1) tensorflow (1) bootstrap (1) nuance (1) historia (1) dropbox (1) traefik (1) bug (1) akitando (1) llm (1) htm (1) transformers (1) cavalotroia (1) odd (1) m1 (1) Error (1) cinnamon (1) repmgr (1) federal (1) ruby (1) AppSec (1) orm (1) ArquiteturaDeSoftware (1) Passwordless (1) memcached (1) flow (1) compression (1) athena (1) controllers (0) OOD (0)

New Articles



Get Latest Updates by Email