xref: /plugin/siteexport/inc/mpdf.php (revision fff1dd3d17e36f3dd5b1c1cdc5fbe9a72061a30f)
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
14ed507305SGerry Weißbachif ( file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/mpdf.php') ) {
157d101cc1SGerry Weißbach
167d101cc1SGerry Weißbach    global $conf;
17ed507305SGerry Weißbach    if(!defined('_MPDF_TEMP_PATH')) define('_MPDF_TEMP_PATH', $conf['tmpdir'].'/dwpdf/'.rand(1,1000).'/');
18ed507305SGerry Weißbach    if(!defined('_MPDF_TTFONTDATAPATH')) define('_MPDF_TTFONTDATAPATH',$conf['cachedir'].'/mpdf_ttf/');
197d101cc1SGerry Weißbach
20ed507305SGerry Weißbach    require_once(DOKU_PLUGIN . 'dw2pdf/mpdf/mpdf.php');
217d101cc1SGerry Weißbach
22ed507305SGerry Weißbach    class siteexportPDF extends mpdf {
237d101cc1SGerry Weißbach
247f6f0f99SGerry Weißbach        private $debugObj = false;
257d101cc1SGerry Weißbach
267f6f0f99SGerry Weißbach		function __construct($debug) {
277f6f0f99SGerry Weißbach            global $INPUT;
28ed507305SGerry Weißbach            global $conf;
29a4a5b91dSGerry Weißbach
30bca58ac1SGerry Weißbach            $dw2pdf = plugin_load('action', 'dw2pdf');
317f6f0f99SGerry Weißbach
327f6f0f99SGerry Weißbach		    // decide on the paper setup from param or config
337f6f0f99SGerry Weißbach            $pagesize    = $INPUT->str('pagesize', $dw2pdf->getConf('pagesize'), true);
347f6f0f99SGerry Weißbach            $orientation = $INPUT->str('orientation', $dw2pdf->getConf('orientation'), true);
357f6f0f99SGerry Weißbach
36ed507305SGerry Weißbach            io_mkdir_p(_MPDF_TTFONTDATAPATH);
37ed507305SGerry Weißbach            io_mkdir_p(_MPDF_TEMP_PATH);
38ed507305SGerry Weißbach
39ed507305SGerry Weißbach            $format = $pagesize;
40ed507305SGerry Weißbach            if($orientation == 'landscape') $format .= '-L';
41ed507305SGerry Weißbach
42ed507305SGerry Weißbach            switch($conf['lang']) {
43ed507305SGerry Weißbach                case 'zh':
44ed507305SGerry Weißbach                case 'zh-tw':
45ed507305SGerry Weißbach                case 'ja':
46ed507305SGerry Weißbach                case 'ko':
47ed507305SGerry Weißbach                    $mode = '+aCJK';
48ed507305SGerry Weißbach                    break;
49ed507305SGerry Weißbach                default:
50ed507305SGerry Weißbach                    $mode = 'UTF-8-s';
51ed507305SGerry Weißbach
52ed507305SGerry Weißbach            }
53ed507305SGerry Weißbach
54ed507305SGerry Weißbach            // we're always UTF-8
55ed507305SGerry Weißbach            parent::__construct($mode, $format);
56ed507305SGerry Weißbach            $this->SetAutoFont(AUTOFONT_ALL);
57ed507305SGerry Weißbach            $this->ignore_invalid_utf8 = true;
58ed507305SGerry Weißbach            $this->tabSpaces = 4;
597d101cc1SGerry Weißbach            $this->debugObj = $debug;
607f6f0f99SGerry Weißbach            $this->debug = $debug !== false;
617d101cc1SGerry Weißbach            $this->shrink_tables_to_fit = 1; // Does not shrink tables by default, only in emergency
627d101cc1SGerry Weißbach            $this->use_kwt = true; // avoids page-breaking in H1-H6 if a table follows directly
637d101cc1SGerry Weißbach        }
647d101cc1SGerry Weißbach
657d101cc1SGerry Weißbach        function message($msg, $vars=null, $lvl=1)
667d101cc1SGerry Weißbach        {
677d101cc1SGerry Weißbach            if ( $this->debugObj !== false ) {
68a4a5b91dSGerry Weißbach                $this->debugObj->message($msg, $vars, $lvl);
697d101cc1SGerry Weißbach            }
707d101cc1SGerry Weißbach        }
717d101cc1SGerry Weißbach
727d101cc1SGerry Weißbach        function Error($msg)
737d101cc1SGerry Weißbach        {
747f6f0f99SGerry Weißbach            if ( $this->debugObj !== false && method_exists($this->debugObj, 'runtimeException') ) {
757f6f0f99SGerry Weißbach                $this->debugObj->runtimeException($msg);
767d101cc1SGerry Weißbach            } else {
777d101cc1SGerry Weißbach                parent::Error($msg);
787d101cc1SGerry Weißbach            }
797d101cc1SGerry Weißbach        }
807d101cc1SGerry Weißbach
81*fff1dd3dSGerry Weißbach//*
82*fff1dd3dSGerry Weißbach        // Nothing
83*fff1dd3dSGerry Weißbach/*/
84*fff1dd3dSGerry Weißbach        var $previousPage = '';
85*fff1dd3dSGerry Weißbach        var $currentPage = '';
86*fff1dd3dSGerry Weißbach        var $skipAddPage = false;
87*fff1dd3dSGerry Weißbach
88*fff1dd3dSGerry Weißbach        function Footer(){
89*fff1dd3dSGerry Weißbach
90*fff1dd3dSGerry Weißbach            $currentPage = $this->pages[count($this->pages)];
91*fff1dd3dSGerry Weißbach            $this->skipAddPage = $this->previousPage && $this->pages[count($this->pages)] == $this->currentPage;
92*fff1dd3dSGerry Weißbach
93*fff1dd3dSGerry Weißbach            if ( $this->skipAddPage ) {
94*fff1dd3dSGerry Weißbach                $this->message("HAS TO REMOVE PAGE:", count($this->pages));
95*fff1dd3dSGerry Weißbach            }
96*fff1dd3dSGerry Weißbach
97*fff1dd3dSGerry Weißbach            $this->currentPage = $currentPage;
98*fff1dd3dSGerry Weißbach            parent::Footer();
99*fff1dd3dSGerry Weißbach        }
100*fff1dd3dSGerry Weißbach        function AddPage($orientation='',$condition='', $resetpagenum='', $pagenumstyle='', $suppress='',$mgl='',$mgr='',$mgt='',$mgb='',$mgh='',$mgf='',$ohname='',$ehname='',$ofname='',$efname='',$ohvalue=0,$ehvalue=0,$ofvalue=0,$efvalue=0,$pagesel='',$newformat='')
101*fff1dd3dSGerry Weißbach        {
102*fff1dd3dSGerry Weißbach
103*fff1dd3dSGerry Weißbach            if ( $skipAddPage ) { return; }
104*fff1dd3dSGerry Weißbach
105*fff1dd3dSGerry Weißbach            $count = count($this->pages);
106*fff1dd3dSGerry Weißbach            $stack = array();
107*fff1dd3dSGerry Weißbach            $trace = debug_backtrace();
108*fff1dd3dSGerry Weißbach            foreach( $trace as $entry ) {
109*fff1dd3dSGerry Weißbach                $vars = substr(implode(',', $entry['args']), 0, 20);
110*fff1dd3dSGerry Weißbach                $stack[] = "{$entry['function']}({$vars}) | {$entry['file']} | {$entry['line']}";
111*fff1dd3dSGerry Weißbach            }
112*fff1dd3dSGerry Weißbach
113*fff1dd3dSGerry Weißbach            $this->message("Is Adding Page $count: $orientation,$condition, $resetpagenum, $pagenumstyle,$suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat", $stack, 1);
114*fff1dd3dSGerry Weißbach
115*fff1dd3dSGerry Weißbach            parent::AddPage($orientation,$condition, $resetpagenum, $pagenumstyle,$suppress,$mgl,$mgr,$mgt,$mgb,$mgh,$mgf,$ohname,$ehname,$ofname,$efname,$ohvalue,$ehvalue,$ofvalue,$efvalue,$pagesel,$newformat);
116*fff1dd3dSGerry Weißbach        }
117*fff1dd3dSGerry Weißbach//*/
118*fff1dd3dSGerry Weißbach
119a4a5b91dSGerry Weißbach        function GetFullPath(&$path,$basepath='') {
120a4a5b91dSGerry Weißbach
121a4a5b91dSGerry Weißbach        	// Full Path might return a doubled path like /~gamma/documentation/lib//~gamma/documentation/lib/tpl/clearreports/./_print-images/background-bottom.jpg
122a4a5b91dSGerry Weißbach
123a4a5b91dSGerry Weißbach			$path = str_replace("\\","/",$path); //If on Windows
124a4a5b91dSGerry Weißbach			$path = preg_replace('/^\/\//','http://',$path);	// mPDF 5.6.27
125a4a5b91dSGerry Weißbach			$regexp = '|^./|';	// Inadvertently corrects "./path/etc" and "//www.domain.com/etc"
126a4a5b91dSGerry Weißbach			$path = preg_replace($regexp,'',$path);
127a4a5b91dSGerry Weißbach
128a4a5b91dSGerry Weißbach        	if ( preg_match("/^.+\/\.\.\//", $path) ) {
129a4a5b91dSGerry Weißbach        		// ../ not at the beginning
130a4a5b91dSGerry Weißbach	        	$newpath = array();
131a4a5b91dSGerry Weißbach	        	$oldpath = explode('/', $path);
132a4a5b91dSGerry Weißbach
133a4a5b91dSGerry Weißbach	        	foreach( $oldpath as $slice ) {
134a4a5b91dSGerry Weißbach		        	if ( $slice == ".." && count($newpath) > 0 ) {
135a4a5b91dSGerry Weißbach			        	array_pop($newpath);
136a4a5b91dSGerry Weißbach			        	continue;
137a4a5b91dSGerry Weißbach		        	}
138a4a5b91dSGerry Weißbach
139a4a5b91dSGerry Weißbach		        	$newpath[] = $slice;
140a4a5b91dSGerry Weißbach	        	}
141a4a5b91dSGerry Weißbach
142a4a5b91dSGerry Weißbach	        	$path = implode('/', $newpath);
143a4a5b91dSGerry Weißbach        	}
144a4a5b91dSGerry Weißbach
145a4a5b91dSGerry Weißbach        	parent::GetFullPath($path, $basepath);
146a4a5b91dSGerry Weißbach
14756923262SGerry Weißbach        	$regex = "/^(". preg_quote(DOKU_BASE, '/') .".+)\\1/";
148a4a5b91dSGerry Weißbach        	if ( preg_match($regex, $path, $matches) ) {
149a4a5b91dSGerry Weißbach        		$path = preg_replace($regex, "\\1", $path);
150a4a5b91dSGerry Weißbach        	}
15156923262SGerry Weißbach
152a4a5b91dSGerry Weißbach        }
153a4a5b91dSGerry Weißbach
154*fff1dd3dSGerry Weißbach        /*
155*fff1dd3dSGerry Weißbach          Only when the toc is being generated
156*fff1dd3dSGerry Weißbach        */
157*fff1dd3dSGerry Weißbach        function MovePages($target_page, $start_page, $end_page=-1) {
158*fff1dd3dSGerry Weißbach            parent::MovePages($target_page, $start_page, $end_page);
159*fff1dd3dSGerry Weißbach        }
160*fff1dd3dSGerry Weißbach
1617d101cc1SGerry Weißbach        function OpenTag($tag, $attr) {
1627d101cc1SGerry Weißbach            switch($tag) {
1637d101cc1SGerry Weißbach                case 'BOOKMARK':
1647d101cc1SGerry Weißbach                case 'TOCENTRY':
1657d101cc1SGerry Weißbach                    if ( $attr['CONTENT'] ) {
1667d101cc1SGerry Weißbach                        // resolve double encoding
1677d101cc1SGerry Weißbach                        $attr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'], ENT_QUOTES);
1687d101cc1SGerry Weißbach                    }
1697d101cc1SGerry Weißbach                    break;
1707d101cc1SGerry Weißbach            }
1717d101cc1SGerry Weißbach            return parent::OpenTag($tag, $attr);
1727d101cc1SGerry Weißbach        }
1737d101cc1SGerry Weißbach    }
174d10fa28aSGerry Weißbach
175d10fa28aSGerry Weißbach    if ( file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php') && !class_exists('cssmgr', false)) {
176ed507305SGerry Weißbach//*
177d10fa28aSGerry Weißbach        require_once(DOKU_PLUGIN . 'siteexport/inc/patchCSSmgr.php');
178d10fa28aSGerry Weißbach        $objPatch = new CSSMgrPatch(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php');
179ed507305SGerry Weißbach        if ( $objPatch->redefineFunction(file_get_contents(DOKU_PLUGIN . 'siteexport/inc/readCSS.patch')) ) {
180d10fa28aSGerry Weißbach            eval($objPatch->getCode());
181d10fa28aSGerry Weißbach        }
182ed507305SGerry Weißbach/*/
183ed507305SGerry Weißbach//*/
184ed507305SGerry Weißbach    }
185d10fa28aSGerry Weißbach
1867d101cc1SGerry Weißbach}
187