32
1
mirror of https://github.com/vdm-io/tcpdf.git synced 2025-01-11 15:54:24 +00:00
This commit is contained in:
nicolaasuni 2011-06-23 17:12:20 +02:00
parent 0bf02281e7
commit ac09d91589
4 changed files with 193 additions and 42 deletions

View File

@ -1,3 +1,7 @@
5.9.097 (2011-06-23)
- The method setHtmlVSpace() now can be used also for tags: div, li, br, dt and dd.
- The Named Destination feature was added (check the example n. 15) - thanks to Christian Deligant.
5.9.096 (2011-06-19) 5.9.096 (2011-06-19)
- Bug item #3322234 "Surrogate pairs codes in arrUTF8ToUTF16BE" was fixed. - Bug item #3322234 "Surrogate pairs codes in arrUTF8ToUTF16BE" was fixed.

View File

@ -8,8 +8,8 @@ http://sourceforge.net/donate/index.php?group_id=128076
------------------------------------------------------------ ------------------------------------------------------------
Name: TCPDF Name: TCPDF
Version: 5.9.096 Version: 5.9.097
Release date: 2011-06-19 Release date: 2011-06-23
Author: Nicola Asuni Author: Nicola Asuni
Copyright (c) 2002-2011: Copyright (c) 2002-2011:
@ -45,7 +45,7 @@ Main Features:
* text rendering modes (fill, stroke and clipping); * text rendering modes (fill, stroke and clipping);
* multiple columns mode; * multiple columns mode;
* no-write page regions; * no-write page regions;
* bookmarks and table of content; * bookmarks, named destinations and table of content;
* text hyphenation; * text hyphenation;
* text stretching and spacing (tracking/kerning); * text stretching and spacing (tracking/kerning);
* automatic page break, line break and text alignments including justification; * automatic page break, line break and text alignments including justification;
@ -64,7 +64,7 @@ Source Code Documentation:
http://www.tcpdf.org/doc/ http://www.tcpdf.org/doc/
For Additional Documentation: For Additional Documentation:
http: www.tcpdf.org http://www.tcpdf.org
License License
Copyright (C) 2002-2011 Nicola Asuni - Tecnick.com S.r.l. Copyright (C) 2002-2011 Nicola Asuni - Tecnick.com S.r.l.

View File

