Как создать динамический раздел таблицы содержимого с использованием TCPDF с элементами содержимого в качестве заголовка заголовка? - PullRequest
0 голосов
/ 29 мая 2018

Я использую библиотеку TCPDF для динамического создания PDF-файла в моем проекте Laravel.

У меня есть требование динамически создавать раздел «Таблица содержания» и устанавливать заголовок каждой страницы с помощью заголовков «Сводка».И дать ссылку на каждый пункт ниже, который приведет пользователя к началу этого раздела / контента.

Example:

My Table Of Content

Summary ............................... 1
Organization & Management Structure.... 5
Credit History......................... 7
Public Records......................... 8

Итак,

My page 1 should have header as Summary
Page 2 to 4 should have header as Summary(Cont.)
Page 5 => Organization & Management Structure
Page 6 => Organization & Management Structure(Cont.) 
Page 7 => History 
Page 8 => Public Records

Если вы можете помочь мне, отправив несколько хитростейЯ могу использовать, чтобы завершить это, это будет отличная помощь.Спасибо!

1 Ответ

0 голосов
/ 30 июня 2018

Честно говоря, то, что вы описываете, звучит как содержание примера 45, включая примеры TCPDF, которые вы можете получить, просто используя встроенный генератор TOC.

Что-то, что мне не понравилось в примере, это отсутствие основного текста.Поэтому я создал простой пример с очень простой структурой документа и произвольно сгенерированным текстом ниже.Идея будет заключаться в том, что вы устанавливаете закладку прямо перед тем, как начнете писать свой контент для каждого раздела, а затем генератор TOC сделает все остальное.

Установка закладки прямо перед рендерингом вашего контента делает так, чтобы вы не делали этого.должны рассчитать положение закладки.По умолчанию это займет текущую позицию.Здесь я использую готовый массив и очень простой вывод для простоты.

Примечания:

  1. здесь могут быть крайние случаи, когда содержимое немедленно перетекает на следующую страницу без вывода на текущую страницу.Я решил, что пока это выходит за рамки, так как вы, возможно, не столкнетесь с этим, но подумал, что смогу заметить, что это может произойти.
  2. Это может показаться очевидным, но все равно стоит упомянуть: если добавление страницы происходит раньшеначиная новый раздел, вызовите метод 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-адрес, или числовой идентификатор ссылки, или именованный адресат (символ #, сопровождаемый именем адресата), или внедренный файл (символ *, сопровождаемый именем файла).

...