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