17d101cc1SGerry Weißbach<?php 27d101cc1SGerry Weißbach/** 37d101cc1SGerry Weißbach * Site Export Plugin - mPDF Extension 47d101cc1SGerry Weißbach * 57d101cc1SGerry Weißbach * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 67d101cc1SGerry Weißbach * @author i-net software <tools@inetsoftware.de> 77d101cc1SGerry Weißbach * @author Gerry Weissbach <gweissbach@inetsoftware.de> 87d101cc1SGerry Weißbach */ 97d101cc1SGerry Weißbach 107d101cc1SGerry Weißbach// must be run within Dokuwiki 117d101cc1SGerry Weißbachif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); 127d101cc1SGerry Weißbachif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 137d101cc1SGerry Weißbach 14*a4a5b91dSGerry Weißbachif ( file_exists(DOKU_PLUGIN . 'dw2pdf/DokuPDF.class.php') ) { 157d101cc1SGerry Weißbach 167d101cc1SGerry Weißbach global $conf; 17*a4a5b91dSGerry Weißbach // if(!defined('_MPDF_TEMP_PATH')) define('_MPDF_TEMP_PATH', $conf['tmpdir'].'/dwpdf/'.rand(1,1000).'/'); 187d101cc1SGerry Weißbach 19*a4a5b91dSGerry Weißbach require_once(DOKU_PLUGIN . 'dw2pdf/DokuPDF.class.php'); 207d101cc1SGerry Weißbach 21*a4a5b91dSGerry Weißbach class siteexportPDF extends DokuPDF { 227d101cc1SGerry Weißbach 237d101cc1SGerry Weißbach var $debugObj = true; 247d101cc1SGerry Weißbach 25*a4a5b91dSGerry Weißbach function __construct($encoding, $debug=false) { 26*a4a5b91dSGerry Weißbach 27*a4a5b91dSGerry Weißbach parent::__construct($encoding); 287d101cc1SGerry Weißbach $this->debugObj = $debug; 297d101cc1SGerry Weißbach $this->debug = true; 307d101cc1SGerry Weißbach $this->shrink_tables_to_fit = 1; // Does not shrink tables by default, only in emergency 317d101cc1SGerry Weißbach $this->use_kwt = true; // avoids page-breaking in H1-H6 if a table follows directly 327d101cc1SGerry Weißbach } 337d101cc1SGerry Weißbach 347d101cc1SGerry Weißbach function message($msg, $vars=null, $lvl=1) 357d101cc1SGerry Weißbach { 367d101cc1SGerry Weißbach if ( $this->debugObj !== false ) { 37*a4a5b91dSGerry Weißbach $this->debugObj->message($msg, $vars, $lvl); 387d101cc1SGerry Weißbach } 397d101cc1SGerry Weißbach } 407d101cc1SGerry Weißbach 417d101cc1SGerry Weißbach function Error($msg) 427d101cc1SGerry Weißbach { 437d101cc1SGerry Weißbach if ( $this->debug !== false && $lvl == null && method_exists($this->debug, 'runtimeException') ) { 447d101cc1SGerry Weißbach $this->debug->runtimeException($msg); 457d101cc1SGerry Weißbach } else { 467d101cc1SGerry Weißbach parent::Error($msg); 477d101cc1SGerry Weißbach } 487d101cc1SGerry Weißbach } 497d101cc1SGerry Weißbach 50*a4a5b91dSGerry Weißbach function GetFullPath(&$path,$basepath='') { 51*a4a5b91dSGerry Weißbach 52*a4a5b91dSGerry Weißbach // Full Path might return a doubled path like /~gamma/documentation/lib//~gamma/documentation/lib/tpl/clearreports/./_print-images/background-bottom.jpg 53*a4a5b91dSGerry Weißbach 54*a4a5b91dSGerry Weißbach $path = str_replace("\\","/",$path); //If on Windows 55*a4a5b91dSGerry Weißbach $path = preg_replace('/^\/\//','http://',$path); // mPDF 5.6.27 56*a4a5b91dSGerry Weißbach $regexp = '|^./|'; // Inadvertently corrects "./path/etc" and "//www.domain.com/etc" 57*a4a5b91dSGerry Weißbach $path = preg_replace($regexp,'',$path); 58*a4a5b91dSGerry Weißbach 59*a4a5b91dSGerry Weißbach if ( preg_match("/^.+\/\.\.\//", $path) ) { 60*a4a5b91dSGerry Weißbach // ../ not at the beginning 61*a4a5b91dSGerry Weißbach $newpath = array(); 62*a4a5b91dSGerry Weißbach $oldpath = explode('/', $path); 63*a4a5b91dSGerry Weißbach 64*a4a5b91dSGerry Weißbach foreach( $oldpath as $slice ) { 65*a4a5b91dSGerry Weißbach if ( $slice == ".." && count($newpath) > 0 ) { 66*a4a5b91dSGerry Weißbach array_pop($newpath); 67*a4a5b91dSGerry Weißbach continue; 68*a4a5b91dSGerry Weißbach } 69*a4a5b91dSGerry Weißbach 70*a4a5b91dSGerry Weißbach $newpath[] = $slice; 71*a4a5b91dSGerry Weißbach } 72*a4a5b91dSGerry Weißbach 73*a4a5b91dSGerry Weißbach $path = implode('/', $newpath); 74*a4a5b91dSGerry Weißbach } 75*a4a5b91dSGerry Weißbach 76*a4a5b91dSGerry Weißbach parent::GetFullPath($path, $basepath); 77*a4a5b91dSGerry Weißbach 78*a4a5b91dSGerry Weißbach $regex = "/(". preg_quote(DOKU_BASE, '/') .".+)\\1/"; 79*a4a5b91dSGerry Weißbach if ( preg_match($regex, $path, $matches) ) { 80*a4a5b91dSGerry Weißbach $path = preg_replace($regex, "\\1", $path); 81*a4a5b91dSGerry Weißbach } 82*a4a5b91dSGerry Weißbach } 83*a4a5b91dSGerry Weißbach 847d101cc1SGerry Weißbach function OpenTag($tag, $attr) { 857d101cc1SGerry Weißbach switch($tag) { 867d101cc1SGerry Weißbach case 'BOOKMARK': 877d101cc1SGerry Weißbach case 'TOCENTRY': 887d101cc1SGerry Weißbach if ( $attr['CONTENT'] ) { 897d101cc1SGerry Weißbach // resolve double encoding 907d101cc1SGerry Weißbach $attr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'], ENT_QUOTES); 917d101cc1SGerry Weißbach } 927d101cc1SGerry Weißbach break; 937d101cc1SGerry Weißbach } 947d101cc1SGerry Weißbach return parent::OpenTag($tag, $attr); 957d101cc1SGerry Weißbach } 967d101cc1SGerry Weißbach 97*a4a5b91dSGerry Weißbach/* function GetFullPath(&$path,$basepath='') { 98*a4a5b91dSGerry Weißbach $this->debugObj->message("GetFullPath: path before function", $path, 2); 99*a4a5b91dSGerry Weißbach parent::GetFullPath($path,$basepath); 100*a4a5b91dSGerry Weißbach $this->debugObj->message("GetFullPath: path AFTER function", $path, 2); 101*a4a5b91dSGerry Weißbach } 102*a4a5b91dSGerry Weißbach*/ 1037d101cc1SGerry Weißbach/* 1047d101cc1SGerry Weißbach function _putannots($n) { 1057d101cc1SGerry Weißbach $nb=$this->page; 1067d101cc1SGerry Weißbach for($n=1;$n<=$nb;$n++) 1077d101cc1SGerry Weißbach { 1087d101cc1SGerry Weißbach $annotobjs = array(); 1097d101cc1SGerry Weißbach if(isset($this->PageLinks[$n]) || isset($this->PageAnnots[$n])) { 1107d101cc1SGerry Weißbach $wPt=$this->pageDim[$n]['w']*$this->k; 1117d101cc1SGerry Weißbach $hPt=$this->pageDim[$n]['h']*$this->k; 1127d101cc1SGerry Weißbach 1137d101cc1SGerry Weißbach //Links 1147d101cc1SGerry Weißbach if(isset($this->PageLinks[$n])) { 1157d101cc1SGerry Weißbach foreach($this->PageLinks[$n] as $key => $pl) { 1167d101cc1SGerry Weißbach $this->_newobj(); 1177d101cc1SGerry Weißbach $annot=''; 1187d101cc1SGerry Weißbach $rect=sprintf('%.3f %.3f %.3f %.3f',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); 1197d101cc1SGerry Weißbach $annot .= '<</Type /Annot /Subtype /Link /Rect ['.$rect.']'; 1207d101cc1SGerry Weißbach $annot .= ' /Contents '.$this->_UTF16BEtextstring($pl[4]); 1217d101cc1SGerry Weißbach $annot .= ' /NM ('.sprintf('%04u-%04u', $n, $key).')'; 1227d101cc1SGerry Weißbach $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis')); 1237d101cc1SGerry Weißbach $annot .= ' /Border [0 0 0]'; 1247d101cc1SGerry Weißbach // mPDF 4.2.018 1257d101cc1SGerry Weißbach if ($this->PDFA) { $annot .= ' /F 28'; } 1267d101cc1SGerry Weißbach if (strpos($pl[4],'@')===0) { 1277d101cc1SGerry Weißbach $p=substr($pl[4],1); 1287d101cc1SGerry Weißbach // $h=isset($this->OrientationChanges[$p]) ? $wPt : $hPt; 1297d101cc1SGerry Weißbach $htarg=$this->pageDim[$p]['h']*$this->k; 1307d101cc1SGerry Weißbach $annot.=sprintf(' /Dest [%d 0 R /XYZ 0 %.3f null]>>',1+2*$p,$htarg); 1317d101cc1SGerry Weißbach } 1327d101cc1SGerry Weißbach else if(is_string($pl[4])) { 1337d101cc1SGerry Weißbach 1347d101cc1SGerry Weißbach if ( preg_match( "#^(https?:/|file:)/#", $pl[4] )) { 1357d101cc1SGerry Weißbach $annot .= ' /A <</Type/Action/S/URI/URI'.$this->_textstring($pl[4]).'>> >>'; 1367d101cc1SGerry Weißbach } else { 1377d101cc1SGerry Weißbach $annot .= ' /A <</Type/Action/S/GoToR/F'.$this->_textstring($pl[4]).'>> >>'; 1387d101cc1SGerry Weißbach } 1397d101cc1SGerry Weißbach } 1407d101cc1SGerry Weißbach else { 1417d101cc1SGerry Weißbach $l=$this->links[$pl[4]]; 1427d101cc1SGerry Weißbach // mPDF 3.0 1437d101cc1SGerry Weißbach // may not be set if #link points to non-existent target 1447d101cc1SGerry Weißbach if (isset($this->pageDim[$l[0]]['h'])) { $htarg=$this->pageDim[$l[0]]['h']*$this->k; } 1457d101cc1SGerry Weißbach else { $htarg=$this->h*$this->k; } // doesn't really matter 1467d101cc1SGerry Weißbach $annot.=sprintf(' /Dest [%d 0 R /XYZ 0 %.3f null]>>',1+2*$l[0],$htarg-$l[1]*$this->k); 1477d101cc1SGerry Weißbach } 1487d101cc1SGerry Weißbach $this->_out($annot); 1497d101cc1SGerry Weißbach $this->_out('endobj'); 1507d101cc1SGerry Weißbach } 1517d101cc1SGerry Weißbach } 1527d101cc1SGerry Weißbach*/ 1537d101cc1SGerry Weißbach 1547d101cc1SGerry Weißbach /*-- ANNOTATIONS --*/ 1557d101cc1SGerry Weißbach/* if(isset($this->PageAnnots[$n])) { 1567d101cc1SGerry Weißbach foreach ($this->PageAnnots[$n] as $key => $pl) { 1577d101cc1SGerry Weißbach $this->_newobj(); 1587d101cc1SGerry Weißbach $annot=''; 1597d101cc1SGerry Weißbach $pl['opt'] = array_change_key_case($pl['opt'], CASE_LOWER); 1607d101cc1SGerry Weißbach $x = $pl['x']; 1617d101cc1SGerry Weißbach if ($this->annotMargin <> 0 || $x==0 || $x<0) { // Odd page 1627d101cc1SGerry Weißbach $x = ($wPt/$this->k) - $this->annotMargin; 1637d101cc1SGerry Weißbach } 1647d101cc1SGerry Weißbach $w = $h = ($this->annotSize * $this->k); 1657d101cc1SGerry Weißbach $a = $x * $this->k; 1667d101cc1SGerry Weißbach // mPDF 3.0 1677d101cc1SGerry Weißbach $b = $hPt - ($pl['y'] * $this->k); 1687d101cc1SGerry Weißbach $rect = sprintf('%.3f %.3f %.3f %.3f', $a, $b-$h, $a+$w, $b); 1697d101cc1SGerry Weißbach $annot .= '<</Type /Annot /Subtype /Text /Rect ['.$rect.']'; 1707d101cc1SGerry Weißbach $annot .= ' /Contents '.$this->_UTF16BEtextstring($pl['txt']); 1717d101cc1SGerry Weißbach $annot .= ' /NM ('.sprintf('%04u-%04u', $n, (2000 + $key)).')'; 1727d101cc1SGerry Weißbach $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis')); 1737d101cc1SGerry Weißbach $annot .= ' /CreationDate '.$this->_textstring('D:'.date('YmdHis')); 1747d101cc1SGerry Weißbach $annot .= ' /Border [0 0 0]'; 1757d101cc1SGerry Weißbach // mPDF 4.2.018 1767d101cc1SGerry Weißbach if ($this->PDFA) { 1777d101cc1SGerry Weißbach $annot .= ' /F 28'; 1787d101cc1SGerry Weißbach $annot .= ' /CA 1'; 1797d101cc1SGerry Weißbach } 1807d101cc1SGerry Weißbach else if ($pl['opt']['ca']>0) { $annot .= ' /CA '.$pl['opt']['ca']; } 1817d101cc1SGerry Weißbach 1827d101cc1SGerry Weißbach $annot .= ' /C ['; 1837d101cc1SGerry Weißbach if (isset($pl['opt']['c']) AND (is_array($pl['opt']['c']))) { 1847d101cc1SGerry Weißbach foreach ($pl['opt']['c'] as $col) { 1857d101cc1SGerry Weißbach $col = intval($col); 1867d101cc1SGerry Weißbach $color = $col <= 0 ? 0 : ($col >= 255 ? 1 : $col / 255); 1877d101cc1SGerry Weißbach $annot .= sprintf(" %.4f", $color); 1887d101cc1SGerry Weißbach } 1897d101cc1SGerry Weißbach } 1907d101cc1SGerry Weißbach else { $annot .= '1 1 0'; } // mPDF 4.2.026 1917d101cc1SGerry Weißbach $annot .= ']'; 1927d101cc1SGerry Weißbach // Usually Author 1937d101cc1SGerry Weißbach if (isset($pl['opt']['t']) AND is_string($pl['opt']['t'])) { 1947d101cc1SGerry Weißbach $annot .= ' /T '.$this->_UTF16BEtextstring($pl['opt']['t']); 1957d101cc1SGerry Weißbach } 1967d101cc1SGerry Weißbach if (isset($pl['opt']['subj'])) { 1977d101cc1SGerry Weißbach $annot .= ' /Subj '.$this->_UTF16BEtextstring($pl['opt']['subj']); 1987d101cc1SGerry Weißbach } 1997d101cc1SGerry Weißbach $iconsapp = array('Comment', 'Help', 'Insert', 'Key', 'NewParagraph', 'Note', 'Paragraph'); 2007d101cc1SGerry Weißbach if (isset($pl['opt']['icon']) AND in_array($pl['opt']['icon'], $iconsapp)) { 2017d101cc1SGerry Weißbach $annot .= ' /Name /'.$pl['opt']['icon']; 2027d101cc1SGerry Weißbach } 2037d101cc1SGerry Weißbach else { $annot .= ' /Name /Note'; } 2047d101cc1SGerry Weißbach // mPDF 4.2.027 2057d101cc1SGerry Weißbach if (!empty($pl['opt']['popup'])) { 2067d101cc1SGerry Weißbach $annot .= ' /Open true'; 2077d101cc1SGerry Weißbach $annot .= ' /Popup '.($this->n+1).' 0 R'; // mPDF 4.2.027 2087d101cc1SGerry Weißbach } 2097d101cc1SGerry Weißbach else { $annot .= ' /Open false'; } // mPDF 4.2.027 2107d101cc1SGerry Weißbach $annot .= ' /P 3 0 R'; // mPDF 4.2.027 2117d101cc1SGerry Weißbach $annot .= '>>'; 2127d101cc1SGerry Weißbach $this->_out($annot); 2137d101cc1SGerry Weißbach $this->_out('endobj'); 2147d101cc1SGerry Weißbach 2157d101cc1SGerry Weißbach // mPDF 4.2.027 2167d101cc1SGerry Weißbach if (!empty($pl['opt']['popup'])) { 2177d101cc1SGerry Weißbach $this->_newobj(); 2187d101cc1SGerry Weißbach $annot=''; 2197d101cc1SGerry Weißbach if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][0])) { $x = $pl['opt']['popup'][0] * $this->k; } 2207d101cc1SGerry Weißbach else { $x = $pl['x'] * $this->k; } 2217d101cc1SGerry Weißbach if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][1])) { $y = $hPt - ($pl['opt']['popup'][1] * $this->k); } 2227d101cc1SGerry Weißbach else { $y = $hPt - ($pl['y'] * $this->k); } 2237d101cc1SGerry Weißbach if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][2])) { $w = $pl['opt']['popup'][2] * $this->k; } 2247d101cc1SGerry Weißbach else { $w = 180; } 2257d101cc1SGerry Weißbach if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][3])) { $h = $pl['opt']['popup'][3] * $this->k; } 2267d101cc1SGerry Weißbach else { $h = 120; } 2277d101cc1SGerry Weißbach $rect = sprintf('%.3f %.3f %.3f %.3f', $x, $y-$h, $x+$w, $y); 2287d101cc1SGerry Weißbach $annot .= '<</Type /Annot /Subtype /Popup /Rect ['.$rect.']'; 2297d101cc1SGerry Weißbach $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis')); 2307d101cc1SGerry Weißbach if ($this->PDFA) { $annot .= ' /F 28'; } 2317d101cc1SGerry Weißbach $annot .= ' /P 3 0 R'; 2327d101cc1SGerry Weißbach $annot .= ' /Parent '.($this->n-1).' 0 R'; 2337d101cc1SGerry Weißbach $annot .= '>>'; 2347d101cc1SGerry Weißbach $this->_out($annot); 2357d101cc1SGerry Weißbach $this->_out('endobj'); 2367d101cc1SGerry Weißbach } 2377d101cc1SGerry Weißbach } 2387d101cc1SGerry Weißbach } 2397d101cc1SGerry Weißbach*/ /*-- END ANNOTATIONS --*/ 2407d101cc1SGerry Weißbach/* } 2417d101cc1SGerry Weißbach } 2427d101cc1SGerry Weißbach } 2437d101cc1SGerry Weißbach*/ 2447d101cc1SGerry Weißbach } 2457d101cc1SGerry Weißbach}