Autor Zpráva
Tomášeek
Profil
Ahoj,

peru se mPDF ve verzi 6.0 a nedaří se mi vytvořit z nadpisů v dokumentu obsah, čili "table of contents, ToC", který by měl také číslo stránky.

<?php
$mpdf = new mPDF(...);
...
$mpdf->setAutoTopMargin = 'stretch';
$mpdf->setAutoBottomMargin = 'stretch';
$mpdf->SetHTMLHeader('...');
$mpdf->SetHTMLFooter('Strana {PAGENO} z {nb}');

$mpdf->WriteHTML('PREBAL DOKUMENTU');

$mpdf->TOCpagebreak();
$mpdf->h2toc = array('H2'=>1, 'H3'=>2);

$mpdf->WriteHTML('OBSAH');
$mpdf->Output();

Výsledek:
1. strana (PREBAL DOKUMENTU) má v zápatí "Strana 1 z 3"
2. strana (TABLE OF CONTENTS) má v zápatí "Strana z 3" -- CHYBA
3. strana (OBSAH) má v zápatí "Strana 2 z 3" -- CHYBA

Strana 3 z 3 neexistuje. Dokument má správně 3 stránky, ale chybně uvedená čísla stránek.


Ještě, ač to nesouvisí s tím, co píši výše, máte někdo zkušenost, jak nad ToC přidat nějaký nadpis, třeba "TOC"? Finální PDF by pak bylo:

PREBAL DOKUMENTU
...
Strana 1 z 3
--------------
TOC
generované ToC
...
Strana 2 z 3
--------------
OBSAH
...
Strana 3 z 3
--------------

Děkuji
rafej
Profil
U obsahu (TOC) se negeneruje číslování - je potlačeno. Lze zapnout:
$mpdf->TOCpagebreak(supress=0);

Nebo vynechat číslování u přebalu a obsahu a opravit očíslování zbytku dokumentu. Místo {nb}, která vkládá skutečný fyzický počet stran, použít {nbpg}, která se řídí podle <pagebreak> a oddílů.

Nadpis před obsah by měl jít vložit pomocí:
$mpdf->TOCpagebreak($toc-preHTML='<h2>Obsah</h2>');
viz parametry na mpdf.github.io/reference/mpdf-functions/tocpagebreak.html
Tomášeek
Profil
rafej:
Děkuji. Referenci jsem četl, ale přiznávám, že jsem nevěděl, jak naložit s těmi parametry. Dodám, že závorky musí být escapované. To jen pro budoucí generace.

Vzhledem k tomu, že mPDF evidentně znáš, ještě tě poprosím o jednu radu. Vypnutí stránkování přebalu a ToC je dobrý nápad, ale jak ho vynutit? V ToC se mi to povedlo, resetovat počítadlo také (1. stránka po ToC není č. 3, ale č. 1), ale zároveň jedničku má také přebal.

U ToC se mi ukazuje "Strana z", jde ten kód "Strana {PAGENO} z {nbpg}" opodmínkovat, aby byl jen od ToC dále? V té uživatelské příručce jsem to nenašel.
rafej
Profil
Tomášeek:
Vypnutí stránkování přebalu

Můžeš to vyřešit jednoduše tím, že stránkám, kde nechceš číslování, vytvoříš jinou patičku. Může být i prázdná.

$mpdf->SetHTMLFooter(); (před začátek dokumentu)

$mpdf->SetHTMLFooter('Strana {PAGENO} z {nb}'); (za obsahem, před zbytkem dokumentu)

Je ale nutné to zkombinovat s použitím zalomení stránky buď pomocí $mpdf->AddPage(); nebo <pagebreak> v šabloně.

Příklady na pravé a levé záhlaví, vynechání číslování na první straně a kombinaci s rejstříkem nalezneš v dokumentaci tady: mpdf.github.io/headers-footers/method-2.html#table-of-contents, mrkni na to, ať máš představu o správné kombinaci a pořadí funkcí.
Tomášeek
Profil
rafej:
Jasně, začíná to dávat smysl, ale pořád se mi to nedaří dotáhnout, i když už se blížím.

Rozdělil jsem si šablonu dokumentu na dvě, tpl.html a tpl_hp.html.

tpl_hp.html
<div id="wrapper">PREBAL + ToC</div>
<tocpagebreak toc-preHTML="&lt;DIV CLASS=WRAPPER&gt;&lt;H2&gt;Obsah dokumentu&lt;/H2&gt;" toc-postHTML="" links="OFF" toc-sheet-size="A4" toc-resetpagenum="0" resetpagenum="1" toc-pageselector="toc" outdent="-20mm" toc-bookmarkText="Obsah dokumentu"/>

