Diogo Besson :: tecnologia

Cabeçalhos Diferentes usando mPDF

Cabeçalhos Diferentes usando mPDF

Cabeçalhos Diferentes usando mPDF. Como gerar um pdf com cabeçalhos diferentes, para páginas diferentes, através do mPDF?

Chegou no meu email, agora a pouco, uma pergunta interessante sobre a geração de pdf com a classe mPDF. O rapaz queria fazer um documento que tivesse um cabeçalho na primeira página e que as páginas seguintes mostrassem um cabeçalho diferente.

Imaginei que isso fosse possível e criei um boneco da ideia dele. Que tal fazermos um livro usando mPDF, então?

1º baixe a classe

Estou utilizando a versão 5.7.3, lançada dia 23 de Agosto de 2014
o Link é http://www.mpdf1.com/mpdf/index.php?page=Download

2º ESCREVA seu PHP

<?php
require_once("MPDF573/mpdf.php");
$mpdf = new mPDF();

$header1 = "Chapter 1|{PAGENO}|Book Title";
$header2 = "Chapter 2|{PAGENO}|Book Title";
$header3 = "Chapter 3|{PAGENO}|Book Title";

$footer1 = "Chapter 1|{PAGENO}|All Rights";
$footer2 = "Chapter 2|{PAGENO}|All Rights";
$footer3 = "Chapter 3|{PAGENO}|All Rights";

$cap1 = "<div><p>
Texto do Capitulo 1. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas hendrerit orci non nunc dictum auctor sed eu diam. Mauris quis auctor quam. Sed vel nisl vel dolor sollicitudin efficitur nec vitae lectus. Nullam pharetra quam lorem, et hendrerit tellus tempus suscipit. Vivamus ac euismod dolor. Ut egestas mauris nisl, ac cursus lacus pretium vitae. Quisque ac fringilla metus.</p>

<p>Ut pharetra dolor diam, quis commodo diam ornare vel. Mauris imperdiet tortor justo, non porttitor mauris convallis nec. Aliquam eget tempor ligula, vitae laoreet tortor. Nullam mollis odio nec sollicitudin bibendum. Integer sit amet pharetra lacus. Proin eget porta augue, at sollicitudin dui. Donec a feugiat sapien, vitae gravida nulla. Sed vel congue ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce posuere ante ut dictum tempus. Sed tristique congue est, a ultricies eros gravida sit amet.</p>
<pagebreak />
<p>Nam hendrerit lectus eu mauris porta, eget congue mauris tempor. Duis non porttitor lectus. Ut nec convallis metus. Integer pretium augue ut est gravida, a ullamcorper magna condimentum. Praesent in aliquam eros, ullamcorper gravida eros. Pellentesque in tortor ultrices neque accumsan ultricies. Ut bibendum leo eu erat sollicitudin, posuere congue magna auctor. Donec consectetur orci vel metus mollis ultricies. Vestibulum lobortis dignissim elit, et bibendum augue. Suspendisse potenti. Nullam at porta mi. Mauris in tortor elit. Cras porta suscipit velit id condimentum. Maecenas sit amet nunc tristique, tincidunt ligula sit amet, dapibus lorem. Phasellus iaculis dignissim nisi, eget aliquam massa sodales et.</p>
<pagebreak />
<p>Curabitur vitae nibh varius, consequat dui non, consectetur neque. Curabitur nec fermentum velit. Morbi eget porttitor urna, ac posuere lorem. In tellus mi, posuere vitae orci nec, fermentum sodales enim. Pellentesque in mattis dui, quis ultrices ante. Ut quis diam mattis, tempus leo sed, vehicula metus. Nunc tempor faucibus dui, ut euismod ex sagittis vel. Fusce mattis fermentum magna, quis mollis nisi rutrum ut. Cras scelerisque arcu eu nisi feugiat scelerisque. Nullam placerat dolor fringilla, laoreet ipsum sed, congue dolor. Curabitur in tellus vel turpis ultricies mattis et id ante. Sed dui magna, ultricies in aliquam vitae, interdum sed sem.</p>

<p>Cras malesuada dictum tortor, efficitur feugiat metus tristique sed. Nulla aliquet faucibus feugiat. Mauris scelerisque pellentesque mauris at lobortis. Phasellus sem erat, varius at finibus sit amet, pharetra ut sem. Cras vulputate aliquam lectus, quis imperdiet massa convallis ut. Nullam nisi odio, feugiat ac varius id, commodo quis mi. Phasellus facilisis convallis consequat.</p>
</div>
<pagebreak />
";
$cap2 = "<div><p>
Texto do Capitulo 2. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas hendrerit orci non nunc dictum auctor sed eu diam. Mauris quis auctor quam. Sed vel nisl vel dolor sollicitudin efficitur nec vitae lectus. Nullam pharetra quam lorem, et hendrerit tellus tempus suscipit. Vivamus ac euismod dolor. Ut egestas mauris nisl, ac cursus lacus pretium vitae. Quisque ac fringilla metus.</p>

