MAD Lab
/
Tutor > Documentos PDF > PDF básico

PDF básico

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.

Logo
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>