tpl.html
<div id="wrapper">...</div>
<pagebreak>
<div id="wrapper">...</div>
<pagebreak>
<div id="wrapper">...</div>

zpracovani.php
$mpdf->setAutoTopMargin = 'stretch';
$mpdf->setAutoBottomMargin = 'stretch';
$mpdf->SetHTMLHeader('header');
$mpdf->SetHTMLFooter('');
$mpdf->h2toc = array('H2'=>1);
$mpdf->WriteHTML($template_hp); // vlož prebal + ToC, footer by měl být nastaven bez stránkování

$mpdf->SetHTMLHeader('header');
$mpdf->SetHTMLFooter('footer se strankovanim'); // toto by se melo zobrazit jen pro tpl.html, tedy az za ToC, ale zobrazuje se i v ToC (bez čísel stránek, "Strana z"). Dále číslování dokumentu správně až do konce.

$mpdf->WriteHTML($template);

// $mpdf->SetHTMLHeader('header');
// $mpdf->SetHTMLFooter('pokusny footer'); // tyto dva řádky jsem zkusil přidat ze zoufalství. Pokud je odkomentuji, "pokusny footer" se mi vypíše jak u ToC, tak u poslední stránky dokumentu (absolutně nechápu ani jedno, ani druhé). Stránkování pak je "[nic] (prebal)", "pokusny footer (ToC???)", "1 z 9", "2 z 9", ... "8 z 9", "pokusny footer (???)"
$mpdf->Output();

Zkoušel jsem ty footery různě posouvat, měnit, ale vždy jsem se dostal do chybového stavu popsaného na ř. 9 (zobrazení i v ToC), nebo ř. 14 (nezobrazení v ToC, ale zároveň nezobrazení na poslední textové straně dokumentu).
rafej
Profil
Nepomůže tohle? Jen si ověř, že ti AddPage() negeneruje prázdný stránky navíc, pokud je nechceš. Zalamuje a resetuje vlastnosti dokumentu, ale někdy přidá prázdnou stránku (nebo i víc) a někdy ne. Záleží na tom, jaké předáváš parametry a jestli máš dokument s rozlišením na pravé a levé strany.

$mpdf->SetAutoTopMargin = 'stretch';
$mpdf->SetAutoBottomMargin = 'stretch';
$mpdf->SetHTMLFooter();
$mpdf->AddPage('', '', 1, '', 'on'); 
$mpdf->h2toc = array('H2'=>1);
$mpdf->WriteHTML($template_hp); // vlož prebal + ToC, footer by měl být nastaven bez stránkování
 
$mpdf->AddPage('','E');
$mpdf->SetHTMLFooter('Strana {PAGENO} z {nbpg}');
$mpdf->WriteHTML($template);
 
$mpdf->Output();

Pokud problém u ToC zůstane, zkus v šabloně přidat u tocpagebreak parametry pro definici vlastního zápatí obsahu:toc-odd-footer-name, toc-odd-footer-value, takže je nebude dědit od zbytku dokumentu.
Budeš si muset to zápatí ale pojmenovat, na defaultní hodnotu bych moc nespoléhala, protože se zdá, že za předchozí použitou hodnotu asi považuje poslední stranu dokumentu.
Tady je to docela hezky rozpitvané:
www.pivotmedia.net/sys3/3rdparty/mpdf/README%20TABLE%20OF%20CONTENTS.txt
www.pivotmedia.net/sys3/3rdparty/mpdf/README%20PAGING.txt

Problém je v tom, že se dá spousta věcí nastavovat více způsoby, ne vždy rovnocenými a občas to dá práci nakombinovat dohromady.
Tomášeek
Profil
rafej:
Dokument mám bez rozlišení levé/pravé strany. Všechny jsou stejné.

Tvůj kód, i když ho zkopíruju, tak mi vrací to samé, jako ten můj, co jsem uvedl výše. Zkusil jsem k tocpagebreak přidat i argumenty toc-even/odd-footer-name/value="a" (celkem 4 ks), ale bez odezvy, jako by byly ignorovány, vidím stále "Strana z", nikoliv "a", jak jsem se domníval.
Tomášeek
Profil
Tak po další více než hodině čachrování s různými nastaveními, snahy sáhnout před exportem přímo do $mpdf a hodnotu footeru ručně přepsat (což se mi nepodařilo, změna se projevila buď na přebalu, nebo na straně následující za ToC - divné!) jsem to "vyřešil".

K tocpagebreak jsem přidal parametr toc-footer-margin="-10000", kterým jsem patičku této stránky vystřelil mimo zobrazovanou plochu. Vím, že řešení to není nic moc, ale je pro mě dostačující. Více se s tím trápit nechci, jedná se jen o jeden projekt, nikoliv řešení "na všude".

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: