Posted on: March 16, 2026 01:32 AM
Posted by: Renato
Categories: Laravel
Views: 26
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()eimportPage()para cada uma delas dentro de umfor, 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.
Donate to Site
Renato
Developer