<p>Ut pharetra dolor diam, quis commodo diam ornare vel. Mauris imperdiet tortor justo, non porttitor mauris convallis nec. Aliquam eget tempor ligula, vitae laoreet tortor. Nullam mollis odio nec sollicitudin bibendum. Integer sit amet pharetra lacus. Proin eget porta augue, at sollicitudin dui. Donec a feugiat sapien, vitae gravida nulla. Sed vel congue ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce posuere ante ut dictum tempus. Sed tristique congue est, a ultricies eros gravida sit amet.</p>
<pagebreak />
<p>Nam hendrerit lectus eu mauris porta, eget congue mauris tempor. Duis non porttitor lectus. Ut nec convallis metus. Integer pretium augue ut est gravida, a ullamcorper magna condimentum. Praesent in aliquam eros, ullamcorper gravida eros. Pellentesque in tortor ultrices neque accumsan ultricies. Ut bibendum leo eu erat sollicitudin, posuere congue magna auctor. Donec consectetur orci vel metus mollis ultricies. Vestibulum lobortis dignissim elit, et bibendum augue. Suspendisse potenti. Nullam at porta mi. Mauris in tortor elit. Cras porta suscipit velit id condimentum. Maecenas sit amet nunc tristique, tincidunt ligula sit amet, dapibus lorem. Phasellus iaculis dignissim nisi, eget aliquam massa sodales et.</p>
<pagebreak />
<p>Curabitur vitae nibh varius, consequat dui non, consectetur neque. Curabitur nec fermentum velit. Morbi eget porttitor urna, ac posuere lorem. In tellus mi, posuere vitae orci nec, fermentum sodales enim. Pellentesque in mattis dui, quis ultrices ante. Ut quis diam mattis, tempus leo sed, vehicula metus. Nunc tempor faucibus dui, ut euismod ex sagittis vel. Fusce mattis fermentum magna, quis mollis nisi rutrum ut. Cras scelerisque arcu eu nisi feugiat scelerisque. Nullam placerat dolor fringilla, laoreet ipsum sed, congue dolor. Curabitur in tellus vel turpis ultricies mattis et id ante. Sed dui magna, ultricies in aliquam vitae, interdum sed sem.</p>
<pagebreak />
<p>Cras malesuada dictum tortor, efficitur feugiat metus tristique sed. Nulla aliquet faucibus feugiat. Mauris scelerisque pellentesque mauris at lobortis. Phasellus sem erat, varius at finibus sit amet, pharetra ut sem. Cras vulputate aliquam lectus, quis imperdiet massa convallis ut. Nullam nisi odio, feugiat ac varius id, commodo quis mi. Phasellus facilisis convallis consequat.</p>
</div>
<pagebreak />
";
$cap3 = "<div><p>
Texto do Capitulo 3. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas hendrerit orci non nunc dictum auctor sed eu diam. Mauris quis auctor quam. Sed vel nisl vel dolor sollicitudin efficitur nec vitae lectus. Nullam pharetra quam lorem, et hendrerit tellus tempus suscipit. Vivamus ac euismod dolor. Ut egestas mauris nisl, ac cursus lacus pretium vitae. Quisque ac fringilla metus.</p>
<pagebreak />
<p>Ut pharetra dolor diam, quis commodo diam ornare vel. Mauris imperdiet tortor justo, non porttitor mauris convallis nec. Aliquam eget tempor ligula, vitae laoreet tortor. Nullam mollis odio nec sollicitudin bibendum. Integer sit amet pharetra lacus. Proin eget porta augue, at sollicitudin dui. Donec a feugiat sapien, vitae gravida nulla. Sed vel congue ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce posuere ante ut dictum tempus. Sed tristique congue est, a ultricies eros gravida sit amet.</p>

<p>Nam hendrerit lectus eu mauris porta, eget congue mauris tempor. Duis non porttitor lectus. Ut nec convallis metus. Integer pretium augue ut est gravida, a ullamcorper magna condimentum. Praesent in aliquam eros, ullamcorper gravida eros. Pellentesque in tortor ultrices neque accumsan ultricies. Ut bibendum leo eu erat sollicitudin, posuere congue magna auctor. Donec consectetur orci vel metus mollis ultricies. Vestibulum lobortis dignissim elit, et bibendum augue. Suspendisse potenti. Nullam at porta mi. Mauris in tortor elit. Cras porta suscipit velit id condimentum. Maecenas sit amet nunc tristique, tincidunt ligula sit amet, dapibus lorem. Phasellus iaculis dignissim nisi, eget aliquam massa sodales et.</p>
<pagebreak />
<p>Curabitur vitae nibh varius, consequat dui non, consectetur neque. Curabitur nec fermentum velit. Morbi eget porttitor urna, ac posuere lorem. In tellus mi, posuere vitae orci nec, fermentum sodales enim. Pellentesque in mattis dui, quis ultrices ante. Ut quis diam mattis, tempus leo sed, vehicula metus. Nunc tempor faucibus dui, ut euismod ex sagittis vel. Fusce mattis fermentum magna, quis mollis nisi rutrum ut. Cras scelerisque arcu eu nisi feugiat scelerisque. Nullam placerat dolor fringilla, laoreet ipsum sed, congue dolor. Curabitur in tellus vel turpis ultricies mattis et id ante. Sed dui magna, ultricies in aliquam vitae, interdum sed sem.</p>
<pagebreak />
<p>Cras malesuada dictum tortor, efficitur feugiat metus tristique sed. Nulla aliquet faucibus feugiat. Mauris scelerisque pellentesque mauris at lobortis. Phasellus sem erat, varius at finibus sit amet, pharetra ut sem. Cras vulputate aliquam lectus, quis imperdiet massa convallis ut. Nullam nisi odio, feugiat ac varius id, commodo quis mi. Phasellus facilisis convallis consequat.</p>
</div>
";

