xref: /plugin/dw2pdf/DokuPDF.class.php (revision 1c9fae9eda14b27299d8f89b406a1d73eade9c42)
1<?php
2/**
3 * Wrapper around the mpdf library class
4 *
5 * This class overrides some functions to make mpdf make use of DokuWiki'
6 * standard tools instead of its own.
7 *
8 * @author Andreas Gohr <andi@splitbrain.org>
9 */
10
11if(!defined('_MPDF_TEMP_PATH')) define('_MPDF_TEMP_PATH', $conf['tmpdir'].'/dwpdf/'.rand(1,1000).'/');
12if(!defined('_MPDF_TTFONTDATAPATH')) define('_MPDF_TTFONTDATAPATH',$conf['cachedir'].'/mpdf_ttf/');
13require_once(dirname(__FILE__)."/mpdf/mpdf.php");
14
15class DokuPDF extends mpdf {
16
17    function __construct(){
18        io_mkdir_p(_MPDF_TTFONTDATAPATH);
19        io_mkdir_p(_MPDF_TEMP_PATH);
20
21        // we're always UTF-8
22        parent::__construct('UTF-8-s');
23        $this->SetAutoFont(AUTOFONT_ALL);
24        $this->ignore_invalid_utf8 = true;
25    }
26
27    /**
28     * Cleanup temp dir
29     */
30    function __destruct(){
31        $this->deletedir(_MPDF_TEMP_PATH);
32    }
33
34    /**
35     * Recursively delete a directory and its contents
36     *
37     * @link http://de3.php.net/manual/en/function.rmdir.php#108113
38     */
39    function deletedir($dir){
40        foreach(glob($dir . '/*') as $file) {
41            if(is_dir($file))
42                $this->deletedir($file);
43            else
44                @unlink($file);
45        }
46        @rmdir($dir);
47    }
48
49    /**
50     * Decode all paths, since DokuWiki uses XHTML compliant URLs
51     */
52    function GetFullPath(&$path,$basepath=''){
53        $path = htmlspecialchars_decode($path);
54        parent::GetFullPath($path, $basepath);
55    }
56
57    /**
58     * Override the mpdf _getImage function
59     *
60     * This function takes care of gathering the image data from HTTP or
61     * local files before passing the data back to mpdf's original function
62     * making sure that only cached file paths are passed to mpdf. It also
63     * takes care of checking image ACls.
64     */
65    function _getImage(&$file, $firsttime=true, $allowvector=true, $orig_srcpath=false){
66        list($ext,$mime) = mimetype($file);
67
68        // build regex to parse URL back to media info
69        $re = preg_quote(ml('xxx123yyy','',true,'&',true),'/');
70        $re = str_replace('xxx123yyy','([^&\?]*)',$re);
71
72        // extract the real media from a fetch.php uri and determine mime
73        if(preg_match("/^$re/",$file,$m) ||
74            preg_match('/[&\?]media=([^&\?]*)/',$file,$m)){
75            $media = rawurldecode($m[1]);
76            list($ext,$mime) = mimetype($media);
77        }else{
78            list($ext,$mime) = mimetype($file);
79        }
80
81        // local files
82        if(substr($file,0,9) == 'dw2pdf://'){
83            // support local files passed from plugins
84            $local = substr($file,9);
85        }elseif(!preg_match('/(\.php|\?)/',$file)){
86            $re = preg_quote(DOKU_URL,'/');
87            // directly access local files instead of using HTTP, skip dynamic content
88            $local = preg_replace("/^$re/i",DOKU_INC,$file);
89        }
90
91        if(substr($mime,0,6) == 'image/'){
92            if(!empty($media)){
93                // any size restrictions?
94                if(preg_match('/[\?&]w=(\d+)/',$file, $m)) $w = $m[1];
95                if(preg_match('/[\?&]h=(\d+)/',$file, $m)) $h = $m[1];
96
97                if(preg_match('/^https?:\/\//',$media)){
98                    $local = media_get_from_URL($media,$ext,-1);
99                    if(!$local) $local = $media; // let mpdf try again
100                }else{
101                    $media = cleanID($media);
102                    //check permissions (namespace only)
103                    if(auth_quickaclcheck(getNS($media).':X') < AUTH_READ){
104                        $file = '';
105                    }
106                    $local  = mediaFN($media);
107                }
108
109                //handle image resizing/cropping
110                if($w && file_exists($local)){
111                    if($h){
112                        $local = media_crop_image($local,$ext,$w,$h);
113                    }else{
114                        $local = media_resize_image($local,$ext,$w,$h);
115                    }
116                }
117            }elseif(preg_match('/^https?:\/\//',$file)){ // fixed external URLs
118                $local = media_get_from_URL($file,$ext,$conf['cachetime']);
119            }
120
121            if($local){
122                $file = $local;
123                $orig_srcpath = $local;
124            }
125        }
126
127        return parent::_getImage($file, $firsttime, $allowvector, $orig_srcpath);
128    }
129
130}
131