xref: /plugin/siteexport/inc/mpdf.php (revision 7d101cc131696cb3a0de345d8044a69fb2ef70e9)
1*7d101cc1SGerry Weißbach<?php
2*7d101cc1SGerry Weißbach/**
3*7d101cc1SGerry Weißbach * Site Export Plugin - mPDF Extension
4*7d101cc1SGerry Weißbach *
5*7d101cc1SGerry Weißbach * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6*7d101cc1SGerry Weißbach * @author     i-net software <tools@inetsoftware.de>
7*7d101cc1SGerry Weißbach * @author     Gerry Weissbach <gweissbach@inetsoftware.de>
8*7d101cc1SGerry Weißbach */
9*7d101cc1SGerry Weißbach
10*7d101cc1SGerry Weißbach// must be run within Dokuwiki
11*7d101cc1SGerry Weißbachif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
12*7d101cc1SGerry Weißbachif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
13*7d101cc1SGerry Weißbach
14*7d101cc1SGerry Weißbachif ( file_exists(DOKU_PLUGIN . 'dw2pdf/mpdf/mpdf.php') ) {
15*7d101cc1SGerry Weißbach
16*7d101cc1SGerry Weißbach	global $conf;
17*7d101cc1SGerry Weißbach	if(!defined('_MPDF_TEMP_PATH')) define('_MPDF_TEMP_PATH', $conf['tmpdir'].'/dwpdf/'.rand(1,1000).'/');
18*7d101cc1SGerry Weißbach
19*7d101cc1SGerry Weißbach    require_once(DOKU_PLUGIN . 'dw2pdf/mpdf/mpdf.php');
20*7d101cc1SGerry Weißbach
21*7d101cc1SGerry Weißbach    class siteexportPDF extends mPDF {
22*7d101cc1SGerry Weißbach
23*7d101cc1SGerry Weißbach        var $debugObj = true;
24*7d101cc1SGerry Weißbach
25*7d101cc1SGerry Weißbach        function siteexportPDF($encoding, $debug=false) {
26*7d101cc1SGerry Weißbach            parent::mPDF($encoding);
27*7d101cc1SGerry Weißbach            $this->debugObj = $debug;
28*7d101cc1SGerry Weißbach            $this->debug = true;
29*7d101cc1SGerry Weißbach            $this->shrink_tables_to_fit = 1; // Does not shrink tables by default, only in emergency
30*7d101cc1SGerry Weißbach            $this->use_kwt = true; // avoids page-breaking in H1-H6 if a table follows directly
31*7d101cc1SGerry Weißbach        }
32*7d101cc1SGerry Weißbach
33*7d101cc1SGerry Weißbach        function message($msg, $vars=null, $lvl=1)
34*7d101cc1SGerry Weißbach        {
35*7d101cc1SGerry Weißbach            if ( $this->debugObj !== false ) {
36*7d101cc1SGerry Weißbach                // $this->debugObj->message($msg, $vars, $lvl);
37*7d101cc1SGerry Weißbach            }
38*7d101cc1SGerry Weißbach        }
39*7d101cc1SGerry Weißbach
40*7d101cc1SGerry Weißbach        function Error($msg)
41*7d101cc1SGerry Weißbach        {
42*7d101cc1SGerry Weißbach            if ( $this->debug !== false && $lvl == null && method_exists($this->debug, 'runtimeException') ) {
43*7d101cc1SGerry Weißbach                $this->debug->runtimeException($msg);
44*7d101cc1SGerry Weißbach            } else {
45*7d101cc1SGerry Weißbach                parent::Error($msg);
46*7d101cc1SGerry Weißbach            }
47*7d101cc1SGerry Weißbach        }
48*7d101cc1SGerry Weißbach
49*7d101cc1SGerry Weißbach        function OpenTag($tag, $attr) {
50*7d101cc1SGerry Weißbach            switch($tag) {
51*7d101cc1SGerry Weißbach                case 'BOOKMARK':
52*7d101cc1SGerry Weißbach                case 'TOCENTRY':
53*7d101cc1SGerry Weißbach                    if ( $attr['CONTENT'] ) {
54*7d101cc1SGerry Weißbach                        // resolve double encoding
55*7d101cc1SGerry Weißbach                        $attr['CONTENT'] = htmlspecialchars_decode($attr['CONTENT'], ENT_QUOTES);
56*7d101cc1SGerry Weißbach                    }
57*7d101cc1SGerry Weißbach                    break;
58*7d101cc1SGerry Weißbach            }
59*7d101cc1SGerry Weißbach            return parent::OpenTag($tag, $attr);
60*7d101cc1SGerry Weißbach        }
61*7d101cc1SGerry Weißbach
62*7d101cc1SGerry Weißbach/*
63*7d101cc1SGerry Weißbach        function _putannots($n) {
64*7d101cc1SGerry Weißbach            $nb=$this->page;
65*7d101cc1SGerry Weißbach            for($n=1;$n<=$nb;$n++)
66*7d101cc1SGerry Weißbach            {
67*7d101cc1SGerry Weißbach                $annotobjs = array();
68*7d101cc1SGerry Weißbach                if(isset($this->PageLinks[$n]) || isset($this->PageAnnots[$n])) {
69*7d101cc1SGerry Weißbach                    $wPt=$this->pageDim[$n]['w']*$this->k;
70*7d101cc1SGerry Weißbach                    $hPt=$this->pageDim[$n]['h']*$this->k;
71*7d101cc1SGerry Weißbach
72*7d101cc1SGerry Weißbach                    //Links
73*7d101cc1SGerry Weißbach                    if(isset($this->PageLinks[$n])) {
74*7d101cc1SGerry Weißbach                        foreach($this->PageLinks[$n] as $key => $pl) {
75*7d101cc1SGerry Weißbach                            $this->_newobj();
76*7d101cc1SGerry Weißbach                            $annot='';
77*7d101cc1SGerry Weißbach                            $rect=sprintf('%.3f %.3f %.3f %.3f',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]);
78*7d101cc1SGerry Weißbach                            $annot .= '<</Type /Annot /Subtype /Link /Rect ['.$rect.']';
79*7d101cc1SGerry Weißbach                            $annot .= ' /Contents '.$this->_UTF16BEtextstring($pl[4]);
80*7d101cc1SGerry Weißbach                            $annot .= ' /NM ('.sprintf('%04u-%04u', $n, $key).')';
81*7d101cc1SGerry Weißbach                            $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis'));
82*7d101cc1SGerry Weißbach                            $annot .= ' /Border [0 0 0]';
83*7d101cc1SGerry Weißbach                            // mPDF 4.2.018
84*7d101cc1SGerry Weißbach                            if ($this->PDFA) { $annot .= ' /F 28'; }
85*7d101cc1SGerry Weißbach                            if (strpos($pl[4],'@')===0) {
86*7d101cc1SGerry Weißbach                                $p=substr($pl[4],1);
87*7d101cc1SGerry Weißbach                                //	$h=isset($this->OrientationChanges[$p]) ? $wPt : $hPt;
88*7d101cc1SGerry Weißbach                                $htarg=$this->pageDim[$p]['h']*$this->k;
89*7d101cc1SGerry Weißbach                                $annot.=sprintf(' /Dest [%d 0 R /XYZ 0 %.3f null]>>',1+2*$p,$htarg);
90*7d101cc1SGerry Weißbach                            }
91*7d101cc1SGerry Weißbach                            else if(is_string($pl[4])) {
92*7d101cc1SGerry Weißbach
93*7d101cc1SGerry Weißbach                                if ( preg_match( "#^(https?:/|file:)/#", $pl[4] )) {
94*7d101cc1SGerry Weißbach                                    $annot .= ' /A <</Type/Action/S/URI/URI'.$this->_textstring($pl[4]).'>> >>';
95*7d101cc1SGerry Weißbach                                } else {
96*7d101cc1SGerry Weißbach                                    $annot .= ' /A <</Type/Action/S/GoToR/F'.$this->_textstring($pl[4]).'>> >>';
97*7d101cc1SGerry Weißbach                                }
98*7d101cc1SGerry Weißbach                            }
99*7d101cc1SGerry Weißbach                            else {
100*7d101cc1SGerry Weißbach                                $l=$this->links[$pl[4]];
101*7d101cc1SGerry Weißbach                                // mPDF 3.0
102*7d101cc1SGerry Weißbach                                // may not be set if #link points to non-existent target
103*7d101cc1SGerry Weißbach                                if (isset($this->pageDim[$l[0]]['h'])) { $htarg=$this->pageDim[$l[0]]['h']*$this->k; }
104*7d101cc1SGerry Weißbach                                else { $htarg=$this->h*$this->k; } // doesn't really matter
105*7d101cc1SGerry Weißbach                                $annot.=sprintf(' /Dest [%d 0 R /XYZ 0 %.3f null]>>',1+2*$l[0],$htarg-$l[1]*$this->k);
106*7d101cc1SGerry Weißbach                            }
107*7d101cc1SGerry Weißbach                            $this->_out($annot);
108*7d101cc1SGerry Weißbach                            $this->_out('endobj');
109*7d101cc1SGerry Weißbach                        }
110*7d101cc1SGerry Weißbach                    }
111*7d101cc1SGerry Weißbach*/
112*7d101cc1SGerry Weißbach
113*7d101cc1SGerry Weißbach                    /*-- ANNOTATIONS --*/
114*7d101cc1SGerry Weißbach/*                    if(isset($this->PageAnnots[$n])) {
115*7d101cc1SGerry Weißbach                        foreach ($this->PageAnnots[$n] as $key => $pl) {
116*7d101cc1SGerry Weißbach                            $this->_newobj();
117*7d101cc1SGerry Weißbach                            $annot='';
118*7d101cc1SGerry Weißbach                            $pl['opt'] = array_change_key_case($pl['opt'], CASE_LOWER);
119*7d101cc1SGerry Weißbach                            $x = $pl['x'];
120*7d101cc1SGerry Weißbach                            if ($this->annotMargin <> 0 || $x==0 || $x<0) {	// Odd page
121*7d101cc1SGerry Weißbach                                $x = ($wPt/$this->k) - $this->annotMargin;
122*7d101cc1SGerry Weißbach                            }
123*7d101cc1SGerry Weißbach                            $w = $h = ($this->annotSize * $this->k);
124*7d101cc1SGerry Weißbach                            $a = $x * $this->k;
125*7d101cc1SGerry Weißbach                            // mPDF 3.0
126*7d101cc1SGerry Weißbach                            $b = $hPt - ($pl['y']  * $this->k);
127*7d101cc1SGerry Weißbach                            $rect = sprintf('%.3f %.3f %.3f %.3f', $a, $b-$h, $a+$w, $b);
128*7d101cc1SGerry Weißbach                            $annot .= '<</Type /Annot /Subtype /Text /Rect ['.$rect.']';
129*7d101cc1SGerry Weißbach                            $annot .= ' /Contents '.$this->_UTF16BEtextstring($pl['txt']);
130*7d101cc1SGerry Weißbach                            $annot .= ' /NM ('.sprintf('%04u-%04u', $n, (2000 + $key)).')';
131*7d101cc1SGerry Weißbach                            $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis'));
132*7d101cc1SGerry Weißbach                            $annot .= ' /CreationDate '.$this->_textstring('D:'.date('YmdHis'));
133*7d101cc1SGerry Weißbach                            $annot .= ' /Border [0 0 0]';
134*7d101cc1SGerry Weißbach                            // mPDF 4.2.018
135*7d101cc1SGerry Weißbach                            if ($this->PDFA) {
136*7d101cc1SGerry Weißbach                                $annot .= ' /F 28';
137*7d101cc1SGerry Weißbach                                $annot .= ' /CA 1';
138*7d101cc1SGerry Weißbach                            }
139*7d101cc1SGerry Weißbach                            else if ($pl['opt']['ca']>0) { $annot .= ' /CA '.$pl['opt']['ca']; }
140*7d101cc1SGerry Weißbach
141*7d101cc1SGerry Weißbach                            $annot .= ' /C [';
142*7d101cc1SGerry Weißbach                            if (isset($pl['opt']['c']) AND (is_array($pl['opt']['c']))) {
143*7d101cc1SGerry Weißbach                                foreach ($pl['opt']['c'] as $col) {
144*7d101cc1SGerry Weißbach                                    $col = intval($col);
145*7d101cc1SGerry Weißbach                                    $color = $col <= 0 ? 0 : ($col >= 255 ? 1 : $col / 255);
146*7d101cc1SGerry Weißbach                                    $annot .= sprintf(" %.4f", $color);
147*7d101cc1SGerry Weißbach                                }
148*7d101cc1SGerry Weißbach                            }
149*7d101cc1SGerry Weißbach                            else { $annot .= '1 1 0'; }	// mPDF 4.2.026
150*7d101cc1SGerry Weißbach                            $annot .= ']';
151*7d101cc1SGerry Weißbach                            // Usually Author
152*7d101cc1SGerry Weißbach                            if (isset($pl['opt']['t']) AND is_string($pl['opt']['t'])) {
153*7d101cc1SGerry Weißbach                                $annot .= ' /T '.$this->_UTF16BEtextstring($pl['opt']['t']);
154*7d101cc1SGerry Weißbach                            }
155*7d101cc1SGerry Weißbach                            if (isset($pl['opt']['subj'])) {
156*7d101cc1SGerry Weißbach                                $annot .= ' /Subj '.$this->_UTF16BEtextstring($pl['opt']['subj']);
157*7d101cc1SGerry Weißbach                            }
158*7d101cc1SGerry Weißbach                            $iconsapp = array('Comment', 'Help', 'Insert', 'Key', 'NewParagraph', 'Note', 'Paragraph');
159*7d101cc1SGerry Weißbach                            if (isset($pl['opt']['icon']) AND in_array($pl['opt']['icon'], $iconsapp)) {
160*7d101cc1SGerry Weißbach                                $annot .= ' /Name /'.$pl['opt']['icon'];
161*7d101cc1SGerry Weißbach                            }
162*7d101cc1SGerry Weißbach                            else { $annot .= ' /Name /Note'; }
163*7d101cc1SGerry Weißbach                            // mPDF 4.2.027
164*7d101cc1SGerry Weißbach                            if (!empty($pl['opt']['popup'])) {
165*7d101cc1SGerry Weißbach                                $annot .= ' /Open true';
166*7d101cc1SGerry Weißbach                                $annot .= ' /Popup '.($this->n+1).' 0 R';				// mPDF 4.2.027
167*7d101cc1SGerry Weißbach                            }
168*7d101cc1SGerry Weißbach                            else { $annot .= ' /Open false'; }	// mPDF 4.2.027
169*7d101cc1SGerry Weißbach                            $annot .= ' /P 3 0 R';							// mPDF 4.2.027
170*7d101cc1SGerry Weißbach                            $annot .= '>>';
171*7d101cc1SGerry Weißbach                            $this->_out($annot);
172*7d101cc1SGerry Weißbach                            $this->_out('endobj');
173*7d101cc1SGerry Weißbach
174*7d101cc1SGerry Weißbach                            // mPDF 4.2.027
175*7d101cc1SGerry Weißbach                            if (!empty($pl['opt']['popup'])) {
176*7d101cc1SGerry Weißbach                                $this->_newobj();
177*7d101cc1SGerry Weißbach                                $annot='';
178*7d101cc1SGerry Weißbach                                if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][0])) { $x = $pl['opt']['popup'][0] * $this->k; }
179*7d101cc1SGerry Weißbach                                else { $x = $pl['x'] * $this->k; }
180*7d101cc1SGerry Weißbach                                if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][1])) { $y = $hPt - ($pl['opt']['popup'][1] * $this->k); }
181*7d101cc1SGerry Weißbach                                else { $y = $hPt - ($pl['y']  * $this->k); }
182*7d101cc1SGerry Weißbach                                if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][2])) { $w = $pl['opt']['popup'][2] * $this->k; }
183*7d101cc1SGerry Weißbach                                else { $w = 180; }
184*7d101cc1SGerry Weißbach                                if (is_array($pl['opt']['popup']) && isset($pl['opt']['popup'][3])) { $h = $pl['opt']['popup'][3] * $this->k; }
185*7d101cc1SGerry Weißbach                                else { $h = 120; }
186*7d101cc1SGerry Weißbach                                $rect = sprintf('%.3f %.3f %.3f %.3f', $x, $y-$h, $x+$w, $y);
187*7d101cc1SGerry Weißbach                                $annot .= '<</Type /Annot /Subtype /Popup /Rect ['.$rect.']';
188*7d101cc1SGerry Weißbach                                $annot .= ' /M '.$this->_textstring('D:'.date('YmdHis'));
189*7d101cc1SGerry Weißbach                                if ($this->PDFA) { $annot .= ' /F 28'; }
190*7d101cc1SGerry Weißbach                                $annot .= ' /P 3 0 R';
191*7d101cc1SGerry Weißbach                                $annot .= ' /Parent '.($this->n-1).' 0 R';
192*7d101cc1SGerry Weißbach                                $annot .= '>>';
193*7d101cc1SGerry Weißbach                                $this->_out($annot);
194*7d101cc1SGerry Weißbach                                $this->_out('endobj');
195*7d101cc1SGerry Weißbach                            }
196*7d101cc1SGerry Weißbach                        }
197*7d101cc1SGerry Weißbach                    }
198*7d101cc1SGerry Weißbach*/                    /*-- END ANNOTATIONS --*/
199*7d101cc1SGerry Weißbach/*                }
200*7d101cc1SGerry Weißbach            }
201*7d101cc1SGerry Weißbach        }
202*7d101cc1SGerry Weißbach*/
203*7d101cc1SGerry Weißbach    }
204*7d101cc1SGerry Weißbach}