如何使用TCPDF创建动态内容表部分,内容项作为标题标题?

时间:2018-05-29 07:43:19

标签: php laravel tcpdf

我正在使用TCPDF库在Laravel Project中动态生成PDF文件。

我需要动态创建“内容表”部分,并使用“摘要”标题设置每个页面的标题。并提供下面每个项目的链接,这将引导用户开始该部分/内容。

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 :(得分:1)

说实话,您所描述的内容类似于示例45的内容,其中包括TCPDF示例,您可以通过使用内置的TOC生成器来获得。

我不喜欢该示例的地方是缺少正文。因此,我创建了一个具有非常基本的文档结构和下面随机生成的文本的简单示例。这样的想法是,在开始为每个部分编写内容之前,先设置一个书签,然后由TOC生成器来完成其余的工作。

在呈现内容之前立即设置书签即可,因此您不必计算书签的位置。默认情况下,它将采用当前位置。为了简单起见,我在这里使用预构建的数组和非常基本的输出。

注释:

  1. 在某些情况下,内容会立即溢出到下一页而不在当前页面上输出。由于您可能没有遇到此问题,因此我决定暂时将其排除在范围之外,但我想我会注意到它发生的可能性。
  2. 这似乎很明显,但是无论如何都值得一提:如果在开始新部分之前添加页面,请在 addPage之后调用书签方法。

您可以查看我的脚本的输出:here

如上所述,我基于示例045,您可以view on the TCPDF example page。您也可以使用HTML来格式化通过这种方式制作的TOC条目see example 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');

作为参考,在撰写本文时,用于Bookmark的参数位于:

@param $ txt (字符串)书签说明。
@param $ level (int)书签级别(最小值为0)。
@param $ y (浮动)所选页面上书签的用户单位中的Y位置(默认= -1 =当前位置; 0 =页面开始;)。 br /> @param $ page (int | string)目标页号(当前页留空)。如果在页码前加上*字符,则添加/删除/移动页面时不会更改该页面。
@param $ style (字符串)字体样式:B =粗体,I =斜体,BI =粗体+斜体。
@param $ color (数组)RGB颜色数组(值从0到255)。
@param $ x (浮动)在所选页面上书签的用户单位中的X位置(默认= -1 =当前位置;)。
@param $ link (混合)URL或数字链接ID,或命名目标(#字符,后跟目标名称),或嵌入式文件(*字符,后跟文件名)。