xref: /plugin/siteexport/inc/mpdf.php (revision 56c4b32d8c91c103da10f9e5918de8f7bcaa82cd)
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
10ed507305SGerry Weißbachif (file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/mpdf.php')) {
117d101cc1SGerry Weißbach
127d101cc1SGerry Weißbach    global $conf;
13a8c17ab5Si-net /// software    if (!defined('_MPDF_TEMP_PATH')) {
14a8c17ab5Si-net /// software        define('_MPDF_TEMP_PATH', $conf['tmpdir'] . '/dwpdf/' . rand(1, 1000) . '/');
15a8c17ab5Si-net /// software    }
16a8c17ab5Si-net /// software    if (!defined('_MPDF_TTFONTDATAPATH')) {
17a8c17ab5Si-net /// software        define('_MPDF_TTFONTDATAPATH', $conf['cachedir'] . '/mpdf_ttf/');
18a8c17ab5Si-net /// software    }
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
24a8c17ab5Si-net /// software        private $debugObj = null;
257d101cc1SGerry Weißbach
26a8c17ab5Si-net /// software        public 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;
40a8c17ab5Si-net /// software            if ($orientation == 'landscape') {
41a8c17ab5Si-net /// software                $format .= '-L';
42a8c17ab5Si-net /// software            }
43ed507305SGerry Weißbach
44ed507305SGerry Weißbach            switch ($conf['lang']) {
45ed507305SGerry Weißbach                case 'zh':
46ed507305SGerry Weißbach                case 'zh-tw':
47ed507305SGerry Weißbach                case 'ja':
48ed507305SGerry Weißbach                case 'ko':
49ed507305SGerry Weißbach                    $mode = '+aCJK';
50ed507305SGerry Weißbach                    break;
51ed507305SGerry Weißbach                default:
52ed507305SGerry Weißbach                    $mode = 'UTF-8-s';
53ed507305SGerry Weißbach
54ed507305SGerry Weißbach            }
55ed507305SGerry Weißbach
56ed507305SGerry Weißbach            // we're always UTF-8
57ed507305SGerry Weißbach            parent::__construct($mode, $format);
58ed507305SGerry Weißbach            $this->ignore_invalid_utf8 = true;
59ed507305SGerry Weißbach            $this->tabSpaces = 4;
607d101cc1SGerry Weißbach            $this->debugObj = $debug;
617f6f0f99SGerry Weißbach            $this->debug = $debug !== false;
627d101cc1SGerry Weißbach            $this->shrink_tables_to_fit = 1; // Does not shrink tables by default, only in emergency
637d101cc1SGerry Weißbach            $this->use_kwt = true; // avoids page-breaking in H1-H6 if a table follows directly
64d8d141cfSGerry Weißbach            $this->useSubstitutions = true;
657d101cc1SGerry Weißbach        }
667d101cc1SGerry Weißbach
67a8c17ab5Si-net /// software        public function message($msg, $vars = null, $lvl = 1)
687d101cc1SGerry Weißbach        {
69a8c17ab5Si-net /// software            if ($this->debugObj !== null) {
70a4a5b91dSGerry Weißbach                $this->debugObj->message($msg, $vars, $lvl);
717d101cc1SGerry Weißbach            }
727d101cc1SGerry Weißbach        }
737d101cc1SGerry Weißbach
74a8c17ab5Si-net /// software        public function Error($msg)
757d101cc1SGerry Weißbach        {
76a8c17ab5Si-net /// software            if ($this->debugObj !== null && method_exists($this->debugObj, 'runtimeException')) {
777f6f0f99SGerry Weißbach                $this->debugObj->runtimeException($msg);
787d101cc1SGerry Weißbach            } else {
797d101cc1SGerry Weißbach                parent::Error($msg);
807d101cc1SGerry Weißbach            }
817d101cc1SGerry Weißbach        }
827d101cc1SGerry Weißbach
83a8c17ab5Si-net /// software        public function GetFullPath(&$path,$basepath='') {
84a4a5b91dSGerry Weißbach
85a4a5b91dSGerry Weißbach            // Full Path might return a doubled path like /~gamma/documentation/lib//~gamma/documentation/lib/tpl/clearreports/./_print-images/background-bottom.jpg
86a4a5b91dSGerry Weißbach
87a4a5b91dSGerry Weißbach            $path = str_replace("\\","/",$path); //If on Windows
88a4a5b91dSGerry Weißbach            $path = preg_replace('/^\/\//','http://',$path);    // mPDF 5.6.27
89a4a5b91dSGerry Weißbach            $regexp = '|^./|';    // Inadvertently corrects "./path/etc" and "//www.domain.com/etc"
90a4a5b91dSGerry Weißbach            $path = preg_replace($regexp,'',$path);
91a4a5b91dSGerry Weißbach
92a4a5b91dSGerry Weißbach            if ( preg_match("/^.+\/\.\.\//", $path) ) {
93a4a5b91dSGerry Weißbach                // ../ not at the beginning
94a4a5b91dSGerry Weißbach                $newpath = array();
95a4a5b91dSGerry Weißbach                $oldpath = explode('/', $path);
96a4a5b91dSGerry Weißbach
97a4a5b91dSGerry Weißbach                foreach( $oldpath as $slice ) {
98a4a5b91dSGerry Weißbach                    if ( $slice == ".." && count($newpath) > 0 ) {
99a4a5b91dSGerry Weißbach                        array_pop($newpath);
100a4a5b91dSGerry Weißbach                        continue;
101a4a5b91dSGerry Weißbach                    }
102a4a5b91dSGerry Weißbach
103a4a5b91dSGerry Weißbach                    $newpath[] = $slice;
104a4a5b91dSGerry Weißbach                }
105a4a5b91dSGerry Weißbach
106a4a5b91dSGerry Weißbach                $path = implode('/', $newpath);
107a4a5b91dSGerry Weißbach            }
108a4a5b91dSGerry Weißbach
109a4a5b91dSGerry Weißbach            parent::GetFullPath($path, $basepath);
110a4a5b91dSGerry Weißbach
11156923262SGerry Weißbach            $regex = "/^(". preg_quote(DOKU_BASE, '/') .".+)\\1/";
112a4a5b91dSGerry Weißbach            if ( preg_match($regex, $path, $matches) ) {
113a4a5b91dSGerry Weißbach                $path = preg_replace($regex, "\\1", $path);
114a4a5b91dSGerry Weißbach            }
11556923262SGerry Weißbach
116a4a5b91dSGerry Weißbach        }
117a4a5b91dSGerry Weißbach
118fff1dd3dSGerry Weißbach        /*
119fff1dd3dSGerry Weißbach          Only when the toc is being generated
120fff1dd3dSGerry Weißbach        */
121a8c17ab5Si-net /// software        public function MovePages($target_page, $start_page, $end_page = -1) {
122fff1dd3dSGerry Weißbach            parent::MovePages($target_page, $start_page, $end_page);
123fff1dd3dSGerry Weißbach        }
124fff1dd3dSGerry Weißbach
125a8c17ab5Si-net /// software        public function OpenTag($tag, $attr, &$ahtml, &$ihtml) {
1267d101cc1SGerry Weißbach            switch ($tag) {
1277d101cc1SGerry Weißbach                case 'BOOKMARK':
1287d101cc1SGerry Weißbach                case 'TOCENTRY':
1297d101cc1SGerry Weißbach                    if ($attr['CONTENT']) {
1307d101cc1SGerry Weißbach                        // resolve double encoding
1317d101cc1SGerry Weißbach                        $attr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'], ENT_QUOTES);
1327d101cc1SGerry Weißbach                    }
1337d101cc1SGerry Weißbach                    break;
1347d101cc1SGerry Weißbach            }
135876523d1SGerry Weißbach            return parent::OpenTag($tag, $attr, $ahtml, $ihtml);
1367d101cc1SGerry Weißbach        }
1377d101cc1SGerry Weißbach    }
138d10fa28aSGerry Weißbach
139d10fa28aSGerry Weißbach    if (file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php') && !class_exists('cssmgr', false)) {
140ed507305SGerry Weißbach//*
141d10fa28aSGerry Weißbach        require_once(DOKU_PLUGIN . 'siteexport/inc/patchCSSmgr.php');
142d10fa28aSGerry Weißbach        $objPatch = new CSSMgrPatch(DOKU_PLUGIN . 'dw2pdf/mpdf/classes/cssmgr.php');
143ed507305SGerry Weißbach        if ($objPatch->redefineFunction(file_get_contents(DOKU_PLUGIN . 'siteexport/inc/readCSS.patch'))) {
144d10fa28aSGerry Weißbach            eval($objPatch->getCode());
145d10fa28aSGerry Weißbach        }
146ed507305SGerry Weißbach/*/
147ed507305SGerry Weißbach//*/
148ed507305SGerry Weißbach    }
149d10fa28aSGerry Weißbach
150*56c4b32dSGerry Weißbach} elseif (file_exists(DOKU_PLUGIN . 'dw2pdf/vendor/autoload.php') && file_exists(DOKU_PLUGIN . 'dw2pdf/DokuPDF.class.php')) {
151*56c4b32dSGerry Weißbach
152*56c4b32dSGerry Weißbach    /**
153*56c4b32dSGerry Weißbach     * dw2pdf ≥ ~2017: mPDF via Composer; {@see DokuPDF}
154*56c4b32dSGerry Weißbach     */
155*56c4b32dSGerry Weißbach    require_once DOKU_PLUGIN . 'dw2pdf/vendor/autoload.php';
156*56c4b32dSGerry Weißbach    require_once DOKU_PLUGIN . 'dw2pdf/DokuPDF.class.php';
157*56c4b32dSGerry Weißbach
158*56c4b32dSGerry Weißbach    class siteexportPDF extends DokuPDF
159*56c4b32dSGerry Weißbach    {
160*56c4b32dSGerry Weißbach        private $debugObj = null;
161*56c4b32dSGerry Weißbach
162*56c4b32dSGerry Weißbach        public function __construct($debug)
163*56c4b32dSGerry Weißbach        {
164*56c4b32dSGerry Weißbach            global $INPUT;
165*56c4b32dSGerry Weißbach            global $conf;
166*56c4b32dSGerry Weißbach
167*56c4b32dSGerry Weißbach            $dw2pdf = plugin_load('action', 'dw2pdf');
168*56c4b32dSGerry Weißbach            $pagesize = $INPUT->str('pagesize', $dw2pdf ? $dw2pdf->getConf('pagesize') : 'A4', true);
169*56c4b32dSGerry Weißbach            $orientation = $INPUT->str('orientation', $dw2pdf ? $dw2pdf->getConf('orientation') : 'portrait', true);
170*56c4b32dSGerry Weißbach            $fontsize = (int)($dw2pdf ? $dw2pdf->getConf('font-size') : 11);
171*56c4b32dSGerry Weißbach
172*56c4b32dSGerry Weißbach            parent::__construct($pagesize, $orientation, $fontsize, $conf['lang']);
173*56c4b32dSGerry Weißbach
174*56c4b32dSGerry Weißbach            $this->debugObj = $debug;
175*56c4b32dSGerry Weißbach            if (property_exists($this, 'debug')) {
176*56c4b32dSGerry Weißbach                $this->debug = $debug !== false;
177*56c4b32dSGerry Weißbach            }
178*56c4b32dSGerry Weißbach            $this->shrink_tables_to_fit = 1;
179*56c4b32dSGerry Weißbach            $this->use_kwt = true;
180*56c4b32dSGerry Weißbach            $this->useSubstitutions = true;
181*56c4b32dSGerry Weißbach        }
182*56c4b32dSGerry Weißbach
183*56c4b32dSGerry Weißbach        public function message($msg, $vars = null, $lvl = 1)
184*56c4b32dSGerry Weißbach        {
185*56c4b32dSGerry Weißbach            if ($this->debugObj !== null) {
186*56c4b32dSGerry Weißbach                $this->debugObj->message($msg, $vars, $lvl);
187*56c4b32dSGerry Weißbach            }
188*56c4b32dSGerry Weißbach        }
189*56c4b32dSGerry Weißbach
190*56c4b32dSGerry Weißbach        public function Error($msg)
191*56c4b32dSGerry Weißbach        {
192*56c4b32dSGerry Weißbach            if ($this->debugObj !== null && method_exists($this->debugObj, 'runtimeException')) {
193*56c4b32dSGerry Weißbach                $this->debugObj->runtimeException($msg);
194*56c4b32dSGerry Weißbach            } else {
195*56c4b32dSGerry Weißbach                throw new \Mpdf\MpdfException($msg);
196*56c4b32dSGerry Weißbach            }
197*56c4b32dSGerry Weißbach        }
198*56c4b32dSGerry Weißbach
199*56c4b32dSGerry Weißbach        public function GetFullPath(&$path, $basepath = '')
200*56c4b32dSGerry Weißbach        {
201*56c4b32dSGerry Weißbach            $path = str_replace("\\", "/", $path);
202*56c4b32dSGerry Weißbach            $path = preg_replace('/^\/\//', 'http://', $path);
203*56c4b32dSGerry Weißbach            $regexp = '|^./|';
204*56c4b32dSGerry Weißbach            $path = preg_replace($regexp, '', $path);
205*56c4b32dSGerry Weißbach
206*56c4b32dSGerry Weißbach            if (preg_match("/^.+\/\.\.\//", $path)) {
207*56c4b32dSGerry Weißbach                $newpath = array();
208*56c4b32dSGerry Weißbach                $oldpath = explode('/', $path);
209*56c4b32dSGerry Weißbach
210*56c4b32dSGerry Weißbach                foreach ($oldpath as $slice) {
211*56c4b32dSGerry Weißbach                    if ($slice == ".." && count($newpath) > 0) {
212*56c4b32dSGerry Weißbach                        array_pop($newpath);
213*56c4b32dSGerry Weißbach                        continue;
214*56c4b32dSGerry Weißbach                    }
215*56c4b32dSGerry Weißbach
216*56c4b32dSGerry Weißbach                    $newpath[] = $slice;
217*56c4b32dSGerry Weißbach                }
218*56c4b32dSGerry Weißbach
219*56c4b32dSGerry Weißbach                $path = implode('/', $newpath);
220*56c4b32dSGerry Weißbach            }
221*56c4b32dSGerry Weißbach
222*56c4b32dSGerry Weißbach            parent::GetFullPath($path, $basepath);
223*56c4b32dSGerry Weißbach
224*56c4b32dSGerry Weißbach            $regex = "/^(" . preg_quote(DOKU_BASE, '/') . ".+)\\1/";
225*56c4b32dSGerry Weißbach            if (preg_match($regex, $path, $matches)) {
226*56c4b32dSGerry Weißbach                $path = preg_replace($regex, "\\1", $path);
227*56c4b32dSGerry Weißbach            }
228*56c4b32dSGerry Weißbach        }
229*56c4b32dSGerry Weißbach
230*56c4b32dSGerry Weißbach        public function MovePages($target_page, $start_page, $end_page = -1)
231*56c4b32dSGerry Weißbach        {
232*56c4b32dSGerry Weißbach            parent::MovePages($target_page, $start_page, $end_page);
233*56c4b32dSGerry Weißbach        }
234*56c4b32dSGerry Weißbach    }
235*56c4b32dSGerry Weißbach
2367d101cc1SGerry Weißbach}
237