xref: /plugin/siteexport/inc/mpdf.php (revision a4a5b91d8f969b6bfc5f121ab4ebde86367665d7)
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}