1*7d101cc1SGerry Weißbach<?php 2*7d101cc1SGerry Weißbach/** 3*7d101cc1SGerry Weißbach * Site Export Plugin - mPDF Extension 4*7d101cc1SGerry Weißbach * 5*7d101cc1SGerry Weißbach * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6*7d101cc1SGerry Weißbach * @author i-net software <tools@inetsoftware.de> 7*7d101cc1SGerry Weißbach * @author Gerry Weissbach <gweissbach@inetsoftware.de> 8*7d101cc1SGerry Weißbach */ 9*7d101cc1SGerry Weißbach 10*7d101cc1SGerry Weißbach// must be run within Dokuwiki 11*7d101cc1SGerry Weißbachif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); 12*7d101cc1SGerry Weißbachif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 13*7d101cc1SGerry Weißbach 14*7d101cc1SGerry Weißbachif ( file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/mpdf.php') ) { 15*7d101cc1SGerry Weißbach 16*7d101cc1SGerry Weißbach global $conf; 17*7d101cc1SGerry Weißbach if(!defined('_MPDF_TEMP_PATH')) define('_MPDF_TEMP_PATH', $conf['tmpdir'].'/dwpdf/'.rand(1,1000).'/'); 18*7d101cc1SGerry Weißbach 19*7d101cc1SGerry Weißbach require_once(DOKU_PLUGIN . 'dw2pdf/mpdf/mpdf.php'); 20*7d101cc1SGerry Weißbach 21*7d101cc1SGerry Weißbach class siteexportPDF extends mPDF { 22*7d101cc1SGerry Weißbach 23*7d101cc1SGerry Weißbach var $debugObj = true; 24*7d101cc1SGerry Weißbach 25*7d101cc1SGerry Weißbach function siteexportPDF($encoding, $debug=false) { 26*7d101cc1SGerry Weißbach parent::mPDF($encoding); 27*7d101cc1SGerry Weißbach $this->debugObj = $debug; 28*7d101cc1SGerry Weißbach $this->debug = true; 29*7d101cc1SGerry Weißbach $this->shrink_tables_to_fit = 1; // Does not shrink tables by default, only in emergency 30*7d101cc1SGerry Weißbach $this->use_kwt = true; // avoids page-breaking in H1-H6 if a table follows directly 31*7d101cc1SGerry Weißbach } 32*7d101cc1SGerry Weißbach 33*7d101cc1SGerry Weißbach function message($msg, $vars=null, $lvl=1) 34*7d101cc1SGerry Weißbach { 35*7d101cc1SGerry Weißbach if ( $this->debugObj !== false ) { 36*7d101cc1SGerry Weißbach // $this->debugObj->message($msg, $vars, $lvl); 37*7d101cc1SGerry Weißbach } 38*7d101cc1SGerry Weißbach } 39*7d101cc1SGerry Weißbach 40*7d101cc1SGerry Weißbach function Error($msg) 41*7d101cc1SGerry Weißbach { 42*7d101cc1SGerry Weißbach if ( $this->debug !== false && $lvl == null && method_exists($this->debug, 'runtimeException') ) { 43*7d101cc1SGerry Weißbach $this->debug->runtimeException($msg); 44*7d101cc1SGerry Weißbach } else { 45*7d101cc1SGerry Weißbach parent::Error($msg); 46*7d101cc1SGerry Weißbach } 47*7d101cc1SGerry Weißbach } 48*7d101cc1SGerry Weißbach 49*7d101cc1SGerry Weißbach function OpenTag($tag, $attr) { 50*7d101cc1SGerry Weißbach switch($tag) { 51*7d101cc1SGerry Weißbach case 'BOOKMARK': 52*7d101cc1SGerry Weißbach case 'TOCENTRY': 53*7d101cc1SGerry Weißbach if ( $attr['CONTENT'] ) { 54*7d101cc1SGerry Weißbach // resolve double encoding 55*7d101cc1SGerry Weißbach $attr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'], ENT_QUOTES); 56*7d101cc1SGerry Weißbach } 57*7d101cc1SGerry Weißbach break; 58*7d101cc1SGerry Weißbach } 59*7d101cc1SGerry Weißbach return parent::OpenTag($tag, $attr); 60*7d101cc1SGerry Weißbach } 61*7d101cc1SGerry Weißbach 62*7d101cc1SGerry Weißbach/* 63*7d101cc1SGerry Weißbach function _putannots($n) { 64*7d101cc1SGerry Weißbach $nb=$this->page; 65*7d101cc1SGerry Weißbach for($n=1;$n<=$nb;$n++) 66*7d101cc1SGerry Weißbach { 67*7d101cc1SGerry Weißbach $annotobjs = array(); 68*7d101cc1SGerry Weißbach if(isset($this->PageLinks[$n]) || isset($this->PageAnnots[$n])) { 69*7d101cc1SGerry Weißbach $wPt=$this->pageDim[$n]['w']*$this->k; 70*7d101cc1SGerry Weißbach $hPt=$this->pageDim[$n]['h']*$this->k; 71*7d101cc1SGerry Weißbach 72*7d101cc1SGerry Weißbach //Links 73*7d101cc1SGerry Weißbach if(isset($this->PageLinks[$n])) { 74*7d101cc1SGerry Weißbach foreach($this->PageLinks[$n] as $key => $pl) { 75*7d101cc1SGerry Weißbach $this->_newobj(); 76*7d101cc1SGerry Weißbach $annot=''; 77*7d101cc1SGerry Weißbach $rect=sprintf('%.3f %.3f %.3f %.3f',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); 78*7d101cc1SGerry Weißbach $annot .= '<</Type /Annot /Subtype /Link /Rect ['.$rect.']'; 79*7d101cc1SGerry Weißbach $annot .= ' /Contents '.$this->_UTF16BEtextstring($pl[4]); 80*7d101cc1SGerry Weißbach $annot .= ' /NM ('.sprintf('%04u-%04u', $n, $key).')'; 81*7d101cc1SGerry Weißbach $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis')); 82*7d101cc1SGerry Weißbach $annot .= ' /Border [0 0 0]'; 83*7d101cc1SGerry Weißbach // mPDF 4.2.018 84*7d101cc1SGerry Weißbach if ($this->PDFA) { $annot .= ' /F 28'; } 85*7d101cc1SGerry Weißbach if (strpos($pl[4],'@')===0) { 86*7d101cc1SGerry Weißbach $p=substr($pl[4],1); 87*7d101cc1SGerry Weißbach // $h=isset($this->OrientationChanges[$p]) ? $wPt : $hPt; 88*7d101cc1SGerry Weißbach $htarg=$this->pageDim[$p]['h']*$this->k; 89*7d101cc1SGerry Weißbach $annot.=sprintf(' /Dest [%d 0 R /XYZ 0 %.3f null]>>',1+2*$p,$htarg); 90*7d101cc1SGerry Weißbach } 91*7d101cc1SGerry Weißbach else if(is_string($pl[4])) { 92*7d101cc1SGerry Weißbach 93*7d101cc1SGerry Weißbach if ( preg_match( "#^(https?:/|file:)/#", $pl[4] )) { 94*7d101cc1SGerry Weißbach $annot .= ' /A <</Type/Action/S/URI/URI'.$this->_textstring($pl[4]).'>> >>'; 95*7d101cc1SGerry Weißbach } else { 96*7d101cc1SGerry Weißbach $annot .= ' /A <</Type/Action/S/GoToR/F'.$this->_textstring($pl[4]).'>> >>'; 97*7d101cc1SGerry Weißbach } 98*7d101cc1SGerry Weißbach } 99*7d101cc1SGerry Weißbach else { 100*7d101cc1SGerry Weißbach $l=$this->links[$pl[4]]; 101*7d101cc1SGerry Weißbach // mPDF 3.0 102*7d101cc1SGerry Weißbach // may not be set if #link points to non-existent target 103*7d101cc1SGerry Weißbach if (isset($this->pageDim[$l[0]]['h'])) { $htarg=$this->pageDim[$l[0]]['h']*$this->k; } 104*7d101cc1SGerry Weißbach else { $htarg=$this->h*$this->k; } // doesn't really matter 105*7d101cc1SGerry Weißbach $annot.=sprintf(' /Dest [%d 0 R /XYZ 0 %.3f null]>>',1+2*$l[0],$htarg-$l[1]*$this->k); 106*7d101cc1SGerry Weißbach } 107*7d101cc1SGerry Weißbach $this->_out($annot); 108*7d101cc1SGerry Weißbach $this->_out('endobj'); 109*7d101cc1SGerry Weißbach } 110*7d101cc1SGerry Weißbach } 111*7d101cc1SGerry Weißbach*/ 112*7d101cc1SGerry Weißbach 113*7d101cc1SGerry Weißbach /*-- ANNOTATIONS --*/ 114*7d101cc1SGerry Weißbach/* if(isset($this->PageAnnots[$n])) { 115*7d101cc1SGerry Weißbach foreach ($this->PageAnnots[$n] as $key => $pl) { 116*7d101cc1SGerry Weißbach $this->_newobj(); 117*7d101cc1SGerry Weißbach $annot=''; 118*7d101cc1SGerry Weißbach $pl['opt'] = array_change_key_case($pl['opt'], CASE_LOWER); 119*7d101cc1SGerry Weißbach $x = $pl['x']; 120*7d101cc1SGerry Weißbach if ($this->annotMargin <> 0 || $x==0 || $x<0) { // Odd page 121*7d101cc1SGerry Weißbach $x = ($wPt/$this->k) - $this->annotMargin; 122*7d101cc1SGerry Weißbach } 123*7d101cc1SGerry Weißbach $w = $h = ($this->annotSize * $this->k); 124*7d101cc1SGerry Weißbach $a = $x * $this->k; 125*7d101cc1SGerry Weißbach // mPDF 3.0 126*7d101cc1SGerry Weißbach $b = $hPt - ($pl['y'] * $this->k); 127*7d101cc1SGerry Weißbach $rect = sprintf('%.3f %.3f %.3f %.3f', $a, $b-$h, $a+$w, $b); 128*7d101cc1SGerry Weißbach $annot .= '<</Type /Annot /Subtype /Text /Rect ['.$rect.']'; 129*7d101cc1SGerry Weißbach $annot .= ' /Contents '.$this->_UTF16BEtextstring($pl['txt']); 130*7d101cc1SGerry Weißbach $annot .= ' /NM ('.sprintf('%04u-%04u', $n, (2000 + $key)).')'; 131*7d101cc1SGerry Weißbach $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis')); 132*7d101cc1SGerry Weißbach $annot .= ' /CreationDate '.$this->_textstring('D:'.date('YmdHis')); 133*7d101cc1SGerry Weißbach $annot .= ' /Border [0 0 0]'; 134*7d101cc1SGerry Weißbach // mPDF 4.2.018 135*7d101cc1SGerry Weißbach if ($this->PDFA) { 136*7d101cc1SGerry Weißbach $annot .= ' /F 28'; 137*7d101cc1SGerry Weißbach $annot .= ' /CA 1'; 138*7d101cc1SGerry Weißbach } 139*7d101cc1SGerry Weißbach else if ($pl['opt']['ca']>0) { $annot .= ' /CA '.$pl['opt']['ca']; } 140*7d101cc1SGerry Weißbach 141*7d101cc1SGerry Weißbach $annot .= ' /C ['; 142*7d101cc1SGerry Weißbach if (isset($pl['opt']['c']) AND (is_array($pl['opt']['c']))) { 143*7d101cc1SGerry Weißbach foreach ($pl['opt']['c'] as $col) { 144*7d101cc1SGerry Weißbach $col = intval($col); 145*7d101cc1SGerry Weißbach $color = $col <= 0 ? 0 : ($col >= 255 ? 1 : $col / 255); 146*7d101cc1SGerry Weißbach $annot .= sprintf(" %.4f", $color); 147*7d101cc1SGerry Weißbach } 148*7d101cc1SGerry Weißbach } 149*7d101cc1SGerry Weißbach else { $annot .= '1 1 0'; } // mPDF 4.2.026 150*7d101cc1SGerry Weißbach $annot .= ']'; 151*7d101cc1SGerry Weißbach // Usually Author 152*7d101cc1SGerry Weißbach if (isset($pl['opt']['t']) AND is_string($pl['opt']['t'])) { 153*7d101cc1SGerry Weißbach $annot .= ' /T '.$this->_UTF16BEtextstring($pl['opt']['t']); 154*7d101cc1SGerry Weißbach } 155*7d101cc1SGerry Weißbach if (isset($pl['opt']['subj'])) { 156*7d101cc1SGerry Weißbach $annot .= ' /Subj '.$this->_UTF16BEtextstring($pl['opt']['subj']); 157*7d101cc1SGerry Weißbach } 158*7d101cc1SGerry Weißbach $iconsapp = array('Comment', 'Help', 'Insert', 'Key', 'NewParagraph', 'Note', 'Paragraph'); 159*7d101cc1SGerry Weißbach if (isset($pl['opt']['icon']) AND in_array($pl['opt']['icon'], $iconsapp)) { 160*7d101cc1SGerry Weißbach $annot .= ' /Name /'.$pl['opt']['icon']; 161*7d101cc1SGerry Weißbach } 162*7d101cc1SGerry Weißbach else { $annot .= ' /Name /Note'; } 163*7d101cc1SGerry Weißbach // mPDF 4.2.027 164*7d101cc1SGerry Weißbach if (!empty($pl['opt']['popup'])) { 165*7d101cc1SGerry Weißbach $annot .= ' /Open true'; 166*7d101cc1SGerry Weißbach $annot .= ' /Popup '.($this->n+1).' 0 R'; // mPDF 4.2.027 167*7d101cc1SGerry Weißbach } 168*7d101cc1SGerry Weißbach else { $annot .= ' /Open false'; } // mPDF 4.2.027 169*7d101cc1SGerry Weißbach $annot .= ' /P 3 0 R'; // mPDF 4.2.027 170*7d101cc1SGerry Weißbach $annot .= '>>'; 171*7d101cc1SGerry Weißbach $this->_out($annot); 172*7d101cc1SGerry Weißbach $this->_out('endobj'); 173*7d101cc1SGerry Weißbach 174*7d101cc1SGerry Weißbach // mPDF 4.2.027 175*7d101cc1SGerry Weißbach if (!empty($pl['opt']['popup'])) { 176*7d101cc1SGerry Weißbach $this->_newobj(); 177*7d101cc1SGerry Weißbach $annot=''; 178*7d101cc1SGerry Weißbach if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][0])) { $x = $pl['opt']['popup'][0] * $this->k; } 179*7d101cc1SGerry Weißbach else { $x = $pl['x'] * $this->k; } 180*7d101cc1SGerry Weißbach if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][1])) { $y = $hPt - ($pl['opt']['popup'][1] * $this->k); } 181*7d101cc1SGerry Weißbach else { $y = $hPt - ($pl['y'] * $this->k); } 182*7d101cc1SGerry Weißbach if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][2])) { $w = $pl['opt']['popup'][2] * $this->k; } 183*7d101cc1SGerry Weißbach else { $w = 180; } 184*7d101cc1SGerry Weißbach if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][3])) { $h = $pl['opt']['popup'][3] * $this->k; } 185*7d101cc1SGerry Weißbach else { $h = 120; } 186*7d101cc1SGerry Weißbach $rect = sprintf('%.3f %.3f %.3f %.3f', $x, $y-$h, $x+$w, $y); 187*7d101cc1SGerry Weißbach $annot .= '<</Type /Annot /Subtype /Popup /Rect ['.$rect.']'; 188*7d101cc1SGerry Weißbach $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis')); 189*7d101cc1SGerry Weißbach if ($this->PDFA) { $annot .= ' /F 28'; } 190*7d101cc1SGerry Weißbach $annot .= ' /P 3 0 R'; 191*7d101cc1SGerry Weißbach $annot .= ' /Parent '.($this->n-1).' 0 R'; 192*7d101cc1SGerry Weißbach $annot .= '>>'; 193*7d101cc1SGerry Weißbach $this->_out($annot); 194*7d101cc1SGerry Weißbach $this->_out('endobj'); 195*7d101cc1SGerry Weißbach } 196*7d101cc1SGerry Weißbach } 197*7d101cc1SGerry Weißbach } 198*7d101cc1SGerry Weißbach*/ /*-- END ANNOTATIONS --*/ 199*7d101cc1SGerry Weißbach/* } 200*7d101cc1SGerry Weißbach } 201*7d101cc1SGerry Weißbach } 202*7d101cc1SGerry Weißbach*/ 203*7d101cc1SGerry Weißbach } 204*7d101cc1SGerry Weißbach}