@ -6,6 +6,7 @@
// //
// Description : Example 015 for TCPDF class // Description : Example 015 for TCPDF class
// Bookmarks (Table of Content) // Bookmarks (Table of Content)
// and Named Destinations.
// //
// Author: Nicola Asuni // Author: Nicola Asuni
// //
@ -81,7 +82,8 @@ $pdf->Bookmark('Chapter 1', 0, 0, '', 'B', array(0,64,128));
$pdf->Cell(0, 10, 'Chapter 1', 0, 1, 'L'); $pdf->Cell(0, 10, 'Chapter 1', 0, 1, 'L');
$pdf->SetFont('times', 'I', 14); $pdf->SetFont('times', 'I', 14);
$pdf->Write(0, 'You can set PDF Bookmarks using the Bookmark() method.'); $pdf->Write(0, 'You can set PDF Bookmarks using the Bookmark() method.
You can set PDF Named Destinations using the setDestination() method.');
$pdf->SetFont('times', 'B', 20); $pdf->SetFont('times', 'B', 20);
@ -104,13 +106,25 @@ $pdf->Bookmark('Paragraph 1.3', 1, 0, '', '', array(0,0,0));
$pdf->Cell(0, 10, 'Paragraph 1.3', 0, 1, 'L'); $pdf->Cell(0, 10, 'Paragraph 1.3', 0, 1, 'L');
$pdf->AddPage(); $pdf->AddPage();
// add a named destination so you can open this document at this page using the link: "example_015.pdf#chapter2"
$pdf->setDestination('chapter2', 0, '');
$pdf->Bookmark('Chapter 2', 0, 0, '', 'BI', array(128,0,0)); $pdf->Bookmark('Chapter 2', 0, 0, '', 'BI', array(128,0,0));
$pdf->Cell(0, 10, 'Chapter 2', 0, 1, 'L'); $pdf->Cell(0, 10, 'Chapter 2', 0, 1, 'L');
$pdf->SetFont('times', 'I', 14);
$pdf->Write(0, 'Once saved, you can open this document at this page using the link: "example_015.pdf#chapter2".');
$pdf->AddPage(); $pdf->AddPage();
$pdf->setDestination('chapter3', 0, '');
$pdf->SetFont('times', 'B', 20);
$pdf->Bookmark('Chapter 3', 0, 0, '', 'B', array(0,64,128)); $pdf->Bookmark('Chapter 3', 0, 0, '', 'B', array(0,64,128));
$pdf->Cell(0, 10, 'Chapter 3', 0, 1, 'L'); $pdf->Cell(0, 10, 'Chapter 3', 0, 1, 'L');
$pdf->AddPage();
$pdf->setDestination('chapter4', 0, '');
$pdf->SetFont('times', 'B', 20);
$pdf->Bookmark('Chapter 4', 0, 0, '', 'B', array(0,64,128));
$pdf->Cell(0, 10, 'Chapter 4', 0, 1, 'L');
// --------------------------------------------------------- // ---------------------------------------------------------
//Close and output PDF document //Close and output PDF document

207
tcpdf.php
View File

@ -1,9 +1,9 @@
<?php <?php
//============================================================+ //============================================================+
// File name : tcpdf.php // File name : tcpdf.php
// Version : 5.9.096 // Version : 5.9.097
// Begin : 2002-08-03 // Begin : 2002-08-03
// Last Update : 2011-06-19 // Last Update : 2011-06-23
// Author : Nicola Asuni - Tecnick.com S.r.l - Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com // Author : Nicola Asuni - Tecnick.com S.r.l - Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
// License : http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT GNU-LGPLv3 + YOU CAN'T REMOVE ANY TCPDF COPYRIGHT NOTICE OR LINK FROM THE GENERATED PDF DOCUMENTS. // License : http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT GNU-LGPLv3 + YOU CAN'T REMOVE ANY TCPDF COPYRIGHT NOTICE OR LINK FROM THE GENERATED PDF DOCUMENTS.
// ------------------------------------------------------------------- // -------------------------------------------------------------------
@ -57,7 +57,7 @@
// * text rendering modes (fill, stroke and clipping); // * text rendering modes (fill, stroke and clipping);
// * multiple columns mode; // * multiple columns mode;
// * no-write page regions; // * no-write page regions;
// * bookmarks and table of content; // * bookmarks, named destinations and table of content;
// * text hyphenation; // * text hyphenation;
// * text stretching and spacing (tracking/kerning); // * text stretching and spacing (tracking/kerning);
// * automatic page break, line break and text alignments including justification; // * automatic page break, line break and text alignments including justification;
@ -122,7 +122,7 @@
* <li>text rendering modes (fill, stroke and clipping);</li> * <li>text rendering modes (fill, stroke and clipping);</li>
* <li>multiple columns mode;</li> * <li>multiple columns mode;</li>
* <li>no-write page regions;</li> * <li>no-write page regions;</li>
* <li>bookmarks and table of content;</li> * <li>bookmarks, named destinations and table of content;</li>
* <li>text hyphenation;</li> * <li>text hyphenation;</li>
* <li>text stretching and spacing (tracking/kerning);</li> * <li>text stretching and spacing (tracking/kerning);</li>
* <li>automatic page break, line break and text alignments including justification;</li> * <li>automatic page break, line break and text alignments including justification;</li>
@ -134,7 +134,7 @@
* Tools to encode your unicode fonts are on fonts/utils directory.</p> * Tools to encode your unicode fonts are on fonts/utils directory.</p>
* @package com.tecnick.tcpdf * @package com.tecnick.tcpdf
* @author Nicola Asuni * @author Nicola Asuni
* @version 5.9.096 * @version 5.9.097
*/ */
// Main configuration file. Define the K_TCPDF_EXTERNAL_CONFIG constant to skip this file. // Main configuration file. Define the K_TCPDF_EXTERNAL_CONFIG constant to skip this file.
@ -146,7 +146,7 @@ require_once(dirname(__FILE__).'/config/tcpdf_config.php');
* TCPDF project (http://www.tcpdf.org) has been originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.<br> * TCPDF project (http://www.tcpdf.org) has been originally derived in 2002 from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org), but now is almost entirely rewritten.<br>
* @package com.tecnick.tcpdf * @package com.tecnick.tcpdf
* @brief PHP class for generating PDF documents without requiring external extensions. * @brief PHP class for generating PDF documents without requiring external extensions.
* @version 5.9.096 * @version 5.9.097
* @author Nicola Asuni - info@tecnick.com * @author Nicola Asuni - info@tecnick.com
*/ */
class TCPDF { class TCPDF {
@ -157,7 +157,7 @@ class TCPDF {
* Current TCPDF version. * Current TCPDF version.
* @private * @private
*/ */
private $tcpdf_version = '5.9.096'; private $tcpdf_version = '5.9.097';
// Protected properties // Protected properties
@ -1628,6 +1628,13 @@ class TCPDF {
*/ */
protected $pdflayers = false; protected $pdflayers = false;
/**
* A dictionary of names and corresponding destinations (Dests key on document Catalog).
* @protected
* @since 5.9.097 (2011-06-23)
*/
protected $dests = array();
/** /**
* Directory used for the last SVG image. * Directory used for the last SVG image.
* @protected * @protected
@ -10971,7 +10978,34 @@ class TCPDF {
protected function _putcatalog() { protected function _putcatalog() {
$oid = $this->_newobj(); $oid = $this->_newobj();
$out = '<< /Type /Catalog'; $out = '<< /Type /Catalog';
$out .= ' /Version /'.$this->PDFVersion;
//$out .= ' /Extensions <<>>';
$out .= ' /Pages 1 0 R'; $out .= ' /Pages 1 0 R';
//$out .= ' /PageLabels ' //...;
$out .= ' /Names <<';
if ((!empty($this->javascript)) OR (!empty($this->js_objects))) {
$out .= ' /JavaScript '.($this->n_js).' 0 R';
}
$out .= ' >>';
if (!empty($this->dests)) {
$out .= ' /Dests <<';
foreach($this->dests as $name => $o) {
$out .= ' /'.$name.' '.sprintf('[%u 0 R /XYZ 0 %.2F null]', $this->page_obj_id[($o['p'])], ($this->pagedim[$o['p']]['h'] - ($o['y'] * $this->k)));
}
$out .= ' >>';
}
$out .= $this->_putviewerpreferences();
if (isset($this->LayoutMode) AND (!$this->empty_string($this->LayoutMode))) {
$out .= ' /PageLayout /'.$this->LayoutMode;
}
if (isset($this->PageMode) AND (!$this->empty_string($this->PageMode))) {
$out .= ' /PageMode /'.$this->PageMode;
}
if (count($this->outlines) > 0) {
$out .= ' /Outlines '.$this->OutlineRoot.' 0 R';
$out .= ' /PageMode /UseOutlines';
}
//$out .= ' /Threads []';
if ($this->ZoomMode == 'fullpage') { if ($this->ZoomMode == 'fullpage') {
$out .= ' /OpenAction ['.$this->page_obj_id[1].' 0 R /Fit]'; $out .= ' /OpenAction ['.$this->page_obj_id[1].' 0 R /Fit]';
} elseif ($this->ZoomMode == 'fullwidth') { } elseif ($this->ZoomMode == 'fullwidth') {
@ -10979,27 +11013,19 @@ class TCPDF {
} elseif ($this->ZoomMode == 'real') { } elseif ($this->ZoomMode == 'real') {
$out .= ' /OpenAction ['.$this->page_obj_id[1].' 0 R /XYZ null null 1]'; $out .= ' /OpenAction ['.$this->page_obj_id[1].' 0 R /XYZ null null 1]';
} elseif (!is_string($this->ZoomMode)) { } elseif (!is_string($this->ZoomMode)) {
$out .= sprintf(' /OpenAction ['.$this->page_obj_id[1].' 0 R /XYZ null null %.2F]',($this->ZoomMode / 100)); $out .= sprintf(' /OpenAction ['.$this->page_obj_id[1].' 0 R /XYZ null null %.2F]', ($this->ZoomMode / 100));
}
if (isset($this->LayoutMode) AND (!$this->empty_string($this->LayoutMode))) {
$out .= ' /PageLayout /'.$this->LayoutMode;
}
if (isset($this->PageMode) AND (!$this->empty_string($this->PageMode))) {
$out .= ' /PageMode /'.$this->PageMode;
} }
//$out .= ' /AA <<>>';
//$out .= ' /URI <<>>';
//$out .= ' /Metadata X Y R';
//$out .= ' /StructTreeRoot <<>>';
//$out .= ' /MarkInfo <<>>';
if (isset($this->l['a_meta_language'])) { if (isset($this->l['a_meta_language'])) {
$out .= ' /Lang '.$this->_textstring($this->l['a_meta_language'], $oid); $out .= ' /Lang '.$this->_textstring($this->l['a_meta_language'], $oid);
} }
$out .= ' /Names <<'; //$out .= ' /SpiderInfo <<>>';
if ((!empty($this->javascript)) OR (!empty($this->js_objects))) { //$out .= ' /OutputIntents []';
$out .= ' /JavaScript '.($this->n_js).' 0 R'; //$out .= ' /PieceInfo <<>>';
}
$out .= ' >>';
if (count($this->outlines) > 0) {
$out .= ' /Outlines '.$this->OutlineRoot.' 0 R';
$out .= ' /PageMode /UseOutlines';
}
$out .= ' '.$this->_putviewerpreferences();
if ($this->pdflayers) { if ($this->pdflayers) {
$p = $this->n_ocg_print.' 0 R'; $p = $this->n_ocg_print.' 0 R';
$v = $this->n_ocg_view.' 0 R'; $v = $this->n_ocg_view.' 0 R';
@ -11053,6 +11079,10 @@ class TCPDF {
} }
} }
} }
//$out .= ' /Legal <<>>';
//$out .= ' /Requirements []';
//$out .= ' /Collection <<>>';
//$out .= ' /NeedsRendering true';
$out .= ' >>'; $out .= ' >>';
$out .= "\n".'endobj'; $out .= "\n".'endobj';
$this->_out($out); $this->_out($out);
@ -11067,7 +11097,7 @@ class TCPDF {
* @protected * @protected
*/ */
protected function _putviewerpreferences() { protected function _putviewerpreferences() {
$out = '/ViewerPreferences <<'; $out = ' /ViewerPreferences <<';
if ($this->rtl) { if ($this->rtl) {
$out .= ' /Direction /R2L'; $out .= ' /Direction /R2L';
} else { } else {
@ -14560,11 +14590,88 @@ class TCPDF {
// END OF BIDIRECTIONAL TEXT SECTION ------------------- // END OF BIDIRECTIONAL TEXT SECTION -------------------
/** /**
* Adds a bookmark. * Encode a name object.
* @param $txt (string) bookmark description. * @param $name (string) Name object to encode.
* @param $level (int) bookmark level (minimum value is 0). * @return (string) Encoded name object.
* @protected
* @author Nicola Asuni
* @since 5.9.097 (2011-06-23)
*/
protected function encodeNameObject($name) {
$escname = '';
$length = strlen($name);
for ($i = 0; $i < $length; ++$i) {
$chr = $name{$i};
if (preg_match('/[0-9a-zA-Z]/', $chr) == 1) {
$escname .= $chr;
} else {
$escname .= sprintf('#%02X', ord($chr));
}
}
return $escname;
}
/**
* Add a Named Destination.
* NOTE: destination names are unique, so only last entry will be saved.
* @param $name (string) Destination name.
* @param $y (float) Y position in user units of the destiantion on the selected page (default = -1 = current position; 0 = page start;).
* @param $page (int) Target page number (leave empty for current page).
* @return (string) Stripped named destination identifier or false in case of error.
* @public
* @author Christian Deligant, Nicola Asuni
* @since 5.9.097 (2011-06-23)
*/
public function setDestination($name, $y=-1, $page='') {
// remove unsupported characters
$name = $this->encodeNameObject($name);
if ($this->empty_string($name)) {
return false;
}
if ($y == -1) {
$y = $this->GetY();
}
if (empty($page)) {
$page = $this->PageNo();
if (empty($page)) {
return;
}
}
$this->dests[$name] = array('y' => $y, 'p' => $page);
return $name;
}
/**
* Return the Named Destination array.
* @return (array) Named Destination array.
* @public
* @author Nicola Asuni
* @since 5.9.097 (2011-06-23)
*/
public function getDestination() {
return $this->dests;
}
/**
* Adds a bookmark - alias for Bookmark().
* @param $txt (string) Bookmark description.
* @param $level (int) Bookmark level (minimum value is 0).
* @param $y (float) Y position in user units of the bookmark on the selected page (default = -1 = current position; 0 = page start;). * @param $y (float) Y position in user units of the bookmark on the selected page (default = -1 = current position; 0 = page start;).
* @param $page (int) target page number (leave empty for current page). * @param $page (int) Target page number (leave empty for current page).
* @param $style (string) Font style: B = Bold, I = Italic, BI = Bold + Italic.
* @param $color (array) RGB color array (values from 0 to 255).
* @public
*/
public function setBookmark($txt, $level=0, $y=-1, $page='', $style='', $color=array(0,0,0)) {
$this->Bookmark($txt, $level, $y, $page, $style, $color);
}
/**
* Adds a bookmark.
* @param $txt (string) Bookmark description.
* @param $level (int) Bookmark level (minimum value is 0).
* @param $y (float) Y position in user units of the bookmark on the selected page (default = -1 = current position; 0 = page start;).
* @param $page (int) Target page number (leave empty for current page).
* @param $style (string) Font style: B = Bold, I = Italic, BI = Bold + Italic. * @param $style (string) Font style: B = Bold, I = Italic, BI = Bold + Italic.
* @param $color (array) RGB color array (values from 0 to 255). * @param $color (array) RGB color array (values from 0 to 255).
* @public * @public
@ -21121,7 +21228,11 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
} else { } else {
$n = 1; $n = 1;
} }
$hb = ($n * $cur_h); if ((!isset($this->tagvspaces[$tag['value']])) AND (in_array($tag['value'], array('div', 'dt', 'dd', 'li', 'br')))) {
$hb = 0;
} else {
$hb = ($n * $cur_h);
}
if (($this->htmlvspace <= 0) AND ($n > 0)) { if (($this->htmlvspace <= 0) AND ($n > 0)) {
if (isset($parent['fontsize'])) { if (isset($parent['fontsize'])) {
$hbz = (($parent['fontsize'] / $this->k) * $this->cell_height_ratio); $hbz = (($parent['fontsize'] / $this->k) * $this->cell_height_ratio);
@ -21327,7 +21438,7 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
break; break;
} }
case 'dt': { case 'dt': {
$this->addHTMLVertSpace($hbz, 0, $cell, $firsttag); $this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
break; break;
} }
case 'dd': { case 'dd': {
@ -21337,7 +21448,7 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
$this->lMargin += $this->listindent; $this->lMargin += $this->listindent;
} }
++$this->listindentlevel; ++$this->listindentlevel;
$this->addHTMLVertSpace($hbz, 0, $cell, $firsttag); $this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
break; break;
} }
case 'ul': case 'ul':
@ -21372,7 +21483,7 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
} }
case 'li': { case 'li': {
if ($key > 2) { if ($key > 2) {
$this->addHTMLVertSpace($hbz, 0, $cell, $firsttag); $this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
} }
if ($this->listordered[$this->listnum]) { if ($this->listordered[$this->listnum]) {
// ordered item // ordered item
@ -21414,11 +21525,11 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
break; break;
} }
case 'br': { case 'br': {
$this->addHTMLVertSpace($hbz, 0, $cell, $firsttag); $this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
break; break;
} }
case 'div': { case 'div': {
$this->addHTMLVertSpace($hbz, 0, $cell, $firsttag); $this->addHTMLVertSpace($hbz, $hb, $cell, $firsttag);
break; break;
} }
case 'p': { case 'p': {
@ -21742,7 +21853,11 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
} else { } else {
$n = 1; $n = 1;
} }
$hb = ($n * $pre_h); if ((!isset($this->tagvspaces[$tag['value']])) AND ($tag['value'] == 'div')) {
$hb = 0;
} else {
$hb = ($n * $pre_h);
}
if ($maxbottomliney > $this->PageBreakTrigger) { if ($maxbottomliney > $this->PageBreakTrigger) {
$hbz = ($this->FontSize * $this->cell_height_ratio); $hbz = ($this->FontSize * $this->cell_height_ratio);
} elseif ($this->y < $maxbottomliney) { } elseif ($this->y < $maxbottomliney) {
@ -22127,7 +22242,7 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
break; break;
} }
case 'div': { case 'div': {
$this->addHTMLVertSpace($hbz, 0, $cell, false, $lasttag); $this->addHTMLVertSpace($hbz, $hb, $cell, false, $lasttag);
break; break;
} }
case 'blockquote': { case 'blockquote': {
@ -23470,6 +23585,15 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
$this->outlines[$key]['p'] = $topage; $this->outlines[$key]['p'] = $topage;
} }
} }
// adjust dests
$tmpdests = $this->dests;
foreach ($tmpdests as $key => $dest) {
if (($dest['p'] >= $topage) AND ($dest['p'] < $frompage)) {
$this->dests[$key]['p'] = $dest['p'] + 1;
} elseif ($dest['p'] == $frompage) {
$this->dests[$key]['p'] = $topage;
}
}
// adjust links // adjust links
$tmplinks = $this->links; $tmplinks = $this->links;
foreach ($tmplinks as $key => $link) { foreach ($tmplinks as $key => $link) {
@ -23629,6 +23753,15 @@ Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value:
unset($this->outlines[$key]); unset($this->outlines[$key]);
} }
} }
// adjust dests
$tmpdests = $this->dests;
foreach ($tmpdests as $key => $dest) {
if ($dest['p'] > $page) {
$this->dests[$key]['p'] = $dest['p'] - 1;
} elseif ($dest['p'] == $page) {
unset($this->dests[$key]);
}
}
// adjust links // adjust links
$tmplinks = $this->links; $tmplinks = $this->links;
foreach ($tmplinks as $key => $link) { foreach ($tmplinks as $key => $link) {