Честно говоря, то, что вы описываете, звучит как содержание примера 45, включая примеры TCPDF, которые вы можете получить, просто используя встроенный генератор TOC.
Что-то, что мне не понравилось в примере, это отсутствие основного текста.Поэтому я создал простой пример с очень простой структурой документа и произвольно сгенерированным текстом ниже.Идея будет заключаться в том, что вы устанавливаете закладку прямо перед тем, как начнете писать свой контент для каждого раздела, а затем генератор TOC сделает все остальное.
Установка закладки прямо перед рендерингом вашего контента делает так, чтобы вы не делали этого.должны рассчитать положение закладки.По умолчанию это займет текущую позицию.Здесь я использую готовый массив и очень простой вывод для простоты.
Примечания:
- здесь могут быть крайние случаи, когда содержимое немедленно перетекает на следующую страницу без вывода на текущую страницу.Я решил, что пока это выходит за рамки, так как вы, возможно, не столкнетесь с этим, но подумал, что смогу заметить, что это может произойти.
- Это может показаться очевидным, но все равно стоит упомянуть: если добавление страницы происходит раньшеначиная новый раздел, вызовите метод Bookmark после addPage.
Вы можете просмотреть вывод моего скрипта: здесь
Какупомянуто, я основал это на примере 045, который вы можете просмотреть на странице примера TCPDF .Вы также можете использовать HTML для форматирования записей TOC, сделанных таким образом, см. Пример 059 .
<?php
// Include the main TCPDF library (search for installation path).
// Change this for your installation.
require_once('TCPDF-6.2.17/tcpdf.php');
// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT,
PDF_PAGE_FORMAT, true, 'UTF-8', false);
// set default monospaced font
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
// set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
//These will become the different colors for our TOC labels.
//Main section is a dark blue, sub-section is a lighter blue. This is
//strictly optional, but I kind of like it myself.
$level_colors = array(
0 => array(0, 0, 66),
1 => array(0, 0, 100),
2 => array(0, 0, 130),
);
/**
* Just produces some filler text.
*/
function gen_random_section_text($min = 70, $max = 300) {
$words = array('Iris', 'Daffodil', 'Dandelion', 'Daisy', 'Orchid', 'Lily',
'Rhododendron', 'Sakura', 'Blossom', 'Larkspur', 'Anemone', 'Hydrangea');
$word_max_index = count($words)-1;
$word_count = rand($min, $max);
$output = array();
for($i = 0; $i < $word_count; $i++) {
$output[] = $words[rand(0, $word_max_index)];
}
return implode(' ', $output);
}
// ---------------------------------------------------------
// set font
$pdf->SetFont('times', '', 14);
/**
* I'll build our list of sections outright for this example.
*/
$sections[] = array(
'title' => 'Summary',
'content' => '<p>'.gen_random_section_text(20,30).'</p>',
'level' => 0,
);
$sections[] = array(
'title' => 'Organization & Management',
'content' => '<p>'.gen_random_section_text(100,200).'</p>'.
'<p>'.gen_random_section_text(120,230).'</p>',
'level' => 0,
);
$sections[] = array(
'title' => 'Hiring Procedures',
'content' => '<p>'.gen_random_section_text(100,200).'</p>',
'level' => 1,
);
$sections[] = array(
'title' => 'In Absence of HR',
'content' => '<p>'.gen_random_section_text(30,100).'</p>',
'level' => 2,
);
$sections[] = array(
'title' => 'History',
'content' => '<p>'.gen_random_section_text().'</p>',
'level' => 0,
);
$sections[] = array(
'title' => 'History (1990-2000)',
'content' => '<p>'.gen_random_section_text().'</p>',
'level' => 1,
);
$sections[] = array(
'title' => 'History (2001-Present)',
'content' => '<p>'.gen_random_section_text().'</p>',
'level' => 1,
);
//Now we'll take our fake sections and add pages/content as needed.
foreach($sections as $section) {
$headertag = 'h1';
if(empty($section['level'])) {
//Both not set and value of 0 will evaluate true here.
//I'm adding new pages for any top-level section here, but you don't need to.
$pdf->addPage();
$level = 0;
} else {
//Any non-zero level header I'll give an h2.
$headertag = 'h2';
$level = $section['level'];
}
//We add a bookmark right before we start our output for the section copy.
$bookmark_style = $level > 0 ? 'I' : 'B'; //Make subheading italic.
$pdf->Bookmark($section['title'], $level, -1, '', $bookmark_style, $level_colors[$level], -1, '');
//See below for some notes on the Bookmark method.
//Then we output our content.
$pdf->WriteHTML("<{$headertag}>".htmlspecialchars($section['title'], ENT_COMPAT, 'UTF-8').
"</{$headertag}> {$section['content']}");
}
// add a new page for TOC
$pdf->addTOCPage();
// write the TOC title
$pdf->SetFont('times', 'B', 16);
//Writes my little "TOC Note"
$pdf->MultiCell(0, 0, 'My Table Of Content', 0, 'C', 0, 1, '', '', true, 0);
$pdf->Ln();
$pdf->SetFont('dejavusans', '', 12);
// add a simple Table Of Content at first page
// (check the example n. 59 for the HTML version)
$pdf->addTOC(1, 'courier', '.', 'INDEX', 'B', array(128,0,0));
// end of TOC page
$pdf->endTOCPage();
//Close and output PDF document
$pdf->Output('example_045.pdf', 'I');
Для справки, параметры для Закладки на момент написания находятся здесь:
@ param $ txt (строка) Описание закладки.
@ param $ level (int) Закладкауровень (минимальное значение 0).
@ param $ y (float) Y позиция в пользовательских единицах закладки на выбранной странице (по умолчанию = -1 = текущая позиция; 0 = начало страницы;).
@ param $ page (int | string) Номер целевой страницы (оставьте пустым для текущей страницы).Если вы префикс номера страницы с символом *, то эта страница не будет изменена при добавлении / удалении / перемещении страниц.
@ param $ style (string) Стиль шрифта: B = полужирный, I = курсив, BI = полужирный + курсив.
@ param $ color (массив) Цветовой массив RGB (значения от 0 до 255).
@ param $ x (с плавающей точкой) X позиция в пользовательских единицах закладки на выбранной странице (по умолчанию = -1 = текущая позиция;).
@param $ link (смешанный) URL-адрес, или числовой идентификатор ссылки, или именованный адресат (символ #, сопровождаемый именем адресата), или внедренный файл (символ *, сопровождаемый именем файла).