Documentos PDF
mad-doc-page
mad-doc-heading
mad-doc-text
mad-doc-image
mad-doc-page é a raiz de todo documento
Define tamanho (A4/A5/Letter/Legal), orientação, margens, fonte e marca d'água — e é o
único bloco que gera a página HTML completa (DOCTYPE + estilos de impressão). Por isso
ele só aparece no wrapper interno de cada exemplo (veja o botão "Ver PDF" abaixo de cada
um): incluí-lo no preview ao vivo vazaria o CSS de página impressa para esta tela do
Tutor.
Título e texto
mad-doc-heading (níveis 1-4) + mad-doc-text com alinhamentos.
Relatório de Boas-vindas
Gerado pelo MAD Lab via Mad\Doc\MadDocPdf::fromHtml().
Recursos deste bloco
mad-doc-heading aceita níveis 1 a 4 (tamanho e peso decrescentes) e mad-doc-text é o
parágrafo padrão — ambos herdam fonte e cor do mad-doc-page ao redor.
Alinhamentos
Alinhado à esquerda (padrão).
Centralizado.
Alinhado à direita.
resources/views/tutor/examples/pdf-basico/titulo-texto.blade.php
<mad-doc-heading :level="1" align="center" color="#1e3a8a">Relatório de Boas-vindas</mad-doc-heading>
<mad-doc-text align="center" color="#64748b">Gerado pelo MAD Lab via Mad\Doc\MadDocPdf::fromHtml().</mad-doc-text>
<mad-doc-horizontal-line :thickness="1" color="#d1d5db" :margin-y="8" />
<mad-doc-heading :level="2">Recursos deste bloco</mad-doc-heading>
<mad-doc-text align="justify">
mad-doc-heading aceita níveis 1 a 4 (tamanho e peso decrescentes) e mad-doc-text é o
parágrafo padrão — ambos herdam fonte e cor do mad-doc-page ao redor.
</mad-doc-text>
<mad-doc-heading :level="3" color="#16a34a">Alinhamentos</mad-doc-heading>
<mad-doc-text align="left">Alinhado à esquerda (padrão).</mad-doc-text>
<mad-doc-text align="center">Centralizado.</mad-doc-text>
<mad-doc-text align="right">Alinhado à direita.</mad-doc-text>
Imagem
mad-doc-image com logo embutido via data URI.
mad-doc-image aceita data URI
Imagens remotas (http/https) são bloqueadas por padrão pelo DOMPDF — use data URI (como
acima) ou habilite isRemoteEnabled nas opções de MadDocPdf::fromHtml().
resources/views/tutor/examples/pdf-basico/imagem.blade.php
@php
$tutorLogoSvg = 'data:image/svg+xml;base64,' . base64_encode(
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120">'
. '<rect width="120" height="120" rx="16" fill="#1e3a8a"/>'
. '<text x="60" y="76" text-anchor="middle" fill="#fff" font-size="52" font-family="Arial">M</text>'
. '</svg>'
);
@endphp
<mad-doc-image :src="$tutorLogoSvg" :width-mm="30" align="center" alt="Logo" />
<mad-doc-heading :level="2" align="center">mad-doc-image aceita data URI</mad-doc-heading>
<mad-doc-text align="center" color="#64748b">
Imagens remotas (http/https) são bloqueadas por padrão pelo DOMPDF — use data URI (como
acima) ou habilite isRemoteEnabled nas opções de MadDocPdf::fromHtml().
</mad-doc-text>
Código-fonte completo da página
app/control/Tutor/TutorPdfBasico.php
<?php
namespace App\Control\Tutor;
use App\Support\Tutor\TutorPage;
use Mad\Doc\MadDocPdf;
use Mad\Service\MadUploadStorage;
use Mad\View\MadBlade;
/**
* TutorPdfBasico — PDF básico: mad-doc-page, mad-doc-heading, mad-doc-text,
* mad-doc-image.
*
* mad-doc-page NUNCA aparece nos parciais usados no preview ao vivo de
* <x-tutor-demo> (resources/views/tutor/examples/pdf-basico/*.blade.php, sem
* sufixo "-doc"): ele emite <!DOCTYPE html><html><head><style>...</style>
* com regras GLOBAIS (body/h1..h4/p/a/hr...) — incluído dentro da própria
* página do Tutor (que roda no MESMO MadBladeCompiler, via MadComponent::
* render() → MadBlade::render()), esse CSS vazaria pra tela inteira do
* admin. Cada exemplo tem um irmão "<exemplo>-doc.blade.php" que só existe
* pra embrulhar o MESMO parcial em <mad-doc-page> na hora de gerar o PDF —
* nunca incluído ao vivo.
*
* Sem rota própria (fora do escopo deste lote — proibido mexer em routes/):
* o PDF é gerado aqui no mount() e gravado no disco de uploads via
* MadUploadStorage::putContent(); o botão "Ver PDF" da página aponta pra
* mad_download_url(), servida pela rota mad.download JÁ existente
* (MadDownloadController — Content-Type: application/pdf, inline).
*/
class TutorPdfBasico extends TutorPage
{
protected string $catalogKey = 'pdf_basico';
private const EXEMPLOS = ['titulo-texto', 'imagem'];
/** exemplo => URL assinada do PDF já gerado (mad.download). */
public array $pdfUrls = [];
public function mount(array $params = []): void
{
foreach (self::EXEMPLOS as $exemplo) {
$this->pdfUrls[$exemplo] = $this->gerarPdf($exemplo);
}
}
private function gerarPdf(string $exemplo): string
{
$html = MadBlade::render('tutor.examples.pdf-basico.' . $exemplo . '-doc');
$pdf = MadDocPdf::fromHtml($html);
$path = 'tutor-pdf/pdf-basico/' . $exemplo . '.pdf';
MadUploadStorage::putContent($path, $pdf);
return mad_download_url($path);
}
}
resources/views/tutor/pdf/basico.blade.php
<x-tutor-page page="pdf_basico">
<mad-callout type="info" title="mad-doc-page é a raiz de todo documento" icon="file-text">
Define tamanho (A4/A5/Letter/Legal), orientação, margens, fonte e marca d'água — e é o
único bloco que gera a página HTML completa (DOCTYPE + estilos de impressão). Por isso
ele só aparece no wrapper interno de cada exemplo (veja o botão "Ver PDF" abaixo de cada
um): incluí-lo no preview ao vivo vazaria o CSS de página impressa para esta tela do
Tutor.
</mad-callout>
<x-tutor-demo demo="tutor.examples.pdf-basico.titulo-texto"
title="Título e texto" desc="mad-doc-heading (níveis 1-4) + mad-doc-text com alinhamentos." />
<div style="margin:8px 0 24px;">
<mad-btn variant="primary" icon="file-text" :href="$pdfUrls['titulo-texto']"
attrs='target="_blank" rel="noopener"'>Ver PDF</mad-btn>
</div>
<x-tutor-demo demo="tutor.examples.pdf-basico.imagem"
title="Imagem" desc="mad-doc-image com logo embutido via data URI." />
<div style="margin:8px 0 24px;">
<mad-btn variant="primary" icon="file-text" :href="$pdfUrls['imagem']"
attrs='target="_blank" rel="noopener"'>Ver PDF</mad-btn>
</div>
</x-tutor-page>