xref: /plugin/siteexport/inc/mpdf.php (revision 876523d1ff88fbe6aff7c288eec4e84e8d8f1e34)
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->ignore_invalid_utf8 = true;
57ed507305SGerry Weißbach            $this->tabSpaces = 4;
587d101cc1SGerry Weißbach            $this->debugObj = $debug;
597f6f0f99SGerry Weißbach            $this->debug = $debug !== false;
607d101cc1SGerry Weißbach            $this->shrink_tables_to_fit = 1; // Does not shrink tables by default, only in emergency
617d101cc1SGerry Weißbach            $this->use_kwt = true; // avoids page-breaking in H1-H6 if a table follows directly
627d101cc1SGerry Weißbach        }
637d101cc1SGerry Weißbach
647d101cc1SGerry Weißbach        function message($msg, $vars=null, $lvl=1)
657d101cc1SGerry Weißbach        {
667d101cc1SGerry Weißbach            if ( $this->debugObj !== false ) {
67a4a5b91dSGerry Weißbach                $this->debugObj->message($msg, $vars, $lvl);
687d101cc1SGerry Weißbach            }
697d101cc1SGerry Weißbach        }
707d101cc1SGerry Weißbach
717d101cc1SGerry Weißbach        function Error($msg)
727d101cc1SGerry Weißbach        {
737f6f0f99SGerry Weißbach            if ( $this->debugObj !== false && method_exists($this->debugObj, 'runtimeException') ) {
747f6f0f99SGerry Weißbach                $this->debugObj->runtimeException($msg);
757d101cc1SGerry Weißbach            } else {
767d101cc1SGerry Weißbach                parent::Error($msg);
777d101cc1SGerry Weißbach            }
787d101cc1SGerry Weißbach        }
797d101cc1SGerry Weißbach
80fff1dd3dSGerry Weißbach//*
81fff1dd3dSGerry Weißbach        // Nothing
82fff1dd3dSGerry Weißbach/*/
83fff1dd3dSGerry Weißbach        var $previousPage = '';
84fff1dd3dSGerry Weißbach        var $currentPage = '';
85fff1dd3dSGerry Weißbach        var $skipAddPage = false;
86fff1dd3dSGerry Weißbach
87fff1dd3dSGerry Weißbach        function Footer(){
88fff1dd3dSGerry Weißbach
89fff1dd3dSGerry Weißbach            $currentPage = $this->pages[count($this->pages)];
90fff1dd3dSGerry Weißbach            $this->skipAddPage = $this->previousPage && $this->pages[count($this->pages)] == $this->currentPage;
91fff1dd3dSGerry Weißbach
92fff1dd3dSGerry Weißbach            if ( $this->skipAddPage ) {
93fff1dd3dSGerry Weißbach                $this->message("HAS TO REMOVE PAGE:", count($this->pages));
94fff1dd3dSGerry Weißbach            }
95fff1dd3dSGerry Weißbach
96fff1dd3dSGerry Weißbach            $this->currentPage = $currentPage;
97fff1dd3dSGerry Weißbach            parent::Footer();
98fff1dd3dSGerry Weißbach        }
99fff1dd3dSGerry 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='')
100fff1dd3dSGerry Weißbach        {
101fff1dd3dSGerry Weißbach
102fff1dd3dSGerry Weißbach            if ( $skipAddPage ) { return; }
103fff1dd3dSGerry Weißbach
104fff1dd3dSGerry Weißbach            $count = count($this->pages);
105fff1dd3dSGerry Weißbach            $stack = array();
106fff1dd3dSGerry Weißbach            $trace = debug_backtrace();
107fff1dd3dSGerry Weißbach            foreach( $trace as $entry ) {
108fff1dd3dSGerry Weißbach                $vars = substr(implode(',', $entry['args']), 0, 20);
109fff1dd3dSGerry Weißbach                $stack[] = "{$entry['function']}({$vars}) | {$entry['file']} | {$entry['line']}";
110fff1dd3dSGerry Weißbach            }
111fff1dd3dSGerry Weißbach
112e393d3ccSGerry Weißbach            array_unshift($stack, "(({$this->y}+{$this->divheight}>{$this->PageBreakTrigger}) || ({$this->y}+h>{$this->PageBreakTrigger}) ||
113e393d3ccSGerry Weißbach		({$this->y}+(h*2)+{$this->blk[$this->blklvl]['padding_bottom']}+{$this->blk[$this->blklvl]['margin_bottom']}>{$this->PageBreakTrigger} && {$this->blk[$this->blklvl]['page_break_after_avoid']})) and !{$this->InFooter} and AcceptPageBreak())");
114e393d3ccSGerry Weißbach
115fff1dd3dSGerry 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);
116fff1dd3dSGerry Weißbach
117fff1dd3dSGerry 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);
118fff1dd3dSGerry Weißbach        }
119fff1dd3dSGerry Weißbach//*/
120fff1dd3dSGerry Weißbach
121a4a5b91dSGerry Weißbach        function GetFullPath(&$path,$basepath='') {
122a4a5b91dSGerry Weißbach
123a4a5b91dSGerry Weißbach        	// Full Path might return a doubled path like /~gamma/documentation/lib//~gamma/documentation/lib/tpl/clearreports/./_print-images/background-bottom.jpg
124a4a5b91dSGerry Weißbach
125a4a5b91dSGerry Weißbach			$path = str_replace("\\","/",$path); //If on Windows
126a4a5b91dSGerry Weißbach			$path = preg_replace('/^\/\//','http://',$path);	// mPDF 5.6.27
127a4a5b91dSGerry Weißbach			$regexp = '|^./|';	// Inadvertently corrects "./path/etc" and "//www.domain.com/etc"
128a4a5b91dSGerry Weißbach			$path = preg_replace($regexp,'',$path);
129a4a5b91dSGerry Weißbach
130a4a5b91dSGerry Weißbach        	if ( preg_match("/^.+\/\.\.\//", $path) ) {
131a4a5b91dSGerry Weißbach        		// ../ not at the beginning
132a4a5b91dSGerry Weißbach	        	$newpath = array();
133a4a5b91dSGerry Weißbach	        	$oldpath = explode('/', $path);
134a4a5b91dSGerry Weißbach
135a4a5b91dSGerry Weißbach	        	foreach( $oldpath as $slice ) {
136a4a5b91dSGerry Weißbach		        	if ( $slice == ".." && count($newpath) > 0 ) {
137a4a5b91dSGerry Weißbach			        	array_pop($newpath);
138a4a5b91dSGerry Weißbach			        	continue;
139a4a5b91dSGerry Weißbach		        	}
140a4a5b91dSGerry Weißbach
141a4a5b91dSGerry Weißbach		        	$newpath[] = $slice;
142a4a5b91dSGerry Weißbach	        	}
143a4a5b91dSGerry Weißbach
144a4a5b91dSGerry Weißbach	        	$path = implode('/', $newpath);
145a4a5b91dSGerry Weißbach        	}
146a4a5b91dSGerry Weißbach
147a4a5b91dSGerry Weißbach        	parent::GetFullPath($path, $basepath);
148a4a5b91dSGerry Weißbach
14956923262SGerry Weißbach        	$regex = "/^(". preg_quote(DOKU_BASE, '/') .".+)\\1/";
150a4a5b91dSGerry Weißbach        	if ( preg_match($regex, $path, $matches) ) {
151a4a5b91dSGerry Weißbach        		$path = preg_replace($regex, "\\1", $path);
152a4a5b91dSGerry Weißbach        	}
15356923262SGerry Weißbach
154a4a5b91dSGerry Weißbach        }
155a4a5b91dSGerry Weißbach
156fff1dd3dSGerry Weißbach        /*
157fff1dd3dSGerry Weißbach          Only when the toc is being generated
158fff1dd3dSGerry Weißbach        */
159fff1dd3dSGerry Weißbach        function MovePages($target_page, $start_page, $end_page=-1) {
160fff1dd3dSGerry Weißbach            parent::MovePages($target_page, $start_page, $end_page);
161fff1dd3dSGerry Weißbach        }
162fff1dd3dSGerry Weißbach
163*876523d1SGerry Weißbach        function OpenTag($tag,$attr,&$ahtml,&$ihtml) {
1647d101cc1SGerry Weißbach            switch($tag) {
1657d101cc1SGerry Weißbach                case 'BOOKMARK':
1667d101cc1SGerry Weißbach                case 'TOCENTRY':
1677d101cc1SGerry Weißbach                    if ( $attr['CONTENT'] ) {
1687d101cc1SGerry Weißbach                        // resolve double encoding
1697d101cc1SGerry Weißbach                        $attr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'], ENT_QUOTES);
1707d101cc1SGerry Weißbach                    }
1717d101cc1SGerry Weißbach                    break;
1727d101cc1SGerry Weißbach            }
173*876523d1SGerry Weißbach            return parent::OpenTag($tag,$attr,$ahtml,$ihtml);
1747d101cc1SGerry Weißbach        }
1757d101cc1SGerry Weißbach    }
176d10fa28aSGerry Weißbach
177d10fa28aSGerry Weißbach    if ( file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php') && !class_exists('cssmgr', false)) {
178ed507305SGerry Weißbach//*
179d10fa28aSGerry Weißbach        require_once(DOKU_PLUGIN . 'siteexport/inc/patchCSSmgr.php');
180d10fa28aSGerry Weißbach        $objPatch = new CSSMgrPatch(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php');
181ed507305SGerry Weißbach        if ( $objPatch->redefineFunction(file_get_contents(DOKU_PLUGIN . 'siteexport/inc/readCSS.patch')) ) {
182d10fa28aSGerry Weißbach            eval($objPatch->getCode());
183d10fa28aSGerry Weißbach        }
184ed507305SGerry Weißbach/*/
185ed507305SGerry Weißbach//*/
186ed507305SGerry Weißbach    }
187d10fa28aSGerry Weißbach
1887d101cc1SGerry Weißbach}
189