// la vai o primeiro capitulo
$mpdf->SetHeader($header1);
$mpdf->SetFooter($footer1);
$mpdf->WriteHTML($cap1);


// segundo
$mpdf->SetHeader($header2, "O|E", TRUE);
$mpdf->SetFooter($footer2, "O|E", TRUE);
$mpdf->WriteHTML($cap2);

//terceiro
$mpdf->SetHeader($header3, "O|E", TRUE);
$mpdf->SetFooter($footer3, "O|E", TRUE);
$mpdf->WriteHTML($cap3);


//gera
$mpdf->Output();

exit();
?>

 

3º Rode no browser pra ver como ficou

para os preguiçosos:

baixe o código fonte do exemplo aqui -> teste-header.php (arquivo compactado / .zip)

baixe o pdf gerado aqui -> mpdf-cabecalhos (pdf)

Algumas considerações

  • Como de costume, deixei as primeiras linhas para inclusão da classe e instância de objeto, ok?
  • Os cabeçalhos e rodapés foram pré definidos somente por causas didáticas. Eles podem ser gerados depois, pois estamos em runtime (tempo de execução)
  • Antes que me perguntem, SIM! Cada capítulo desse livro pode ser feito com html trazido do banco de dados. Dá pra usar controle de fluxo e tudo o mais que você sempre usou, lembrando que o charset tem que ser UTF-8. (veja mais aqui)
  • Se você não definir os parâmetros opcionais após a segunda geração de cabeçalho e rodapé, ele vai gerar na página errada, por isso, utilize “O|E”, TRUE ao chamar as funções, certo?
  • A documentação para criar esse boneco está disponível em http://mpdf1.com/manual/index.php?tid=253

abraço!

7 Comments

  1. Anderson

    Boa tarde amigo, achei seu post muito legal, ele cria uma linha abaixo do cabeçalho e acima do rodapé, tem como retirar essa linha?

  2. Diogo Besson (Post author)

    moleza

    veja só isso aqui -> http://mpdf1.com/manual/index.php?tid=149

    existe uma variável chamada LINE
    se você setar ela pra 0, a linha desaparece

    tem também $defaultheaderline e $defaultfooterline. A documentação não explica decentemente como setar ela pra 0, mas acredito que, se você conseguir manipular essa variável, a linha vai desaparecer.

    Seguindo o modelo de http://mpdf1.com/manual/index.php?tid=273 , eu tentaria da seguinte maneira:

    $mpdf->defaultheaderline = false;
    ou
    $mpdf->defaultheaderline = 0;
    e
    $mpdf->defaultfooterline = false;
    ou
    $mpdf->defaultfooterline = 0;

    []s!

  3. osvaldo

    Diogo eu tenho a mesma dificuldade, porém gostaria de gerar cabeçalhos diferentes com informações vindas do bd. e que o cabeçalho fosse definido automaticamente, tipo se a partir da pagina dois outro cabeçalho. mas que vai definir se tem pagina dois ou não são as informações do bd.
    Não sei se fui claro?
    Tipo tenho uma celula no bd que é um texto grande e necessita de outra pagina, dai sim o pdf gerado ira criar outro cabeçalho!

  4. osvaldo

    Seria algo tipo if ('{PAGENO}'==1){$mpdf->SetHeader($header1)}else{$mpdf->SetHeader($header2)}
    mas isso não funciona pois ele altera todas as paginas!!!

  5. Diogo Besson (Post author)

    Osvaldo, cadê os ““O|E”, TRUE ao chamar as funções” que eu falei pra usar? usando isso não resolve?

  6. osvaldo

    NÃO DEU!
    Já estou quase desistindo do mPDF!
    Vou continuar procurando, se você conseguir solucionar me avise!
    Grato desde já!

  7. Diogo Besson (Post author)

    vixe Osvaldo, então a coisa tá séria! rs
    Acho que isso tem algo a ver com a condição que você tá tentando usar (if .. {PAGENO}… )
    Mas não desiste, não. Dá uma olhada nessa documentação mais avançada (http://mpdf1.com/manual/index.php?tid=313). Quase certeza que tem algo lá que pode te ajudar.
    abraço.

Leave a Comment

O seu endereço de e-mail não será publicado.