From 49ba4f6d7b9888928e19a19b331d37925d86c351 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Wed, 17 Jan 2018 01:54:02 +0100 Subject: [PATCH] Plugin: Test2PDF: Add test2pdf plugin to convert exercises to PDF. This plugin can be further cleaned up but works as is. --- plugin/test2pdf/README.md | 10 + plugin/test2pdf/class/font/courier.php | 10 + plugin/test2pdf/class/font/courierb.php | 10 + plugin/test2pdf/class/font/courierbi.php | 10 + plugin/test2pdf/class/font/courieri.php | 10 + plugin/test2pdf/class/font/helvetica.php | 21 + plugin/test2pdf/class/font/helveticab.php | 21 + plugin/test2pdf/class/font/helveticabi.php | 21 + plugin/test2pdf/class/font/helveticai.php | 21 + plugin/test2pdf/class/font/symbol.php | 20 + plugin/test2pdf/class/font/times.php | 21 + plugin/test2pdf/class/font/timesb.php | 21 + plugin/test2pdf/class/font/timesbi.php | 21 + plugin/test2pdf/class/font/timesi.php | 21 + plugin/test2pdf/class/font/zapfdingbats.php | 20 + plugin/test2pdf/class/fpdf.php | 1898 +++++++++++++++++ plugin/test2pdf/config.php | 8 + plugin/test2pdf/database.php | 27 + plugin/test2pdf/index.php | 7 + plugin/test2pdf/install.php | 15 + plugin/test2pdf/lang/english.php | 16 + plugin/test2pdf/lang/french.php | 15 + plugin/test2pdf/lang/spanish.php | 15 + plugin/test2pdf/plugin.php | 12 + plugin/test2pdf/resources/css/style.css | 6 + plugin/test2pdf/resources/img/128/accept.png | Bin 0 -> 7061 bytes plugin/test2pdf/resources/img/22/test2pdf.png | Bin 0 -> 829 bytes plugin/test2pdf/resources/img/24/download.png | Bin 0 -> 384 bytes plugin/test2pdf/resources/img/24/info.png | Bin 0 -> 263 bytes plugin/test2pdf/resources/img/32/accept.png | Bin 0 -> 1516 bytes plugin/test2pdf/resources/img/32/download.png | Bin 0 -> 462 bytes plugin/test2pdf/resources/img/32/info.png | Bin 0 -> 311 bytes plugin/test2pdf/resources/img/64/download.png | Bin 0 -> 844 bytes plugin/test2pdf/resources/img/64/info.png | Bin 0 -> 571 bytes plugin/test2pdf/resources/img/64/test2pdf.png | Bin 0 -> 1096 bytes .../test2pdf/resources/img/64/test2pdf_na.png | Bin 0 -> 1006 bytes plugin/test2pdf/resources/img/logo.png | Bin 0 -> 8823 bytes plugin/test2pdf/src/download-pdf.php | 341 +++ plugin/test2pdf/src/index.php | 1 + plugin/test2pdf/src/index.test2pdf.php | 7 + plugin/test2pdf/src/test2pdf.lib.php | 274 +++ plugin/test2pdf/src/test2pdf_plugin.class.php | 68 + plugin/test2pdf/src/view-pdf.php | 38 + plugin/test2pdf/start.php | 27 + plugin/test2pdf/uninstall.php | 13 + plugin/test2pdf/view/view-pdf.tpl | 44 + 46 files changed, 3090 insertions(+) create mode 100644 plugin/test2pdf/README.md create mode 100644 plugin/test2pdf/class/font/courier.php create mode 100644 plugin/test2pdf/class/font/courierb.php create mode 100644 plugin/test2pdf/class/font/courierbi.php create mode 100644 plugin/test2pdf/class/font/courieri.php create mode 100644 plugin/test2pdf/class/font/helvetica.php create mode 100644 plugin/test2pdf/class/font/helveticab.php create mode 100644 plugin/test2pdf/class/font/helveticabi.php create mode 100644 plugin/test2pdf/class/font/helveticai.php create mode 100644 plugin/test2pdf/class/font/symbol.php create mode 100644 plugin/test2pdf/class/font/times.php create mode 100644 plugin/test2pdf/class/font/timesb.php create mode 100644 plugin/test2pdf/class/font/timesbi.php create mode 100644 plugin/test2pdf/class/font/timesi.php create mode 100644 plugin/test2pdf/class/font/zapfdingbats.php create mode 100644 plugin/test2pdf/class/fpdf.php create mode 100644 plugin/test2pdf/config.php create mode 100644 plugin/test2pdf/database.php create mode 100644 plugin/test2pdf/index.php create mode 100644 plugin/test2pdf/install.php create mode 100644 plugin/test2pdf/lang/english.php create mode 100644 plugin/test2pdf/lang/french.php create mode 100644 plugin/test2pdf/lang/spanish.php create mode 100644 plugin/test2pdf/plugin.php create mode 100644 plugin/test2pdf/resources/css/style.css create mode 100644 plugin/test2pdf/resources/img/128/accept.png create mode 100644 plugin/test2pdf/resources/img/22/test2pdf.png create mode 100644 plugin/test2pdf/resources/img/24/download.png create mode 100644 plugin/test2pdf/resources/img/24/info.png create mode 100644 plugin/test2pdf/resources/img/32/accept.png create mode 100644 plugin/test2pdf/resources/img/32/download.png create mode 100644 plugin/test2pdf/resources/img/32/info.png create mode 100644 plugin/test2pdf/resources/img/64/download.png create mode 100644 plugin/test2pdf/resources/img/64/info.png create mode 100644 plugin/test2pdf/resources/img/64/test2pdf.png create mode 100644 plugin/test2pdf/resources/img/64/test2pdf_na.png create mode 100644 plugin/test2pdf/resources/img/logo.png create mode 100644 plugin/test2pdf/src/download-pdf.php create mode 100644 plugin/test2pdf/src/index.php create mode 100644 plugin/test2pdf/src/index.test2pdf.php create mode 100644 plugin/test2pdf/src/test2pdf.lib.php create mode 100644 plugin/test2pdf/src/test2pdf_plugin.class.php create mode 100644 plugin/test2pdf/src/view-pdf.php create mode 100644 plugin/test2pdf/start.php create mode 100644 plugin/test2pdf/uninstall.php create mode 100644 plugin/test2pdf/view/view-pdf.tpl diff --git a/plugin/test2pdf/README.md b/plugin/test2pdf/README.md new file mode 100644 index 0000000000..fcdc0f9e19 --- /dev/null +++ b/plugin/test2pdf/README.md @@ -0,0 +1,10 @@ +Test2Pdf plugin +=============== + +This plugin allows you to export questions from exercises to PDF +Este plugin da la posibilidad de obtener en formato PDF aquellas preguntas tipos test en los ejercicios de un curso. + +Credits +------- +Contributed by [Nosolored](https://www.nosolored.com/). +Icons made by [Freepik](http://www.flaticon.com/authors/freepik) from [Flaticon](http://www.flaticon.com), and licensed as [Creative Commons BY 3.0](http://creativecommons.org/licenses/by/3.0/) diff --git a/plugin/test2pdf/class/font/courier.php b/plugin/test2pdf/class/font/courier.php new file mode 100644 index 0000000000..bc8478eb30 --- /dev/null +++ b/plugin/test2pdf/class/font/courier.php @@ -0,0 +1,10 @@ +array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); +?> diff --git a/plugin/test2pdf/class/font/courierb.php b/plugin/test2pdf/class/font/courierb.php new file mode 100644 index 0000000000..97ecd701c8 --- /dev/null +++ b/plugin/test2pdf/class/font/courierb.php @@ -0,0 +1,10 @@ +array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); +?> diff --git a/plugin/test2pdf/class/font/courierbi.php b/plugin/test2pdf/class/font/courierbi.php new file mode 100644 index 0000000000..c4bfff881f --- /dev/null +++ b/plugin/test2pdf/class/font/courierbi.php @@ -0,0 +1,10 @@ +array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); +?> diff --git a/plugin/test2pdf/class/font/courieri.php b/plugin/test2pdf/class/font/courieri.php new file mode 100644 index 0000000000..015a15adff --- /dev/null +++ b/plugin/test2pdf/class/font/courieri.php @@ -0,0 +1,10 @@ +array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); +?> diff --git a/plugin/test2pdf/class/font/helvetica.php b/plugin/test2pdf/class/font/helvetica.php new file mode 100644 index 0000000000..927759b9a6 --- /dev/null +++ b/plugin/test2pdf/class/font/helvetica.php @@ -0,0 +1,21 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +$enc = 'cp1252'; +$uv = array(0=>array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); +?> diff --git a/plugin/test2pdf/class/font/helveticab.php b/plugin/test2pdf/class/font/helveticab.php new file mode 100644 index 0000000000..bcd736723c --- /dev/null +++ b/plugin/test2pdf/class/font/helveticab.php @@ -0,0 +1,21 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); +$enc = 'cp1252'; +$uv = array(0=>array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); +?> diff --git a/plugin/test2pdf/class/font/helveticabi.php b/plugin/test2pdf/class/font/helveticabi.php new file mode 100644 index 0000000000..0243cde4f3 --- /dev/null +++ b/plugin/test2pdf/class/font/helveticabi.php @@ -0,0 +1,21 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722, + 'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889, + 'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556, + chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611, + chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556); +$enc = 'cp1252'; +$uv = array(0=>array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); +?> diff --git a/plugin/test2pdf/class/font/helveticai.php b/plugin/test2pdf/class/font/helveticai.php new file mode 100644 index 0000000000..06ec735b8f --- /dev/null +++ b/plugin/test2pdf/class/font/helveticai.php @@ -0,0 +1,21 @@ +278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278, + chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584, + ','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944, + 'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833, + 'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556, + chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333, + chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556, + chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +$enc = 'cp1252'; +$uv = array(0=>array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); +?> diff --git a/plugin/test2pdf/class/font/symbol.php b/plugin/test2pdf/class/font/symbol.php new file mode 100644 index 0000000000..f8f0c3309a --- /dev/null +++ b/plugin/test2pdf/class/font/symbol.php @@ -0,0 +1,20 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549, + ','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722, + 'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768, + 'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576, + 'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0, + chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603, + chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768, + chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042, + chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329, + chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0); +$uv = array(32=>160,33=>33,34=>8704,35=>35,36=>8707,37=>array(37,2),39=>8715,40=>array(40,2),42=>8727,43=>array(43,2),45=>8722,46=>array(46,18),64=>8773,65=>array(913,2),67=>935,68=>array(916,2),70=>934,71=>915,72=>919,73=>921,74=>977,75=>array(922,4),79=>array(927,2),81=>920,82=>929,83=>array(931,3),86=>962,87=>937,88=>926,89=>936,90=>918,91=>91,92=>8756,93=>93,94=>8869,95=>95,96=>63717,97=>array(945,2),99=>967,100=>array(948,2),102=>966,103=>947,104=>951,105=>953,106=>981,107=>array(954,4),111=>array(959,2),113=>952,114=>961,115=>array(963,3),118=>982,119=>969,120=>958,121=>968,122=>950,123=>array(123,3),126=>8764,160=>8364,161=>978,162=>8242,163=>8804,164=>8725,165=>8734,166=>402,167=>9827,168=>9830,169=>9829,170=>9824,171=>8596,172=>array(8592,4),176=>array(176,2),178=>8243,179=>8805,180=>215,181=>8733,182=>8706,183=>8226,184=>247,185=>array(8800,2),187=>8776,188=>8230,189=>array(63718,2),191=>8629,192=>8501,193=>8465,194=>8476,195=>8472,196=>8855,197=>8853,198=>8709,199=>array(8745,2),201=>8835,202=>8839,203=>8836,204=>8834,205=>8838,206=>array(8712,2),208=>8736,209=>8711,210=>63194,211=>63193,212=>63195,213=>8719,214=>8730,215=>8901,216=>172,217=>array(8743,2),219=>8660,220=>array(8656,4),224=>9674,225=>9001,226=>array(63720,3),229=>8721,230=>array(63723,10),241=>9002,242=>8747,243=>8992,244=>63733,245=>8993,246=>array(63734,9)); +?> diff --git a/plugin/test2pdf/class/font/times.php b/plugin/test2pdf/class/font/times.php new file mode 100644 index 0000000000..81f2a8b4bd --- /dev/null +++ b/plugin/test2pdf/class/font/times.php @@ -0,0 +1,21 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722, + 'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944, + 'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500); +$enc = 'cp1252'; +$uv = array(0=>array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); +?> diff --git a/plugin/test2pdf/class/font/timesb.php b/plugin/test2pdf/class/font/timesb.php new file mode 100644 index 0000000000..7db704fd48 --- /dev/null +++ b/plugin/test2pdf/class/font/timesb.php @@ -0,0 +1,21 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722, + 'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000, + 'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833, + 'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722, + chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500); +$enc = 'cp1252'; +$uv = array(0=>array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); +?> diff --git a/plugin/test2pdf/class/font/timesbi.php b/plugin/test2pdf/class/font/timesbi.php new file mode 100644 index 0000000000..089f21ab30 --- /dev/null +++ b/plugin/test2pdf/class/font/timesbi.php @@ -0,0 +1,21 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667, + 'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889, + 'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778, + 'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000, + chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333, + chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667, + chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444); +$enc = 'cp1252'; +$uv = array(0=>array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); +?> diff --git a/plugin/test2pdf/class/font/timesi.php b/plugin/test2pdf/class/font/timesi.php new file mode 100644 index 0000000000..f958b5b672 --- /dev/null +++ b/plugin/test2pdf/class/font/timesi.php @@ -0,0 +1,21 @@ +250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250, + chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675, + ','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611, + 'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833, + 'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722, + 'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500, + chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980, + chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333, + chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611, + chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722, + chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500, + chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444); +$enc = 'cp1252'; +$uv = array(0=>array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96)); +?> diff --git a/plugin/test2pdf/class/font/zapfdingbats.php b/plugin/test2pdf/class/font/zapfdingbats.php new file mode 100644 index 0000000000..7c2cb5e4cf --- /dev/null +++ b/plugin/test2pdf/class/font/zapfdingbats.php @@ -0,0 +1,20 @@ +0,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0, + chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939, + ','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692, + 'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776, + 'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873, + 'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317, + chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0, + chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788, + chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788, + chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918, + chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874, + chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0); +$uv = array(32=>32,33=>array(9985,4),37=>9742,38=>array(9990,4),42=>9755,43=>9758,44=>array(9996,28),72=>9733,73=>array(10025,35),108=>9679,109=>10061,110=>9632,111=>array(10063,4),115=>9650,116=>9660,117=>9670,118=>10070,119=>9687,120=>array(10072,7),128=>array(10088,14),161=>array(10081,7),168=>9827,169=>9830,170=>9829,171=>9824,172=>array(9312,10),182=>array(10102,31),213=>8594,214=>array(8596,2),216=>array(10136,24),241=>array(10161,14)); +?> diff --git a/plugin/test2pdf/class/fpdf.php b/plugin/test2pdf/class/fpdf.php new file mode 100644 index 0000000000..e7fbb45356 --- /dev/null +++ b/plugin/test2pdf/class/fpdf.php @@ -0,0 +1,1898 @@ +_dochecks(); + // Initialization of properties + $this->state = 0; + $this->page = 0; + $this->n = 2; + $this->buffer = ''; + $this->pages = array(); + $this->PageInfo = array(); + $this->fonts = array(); + $this->FontFiles = array(); + $this->encodings = array(); + $this->cmaps = array(); + $this->images = array(); + $this->links = array(); + $this->InHeader = false; + $this->InFooter = false; + $this->lasth = 0; + $this->FontFamily = ''; + $this->FontStyle = ''; + $this->FontSizePt = 12; + $this->underline = false; + $this->DrawColor = '0 G'; + $this->FillColor = '0 g'; + $this->TextColor = '0 g'; + $this->ColorFlag = false; + $this->WithAlpha = false; + $this->ws = 0; + // Font path + if(defined('FPDF_FONTPATH')) + { + $this->fontpath = FPDF_FONTPATH; + if(substr($this->fontpath,-1)!='/' && substr($this->fontpath,-1)!='\\') + $this->fontpath .= '/'; + } + elseif(is_dir(dirname(__FILE__).'/font')) + $this->fontpath = dirname(__FILE__).'/font/'; + else + $this->fontpath = ''; + // Core fonts + $this->CoreFonts = array('courier', 'helvetica', 'times', 'symbol', 'zapfdingbats'); + // Scale factor + if($unit=='pt') + $this->k = 1; + elseif($unit=='mm') + $this->k = 72/25.4; + elseif($unit=='cm') + $this->k = 72/2.54; + elseif($unit=='in') + $this->k = 72; + else + $this->Error('Incorrect unit: '.$unit); + // Page sizes + $this->StdPageSizes = array('a3'=>array(841.89,1190.55), 'a4'=>array(595.28,841.89), 'a5'=>array(420.94,595.28), + 'letter'=>array(612,792), 'legal'=>array(612,1008)); + $size = $this->_getpagesize($size); + $this->DefPageSize = $size; + $this->CurPageSize = $size; + // Page orientation + $orientation = strtolower($orientation); + if($orientation=='p' || $orientation=='portrait') + { + $this->DefOrientation = 'P'; + $this->w = $size[0]; + $this->h = $size[1]; + } + elseif($orientation=='l' || $orientation=='landscape') + { + $this->DefOrientation = 'L'; + $this->w = $size[1]; + $this->h = $size[0]; + } + else + $this->Error('Incorrect orientation: '.$orientation); + $this->CurOrientation = $this->DefOrientation; + $this->wPt = $this->w*$this->k; + $this->hPt = $this->h*$this->k; + // Page rotation + $this->CurRotation = 0; + // Page margins (1 cm) + $margin = 28.35/$this->k; + $this->SetMargins($margin,$margin); + // Interior cell margin (1 mm) + $this->cMargin = $margin/10; + // Line width (0.2 mm) + $this->LineWidth = .567/$this->k; + // Automatic page break + $this->SetAutoPageBreak(true,2*$margin); + // Default display mode + $this->SetDisplayMode('default'); + // Enable compression + $this->SetCompression(true); + // Set default PDF version number + $this->PDFVersion = '1.3'; +} + +function SetMargins($left, $top, $right=null) +{ + // Set left, top and right margins + $this->lMargin = $left; + $this->tMargin = $top; + if($right===null) + $right = $left; + $this->rMargin = $right; +} + +function SetLeftMargin($margin) +{ + // Set left margin + $this->lMargin = $margin; + if($this->page>0 && $this->x<$margin) + $this->x = $margin; +} + +function SetTopMargin($margin) +{ + // Set top margin + $this->tMargin = $margin; +} + +function SetRightMargin($margin) +{ + // Set right margin + $this->rMargin = $margin; +} + +function SetAutoPageBreak($auto, $margin=0) +{ + // Set auto page break mode and triggering margin + $this->AutoPageBreak = $auto; + $this->bMargin = $margin; + $this->PageBreakTrigger = $this->h-$margin; +} + +function SetDisplayMode($zoom, $layout='default') +{ + // Set display mode in viewer + if($zoom=='fullpage' || $zoom=='fullwidth' || $zoom=='real' || $zoom=='default' || !is_string($zoom)) + $this->ZoomMode = $zoom; + else + $this->Error('Incorrect zoom display mode: '.$zoom); + if($layout=='single' || $layout=='continuous' || $layout=='two' || $layout=='default') + $this->LayoutMode = $layout; + else + $this->Error('Incorrect layout display mode: '.$layout); +} + +function SetCompression($compress) +{ + // Set page compression + if(function_exists('gzcompress')) + $this->compress = $compress; + else + $this->compress = false; +} + +function SetTitle($title, $isUTF8=false) +{ + // Title of document + $this->metadata['Title'] = $isUTF8 ? $title : utf8_encode($title); +} + +function SetAuthor($author, $isUTF8=false) +{ + // Author of document + $this->metadata['Author'] = $isUTF8 ? $author : utf8_encode($author); +} + +function SetSubject($subject, $isUTF8=false) +{ + // Subject of document + $this->metadata['Subject'] = $isUTF8 ? $subject : utf8_encode($subject); +} + +function SetKeywords($keywords, $isUTF8=false) +{ + // Keywords of document + $this->metadata['Keywords'] = $isUTF8 ? $keywords : utf8_encode($keywords); +} + +function SetCreator($creator, $isUTF8=false) +{ + // Creator of document + $this->metadata['Creator'] = $isUTF8 ? $creator : utf8_encode($creator); +} + +function AliasNbPages($alias='{nb}') +{ + // Define an alias for total number of pages + $this->AliasNbPages = $alias; +} + +function Error($msg) +{ + // Fatal error + throw new Exception('FPDF error: '.$msg); +} + +function Close() +{ + // Terminate document + if($this->state==3) + return; + if($this->page==0) + $this->AddPage(); + // Page footer + $this->InFooter = true; + $this->Footer(); + $this->InFooter = false; + // Close page + $this->_endpage(); + // Close document + $this->_enddoc(); +} + +function AddPage($orientation='', $size='', $rotation=0) +{ + // Start a new page + if($this->state==3) + $this->Error('The document is closed'); + $family = $this->FontFamily; + $style = $this->FontStyle.($this->underline ? 'U' : ''); + $fontsize = $this->FontSizePt; + $lw = $this->LineWidth; + $dc = $this->DrawColor; + $fc = $this->FillColor; + $tc = $this->TextColor; + $cf = $this->ColorFlag; + if($this->page>0) + { + // Page footer + $this->InFooter = true; + $this->Footer(); + $this->InFooter = false; + // Close page + $this->_endpage(); + } + // Start new page + $this->_beginpage($orientation,$size,$rotation); + // Set line cap style to square + $this->_out('2 J'); + // Set line width + $this->LineWidth = $lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + // Set font + if($family) + $this->SetFont($family,$style,$fontsize); + // Set colors + $this->DrawColor = $dc; + if($dc!='0 G') + $this->_out($dc); + $this->FillColor = $fc; + if($fc!='0 g') + $this->_out($fc); + $this->TextColor = $tc; + $this->ColorFlag = $cf; + // Page header + $this->InHeader = true; + $this->Header(); + $this->InHeader = false; + // Restore line width + if($this->LineWidth!=$lw) + { + $this->LineWidth = $lw; + $this->_out(sprintf('%.2F w',$lw*$this->k)); + } + // Restore font + if($family) + $this->SetFont($family,$style,$fontsize); + // Restore colors + if($this->DrawColor!=$dc) + { + $this->DrawColor = $dc; + $this->_out($dc); + } + if($this->FillColor!=$fc) + { + $this->FillColor = $fc; + $this->_out($fc); + } + $this->TextColor = $tc; + $this->ColorFlag = $cf; +} + +function Header() +{ + // To be implemented in your own inherited class +} + +function Footer() +{ + // To be implemented in your own inherited class +} + +function PageNo() +{ + // Get current page number + return $this->page; +} + +function SetDrawColor($r, $g=null, $b=null) +{ + // Set color for all stroking operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->DrawColor = sprintf('%.3F G',$r/255); + else + $this->DrawColor = sprintf('%.3F %.3F %.3F RG',$r/255,$g/255,$b/255); + if($this->page>0) + $this->_out($this->DrawColor); +} + +function SetFillColor($r, $g=null, $b=null) +{ + // Set color for all filling operations + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->FillColor = sprintf('%.3F g',$r/255); + else + $this->FillColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag = ($this->FillColor!=$this->TextColor); + if($this->page>0) + $this->_out($this->FillColor); +} + +function SetTextColor($r, $g=null, $b=null) +{ + // Set color for text + if(($r==0 && $g==0 && $b==0) || $g===null) + $this->TextColor = sprintf('%.3F g',$r/255); + else + $this->TextColor = sprintf('%.3F %.3F %.3F rg',$r/255,$g/255,$b/255); + $this->ColorFlag = ($this->FillColor!=$this->TextColor); +} + +function GetStringWidth($s) +{ + // Get width of a string in the current font + $s = (string)$s; + $cw = &$this->CurrentFont['cw']; + $w = 0; + $l = strlen($s); + for($i=0;$i<$l;$i++) + $w += $cw[$s[$i]]; + return $w*$this->FontSize/1000; +} + +function SetLineWidth($width) +{ + // Set line width + $this->LineWidth = $width; + if($this->page>0) + $this->_out(sprintf('%.2F w',$width*$this->k)); +} + +function Line($x1, $y1, $x2, $y2) +{ + // Draw a line + $this->_out(sprintf('%.2F %.2F m %.2F %.2F l S',$x1*$this->k,($this->h-$y1)*$this->k,$x2*$this->k,($this->h-$y2)*$this->k)); +} + +function Rect($x, $y, $w, $h, $style='') +{ + // Draw a rectangle + if($style=='F') + $op = 'f'; + elseif($style=='FD' || $style=='DF') + $op = 'B'; + else + $op = 'S'; + $this->_out(sprintf('%.2F %.2F %.2F %.2F re %s',$x*$this->k,($this->h-$y)*$this->k,$w*$this->k,-$h*$this->k,$op)); +} + +function AddFont($family, $style='', $file='') +{ + // Add a TrueType, OpenType or Type1 font + $family = strtolower($family); + if($file=='') + $file = str_replace(' ','',$family).strtolower($style).'.php'; + $style = strtoupper($style); + if($style=='IB') + $style = 'BI'; + $fontkey = $family.$style; + if(isset($this->fonts[$fontkey])) + return; + $info = $this->_loadfont($file); + $info['i'] = count($this->fonts)+1; + if(!empty($info['file'])) + { + // Embedded font + if($info['type']=='TrueType') + $this->FontFiles[$info['file']] = array('length1'=>$info['originalsize']); + else + $this->FontFiles[$info['file']] = array('length1'=>$info['size1'], 'length2'=>$info['size2']); + } + $this->fonts[$fontkey] = $info; +} + +function SetFont($family, $style='', $size=0) +{ + // Select a font; size given in points + if($family=='') + $family = $this->FontFamily; + else + $family = strtolower($family); + $style = strtoupper($style); + if(strpos($style,'U')!==false) + { + $this->underline = true; + $style = str_replace('U','',$style); + } + else + $this->underline = false; + if($style=='IB') + $style = 'BI'; + if($size==0) + $size = $this->FontSizePt; + // Test if font is already selected + if($this->FontFamily==$family && $this->FontStyle==$style && $this->FontSizePt==$size) + return; + // Test if font is already loaded + $fontkey = $family.$style; + if(!isset($this->fonts[$fontkey])) + { + // Test if one of the core fonts + if($family=='arial') + $family = 'helvetica'; + if(in_array($family,$this->CoreFonts)) + { + if($family=='symbol' || $family=='zapfdingbats') + $style = ''; + $fontkey = $family.$style; + if(!isset($this->fonts[$fontkey])) + $this->AddFont($family,$style); + } + else + $this->Error('Undefined font: '.$family.' '.$style); + } + // Select it + $this->FontFamily = $family; + $this->FontStyle = $style; + $this->FontSizePt = $size; + $this->FontSize = $size/$this->k; + $this->CurrentFont = &$this->fonts[$fontkey]; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function SetFontSize($size) +{ + // Set font size in points + if($this->FontSizePt==$size) + return; + $this->FontSizePt = $size; + $this->FontSize = $size/$this->k; + if($this->page>0) + $this->_out(sprintf('BT /F%d %.2F Tf ET',$this->CurrentFont['i'],$this->FontSizePt)); +} + +function AddLink() +{ + // Create a new internal link + $n = count($this->links)+1; + $this->links[$n] = array(0, 0); + return $n; +} + +function SetLink($link, $y=0, $page=-1) +{ + // Set destination of internal link + if($y==-1) + $y = $this->y; + if($page==-1) + $page = $this->page; + $this->links[$link] = array($page, $y); +} + +function Link($x, $y, $w, $h, $link) +{ + // Put a link on the page + $this->PageLinks[$this->page][] = array($x*$this->k, $this->hPt-$y*$this->k, $w*$this->k, $h*$this->k, $link); +} + +function Text($x, $y, $txt) +{ + // Output a string + if(!isset($this->CurrentFont)) + $this->Error('No font has been set'); + $s = sprintf('BT %.2F %.2F Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt)); + if($this->underline && $txt!='') + $s .= ' '.$this->_dounderline($x,$y,$txt); + if($this->ColorFlag) + $s = 'q '.$this->TextColor.' '.$s.' Q'; + $this->_out($s); +} + +function AcceptPageBreak() +{ + // Accept automatic page break or not + return $this->AutoPageBreak; +} + +function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='') +{ + // Output a cell + $k = $this->k; + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + // Automatic page break + $x = $this->x; + $ws = $this->ws; + if($ws>0) + { + $this->ws = 0; + $this->_out('0 Tw'); + } + $this->AddPage($this->CurOrientation,$this->CurPageSize,$this->CurRotation); + $this->x = $x; + if($ws>0) + { + $this->ws = $ws; + $this->_out(sprintf('%.3F Tw',$ws*$k)); + } + } + if($w==0) + $w = $this->w-$this->rMargin-$this->x; + $s = ''; + if($fill || $border==1) + { + if($fill) + $op = ($border==1) ? 'B' : 'f'; + else + $op = 'S'; + $s = sprintf('%.2F %.2F %.2F %.2F re %s ',$this->x*$k,($this->h-$this->y)*$k,$w*$k,-$h*$k,$op); + } + if(is_string($border)) + { + $x = $this->x; + $y = $this->y; + if(strpos($border,'L')!==false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,$x*$k,($this->h-($y+$h))*$k); + if(strpos($border,'T')!==false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-$y)*$k); + if(strpos($border,'R')!==false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',($x+$w)*$k,($this->h-$y)*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + if(strpos($border,'B')!==false) + $s .= sprintf('%.2F %.2F m %.2F %.2F l S ',$x*$k,($this->h-($y+$h))*$k,($x+$w)*$k,($this->h-($y+$h))*$k); + } + if($txt!=='') + { + if(!isset($this->CurrentFont)) + $this->Error('No font has been set'); + if($align=='R') + $dx = $w-$this->cMargin-$this->GetStringWidth($txt); + elseif($align=='C') + $dx = ($w-$this->GetStringWidth($txt))/2; + else + $dx = $this->cMargin; + if($this->ColorFlag) + $s .= 'q '.$this->TextColor.' '; + $s .= sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$this->_escape($txt)); + if($this->underline) + $s .= ' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt); + if($this->ColorFlag) + $s .= ' Q'; + if($link) + $this->Link($this->x+$dx,$this->y+.5*$h-.5*$this->FontSize,$this->GetStringWidth($txt),$this->FontSize,$link); + } + if($s) + $this->_out($s); + $this->lasth = $h; + if($ln>0) + { + // Go to next line + $this->y += $h; + if($ln==1) + $this->x = $this->lMargin; + } + else + $this->x += $w; +} + +function MultiCell($w, $h, $txt, $border=0, $align='J', $fill=false) +{ + // Output text with automatic or explicit line breaks + if(!isset($this->CurrentFont)) + $this->Error('No font has been set'); + $cw = &$this->CurrentFont['cw']; + if($w==0) + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; + $s = str_replace("\r",'',$txt); + $nb = strlen($s); + if($nb>0 && $s[$nb-1]=="\n") + $nb--; + $b = 0; + if($border) + { + if($border==1) + { + $border = 'LTRB'; + $b = 'LRT'; + $b2 = 'LR'; + } + else + { + $b2 = ''; + if(strpos($border,'L')!==false) + $b2 .= 'L'; + if(strpos($border,'R')!==false) + $b2 .= 'R'; + $b = (strpos($border,'T')!==false) ? $b2.'T' : $b2; + } + } + $sep = -1; + $i = 0; + $j = 0; + $l = 0; + $ns = 0; + $nl = 1; + while($i<$nb) + { + // Get next character + $c = $s[$i]; + if($c=="\n") + { + // Explicit line break + if($this->ws>0) + { + $this->ws = 0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $i++; + $sep = -1; + $j = $i; + $l = 0; + $ns = 0; + $nl++; + if($border && $nl==2) + $b = $b2; + continue; + } + if($c==' ') + { + $sep = $i; + $ls = $l; + $ns++; + } + $l += $cw[$c]; + if($l>$wmax) + { + // Automatic line break + if($sep==-1) + { + if($i==$j) + $i++; + if($this->ws>0) + { + $this->ws = 0; + $this->_out('0 Tw'); + } + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + } + else + { + if($align=='J') + { + $this->ws = ($ns>1) ? ($wmax-$ls)/1000*$this->FontSize/($ns-1) : 0; + $this->_out(sprintf('%.3F Tw',$this->ws*$this->k)); + } + $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill); + $i = $sep+1; + } + $sep = -1; + $j = $i; + $l = 0; + $ns = 0; + $nl++; + if($border && $nl==2) + $b = $b2; + } + else + $i++; + } + // Last chunk + if($this->ws>0) + { + $this->ws = 0; + $this->_out('0 Tw'); + } + if($border && strpos($border,'B')!==false) + $b .= 'B'; + $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill); + $this->x = $this->lMargin; +} + +function Write($h, $txt, $link='') +{ + // Output text in flowing mode + if(!isset($this->CurrentFont)) + $this->Error('No font has been set'); + $cw = &$this->CurrentFont['cw']; + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; + $s = str_replace("\r",'',$txt); + $nb = strlen($s); + $sep = -1; + $i = 0; + $j = 0; + $l = 0; + $nl = 1; + while($i<$nb) + { + // Get next character + $c = $s[$i]; + if($c=="\n") + { + // Explicit line break + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',false,$link); + $i++; + $sep = -1; + $j = $i; + $l = 0; + if($nl==1) + { + $this->x = $this->lMargin; + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + continue; + } + if($c==' ') + $sep = $i; + $l += $cw[$c]; + if($l>$wmax) + { + // Automatic line break + if($sep==-1) + { + if($this->x>$this->lMargin) + { + // Move to next line + $this->x = $this->lMargin; + $this->y += $h; + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; + $i++; + $nl++; + continue; + } + if($i==$j) + $i++; + $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',false,$link); + } + else + { + $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',false,$link); + $i = $sep+1; + } + $sep = -1; + $j = $i; + $l = 0; + if($nl==1) + { + $this->x = $this->lMargin; + $w = $this->w-$this->rMargin-$this->x; + $wmax = ($w-2*$this->cMargin)*1000/$this->FontSize; + } + $nl++; + } + else + $i++; + } + // Last chunk + if($i!=$j) + $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',false,$link); +} + +function Ln($h=null) +{ + // Line feed; default value is the last cell height + $this->x = $this->lMargin; + if($h===null) + $this->y += $this->lasth; + else + $this->y += $h; +} + +function Image($file, $x=null, $y=null, $w=0, $h=0, $type='', $link='') +{ + // Put an image on the page + if($file=='') + $this->Error('Image file name is empty'); + if(!isset($this->images[$file])) + { + // First use of this image, get info + if($type=='') + { + $pos = strrpos($file,'.'); + if(!$pos) + $this->Error('Image file has no extension and no type was specified: '.$file); + $type = substr($file,$pos+1); + } + $type = strtolower($type); + if($type=='jpeg') + $type = 'jpg'; + $mtd = '_parse'.$type; + if(!method_exists($this,$mtd)) + $this->Error('Unsupported image type: '.$type); + $info = $this->$mtd($file); + $info['i'] = count($this->images)+1; + $this->images[$file] = $info; + } + else + $info = $this->images[$file]; + + // Automatic width and height calculation if needed + if($w==0 && $h==0) + { + // Put image at 96 dpi + $w = -96; + $h = -96; + } + if($w<0) + $w = -$info['w']*72/$w/$this->k; + if($h<0) + $h = -$info['h']*72/$h/$this->k; + if($w==0) + $w = $h*$info['w']/$info['h']; + if($h==0) + $h = $w*$info['h']/$info['w']; + + // Flowing mode + if($y===null) + { + if($this->y+$h>$this->PageBreakTrigger && !$this->InHeader && !$this->InFooter && $this->AcceptPageBreak()) + { + // Automatic page break + $x2 = $this->x; + $this->AddPage($this->CurOrientation,$this->CurPageSize,$this->CurRotation); + $this->x = $x2; + } + $y = $this->y; + $this->y += $h; + } + + if($x===null) + $x = $this->x; + $this->_out(sprintf('q %.2F 0 0 %.2F %.2F %.2F cm /I%d Do Q',$w*$this->k,$h*$this->k,$x*$this->k,($this->h-($y+$h))*$this->k,$info['i'])); + if($link) + $this->Link($x,$y,$w,$h,$link); +} + +function GetPageWidth() +{ + // Get current page width + return $this->w; +} + +function GetPageHeight() +{ + // Get current page height + return $this->h; +} + +function GetX() +{ + // Get x position + return $this->x; +} + +function SetX($x) +{ + // Set x position + if($x>=0) + $this->x = $x; + else + $this->x = $this->w+$x; +} + +function GetY() +{ + // Get y position + return $this->y; +} + +function SetY($y, $resetX=true) +{ + // Set y position and optionally reset x + if($y>=0) + $this->y = $y; + else + $this->y = $this->h+$y; + if($resetX) + $this->x = $this->lMargin; +} + +function SetXY($x, $y) +{ + // Set x and y positions + $this->SetX($x); + $this->SetY($y,false); +} + +function Output($dest='', $name='', $isUTF8=false) +{ + // Output PDF to some destination + $this->Close(); + if(strlen($name)==1 && strlen($dest)!=1) + { + // Fix parameter order + $tmp = $dest; + $dest = $name; + $name = $tmp; + } + if($dest=='') + $dest = 'I'; + if($name=='') + $name = 'doc.pdf'; + switch(strtoupper($dest)) + { + case 'I': + // Send to standard output + $this->_checkoutput(); + if(PHP_SAPI!='cli') + { + // We send to a browser + header('Content-Type: application/pdf'); + header('Content-Disposition: inline; '.$this->_httpencode('filename',$name,$isUTF8)); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + } + echo $this->buffer; + break; + case 'D': + // Download file + $this->_checkoutput(); + header('Content-Type: application/x-download'); + header('Content-Disposition: attachment; '.$this->_httpencode('filename',$name,$isUTF8)); + header('Cache-Control: private, max-age=0, must-revalidate'); + header('Pragma: public'); + echo $this->buffer; + break; + case 'F': + // Save to local file + if(!file_put_contents($name,$this->buffer)) + $this->Error('Unable to create output file: '.$name); + break; + case 'S': + // Return as a string + return $this->buffer; + default: + $this->Error('Incorrect output destination: '.$dest); + } + return ''; +} + +/******************************************************************************* +* Protected methods * +*******************************************************************************/ + +protected function _dochecks() +{ + // Check mbstring overloading + if(ini_get('mbstring.func_overload') & 2) + $this->Error('mbstring overloading must be disabled'); + // Ensure runtime magic quotes are disabled + if(get_magic_quotes_runtime()) + @set_magic_quotes_runtime(0); +} + +protected function _checkoutput() +{ + if(PHP_SAPI!='cli') + { + if(headers_sent($file,$line)) + $this->Error("Some data has already been output, can't send PDF file (output started at $file:$line)"); + } + if(ob_get_length()) + { + // The output buffer is not empty + if(preg_match('/^(\xEF\xBB\xBF)?\s*$/',ob_get_contents())) + { + // It contains only a UTF-8 BOM and/or whitespace, let's clean it + ob_clean(); + } + else + $this->Error("Some data has already been output, can't send PDF file"); + } +} + +protected function _getpagesize($size) +{ + if(is_string($size)) + { + $size = strtolower($size); + if(!isset($this->StdPageSizes[$size])) + $this->Error('Unknown page size: '.$size); + $a = $this->StdPageSizes[$size]; + return array($a[0]/$this->k, $a[1]/$this->k); + } + else + { + if($size[0]>$size[1]) + return array($size[1], $size[0]); + else + return $size; + } +} + +protected function _beginpage($orientation, $size, $rotation) +{ + $this->page++; + $this->pages[$this->page] = ''; + $this->state = 2; + $this->x = $this->lMargin; + $this->y = $this->tMargin; + $this->FontFamily = ''; + // Check page size and orientation + if($orientation=='') + $orientation = $this->DefOrientation; + else + $orientation = strtoupper($orientation[0]); + if($size=='') + $size = $this->DefPageSize; + else + $size = $this->_getpagesize($size); + if($orientation!=$this->CurOrientation || $size[0]!=$this->CurPageSize[0] || $size[1]!=$this->CurPageSize[1]) + { + // New size or orientation + if($orientation=='P') + { + $this->w = $size[0]; + $this->h = $size[1]; + } + else + { + $this->w = $size[1]; + $this->h = $size[0]; + } + $this->wPt = $this->w*$this->k; + $this->hPt = $this->h*$this->k; + $this->PageBreakTrigger = $this->h-$this->bMargin; + $this->CurOrientation = $orientation; + $this->CurPageSize = $size; + } + if($orientation!=$this->DefOrientation || $size[0]!=$this->DefPageSize[0] || $size[1]!=$this->DefPageSize[1]) + $this->PageInfo[$this->page]['size'] = array($this->wPt, $this->hPt); + if($rotation!=0) + { + if($rotation%90!=0) + $this->Error('Incorrect rotation value: '.$rotation); + $this->CurRotation = $rotation; + $this->PageInfo[$this->page]['rotation'] = $rotation; + } +} + +protected function _endpage() +{ + $this->state = 1; +} + +protected function _loadfont($font) +{ + // Load a font definition file from the font directory + if(strpos($font,'/')!==false || strpos($font,"\\")!==false) + $this->Error('Incorrect font definition file name: '.$font); + include($this->fontpath.$font); + if(!isset($name)) + $this->Error('Could not include font definition file'); + if(isset($enc)) + $enc = strtolower($enc); + if(!isset($subsetted)) + $subsetted = false; + return get_defined_vars(); +} + +protected function _isascii($s) +{ + // Test if string is ASCII + $nb = strlen($s); + for($i=0;$i<$nb;$i++) + { + if(ord($s[$i])>127) + return false; + } + return true; +} + +protected function _httpencode($param, $value, $isUTF8) +{ + // Encode HTTP header field parameter + if($this->_isascii($value)) + return $param.'="'.$value.'"'; + if(!$isUTF8) + $value = utf8_encode($value); + if(strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')!==false) + return $param.'="'.rawurlencode($value).'"'; + else + return $param."*=UTF-8''".rawurlencode($value); +} + +protected function _UTF8toUTF16($s) +{ + // Convert UTF-8 to UTF-16BE with BOM + $res = "\xFE\xFF"; + $nb = strlen($s); + $i = 0; + while($i<$nb) + { + $c1 = ord($s[$i++]); + if($c1>=224) + { + // 3-byte character + $c2 = ord($s[$i++]); + $c3 = ord($s[$i++]); + $res .= chr((($c1 & 0x0F)<<4) + (($c2 & 0x3C)>>2)); + $res .= chr((($c2 & 0x03)<<6) + ($c3 & 0x3F)); + } + elseif($c1>=192) + { + // 2-byte character + $c2 = ord($s[$i++]); + $res .= chr(($c1 & 0x1C)>>2); + $res .= chr((($c1 & 0x03)<<6) + ($c2 & 0x3F)); + } + else + { + // Single-byte character + $res .= "\0".chr($c1); + } + } + return $res; +} + +protected function _escape($s) +{ + // Escape special characters + if(strpos($s,'(')!==false || strpos($s,')')!==false || strpos($s,'\\')!==false || strpos($s,"\r")!==false) + return str_replace(array('\\','(',')',"\r"), array('\\\\','\\(','\\)','\\r'), $s); + else + return $s; +} + +protected function _textstring($s) +{ + // Format a text string + if(!$this->_isascii($s)) + $s = $this->_UTF8toUTF16($s); + return '('.$this->_escape($s).')'; +} + +protected function _dounderline($x, $y, $txt) +{ + // Underline text + $up = $this->CurrentFont['up']; + $ut = $this->CurrentFont['ut']; + $w = $this->GetStringWidth($txt)+$this->ws*substr_count($txt,' '); + return sprintf('%.2F %.2F %.2F %.2F re f',$x*$this->k,($this->h-($y-$up/1000*$this->FontSize))*$this->k,$w*$this->k,-$ut/1000*$this->FontSizePt); +} + +protected function _parsejpg($file) +{ + // Extract info from a JPEG file + $a = getimagesize($file); + if(!$a) + $this->Error('Missing or incorrect image file: '.$file); + if($a[2]!=2) + $this->Error('Not a JPEG file: '.$file); + if(!isset($a['channels']) || $a['channels']==3) + $colspace = 'DeviceRGB'; + elseif($a['channels']==4) + $colspace = 'DeviceCMYK'; + else + $colspace = 'DeviceGray'; + $bpc = isset($a['bits']) ? $a['bits'] : 8; + $data = file_get_contents($file); + return array('w'=>$a[0], 'h'=>$a[1], 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'DCTDecode', 'data'=>$data); +} + +protected function _parsepng($file) +{ + // Extract info from a PNG file + $f = fopen($file,'rb'); + if(!$f) + $this->Error('Can\'t open image file: '.$file); + $info = $this->_parsepngstream($f,$file); + fclose($f); + return $info; +} + +protected function _parsepngstream($f, $file) +{ + // Check signature + if($this->_readstream($f,8)!=chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) + $this->Error('Not a PNG file: '.$file); + + // Read header chunk + $this->_readstream($f,4); + if($this->_readstream($f,4)!='IHDR') + $this->Error('Incorrect PNG file: '.$file); + $w = $this->_readint($f); + $h = $this->_readint($f); + $bpc = ord($this->_readstream($f,1)); + if($bpc>8) + $this->Error('16-bit depth not supported: '.$file); + $ct = ord($this->_readstream($f,1)); + if($ct==0 || $ct==4) + $colspace = 'DeviceGray'; + elseif($ct==2 || $ct==6) + $colspace = 'DeviceRGB'; + elseif($ct==3) + $colspace = 'Indexed'; + else + $this->Error('Unknown color type: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown compression method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Unknown filter method: '.$file); + if(ord($this->_readstream($f,1))!=0) + $this->Error('Interlacing not supported: '.$file); + $this->_readstream($f,4); + $dp = '/Predictor 15 /Colors '.($colspace=='DeviceRGB' ? 3 : 1).' /BitsPerComponent '.$bpc.' /Columns '.$w; + + // Scan chunks looking for palette, transparency and image data + $pal = ''; + $trns = ''; + $data = ''; + do + { + $n = $this->_readint($f); + $type = $this->_readstream($f,4); + if($type=='PLTE') + { + // Read palette + $pal = $this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='tRNS') + { + // Read transparency info + $t = $this->_readstream($f,$n); + if($ct==0) + $trns = array(ord(substr($t,1,1))); + elseif($ct==2) + $trns = array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1))); + else + { + $pos = strpos($t,chr(0)); + if($pos!==false) + $trns = array($pos); + } + $this->_readstream($f,4); + } + elseif($type=='IDAT') + { + // Read image data block + $data .= $this->_readstream($f,$n); + $this->_readstream($f,4); + } + elseif($type=='IEND') + break; + else + $this->_readstream($f,$n+4); + } + while($n); + + if($colspace=='Indexed' && empty($pal)) + $this->Error('Missing palette in '.$file); + $info = array('w'=>$w, 'h'=>$h, 'cs'=>$colspace, 'bpc'=>$bpc, 'f'=>'FlateDecode', 'dp'=>$dp, 'pal'=>$pal, 'trns'=>$trns); + if($ct>=4) + { + // Extract alpha channel + if(!function_exists('gzuncompress')) + $this->Error('Zlib not available, can\'t handle alpha channel: '.$file); + $data = gzuncompress($data); + $color = ''; + $alpha = ''; + if($ct==4) + { + // Gray image + $len = 2*$w; + for($i=0;$i<$h;$i++) + { + $pos = (1+$len)*$i; + $color .= $data[$pos]; + $alpha .= $data[$pos]; + $line = substr($data,$pos+1,$len); + $color .= preg_replace('/(.)./s','$1',$line); + $alpha .= preg_replace('/.(.)/s','$1',$line); + } + } + else + { + // RGB image + $len = 4*$w; + for($i=0;$i<$h;$i++) + { + $pos = (1+$len)*$i; + $color .= $data[$pos]; + $alpha .= $data[$pos]; + $line = substr($data,$pos+1,$len); + $color .= preg_replace('/(.{3})./s','$1',$line); + $alpha .= preg_replace('/.{3}(.)/s','$1',$line); + } + } + unset($data); + $data = gzcompress($color); + $info['smask'] = gzcompress($alpha); + $this->WithAlpha = true; + if($this->PDFVersion<'1.4') + $this->PDFVersion = '1.4'; + } + $info['data'] = $data; + return $info; +} + +protected function _readstream($f, $n) +{ + // Read n bytes from stream + $res = ''; + while($n>0 && !feof($f)) + { + $s = fread($f,$n); + if($s===false) + $this->Error('Error while reading stream'); + $n -= strlen($s); + $res .= $s; + } + if($n>0) + $this->Error('Unexpected end of stream'); + return $res; +} + +protected function _readint($f) +{ + // Read a 4-byte integer from stream + $a = unpack('Ni',$this->_readstream($f,4)); + return $a['i']; +} + +protected function _parsegif($file) +{ + // Extract info from a GIF file (via PNG conversion) + if(!function_exists('imagepng')) + $this->Error('GD extension is required for GIF support'); + if(!function_exists('imagecreatefromgif')) + $this->Error('GD has no GIF read support'); + $im = imagecreatefromgif($file); + if(!$im) + $this->Error('Missing or incorrect image file: '.$file); + imageinterlace($im,0); + ob_start(); + imagepng($im); + $data = ob_get_clean(); + imagedestroy($im); + $f = fopen('php://temp','rb+'); + if(!$f) + $this->Error('Unable to create memory stream'); + fwrite($f,$data); + rewind($f); + $info = $this->_parsepngstream($f,$file); + fclose($f); + return $info; +} + +protected function _out($s) +{ + // Add a line to the document + if($this->state==2) + $this->pages[$this->page] .= $s."\n"; + elseif($this->state==1) + $this->_put($s); + elseif($this->state==0) + $this->Error('No page has been added yet'); + elseif($this->state==3) + $this->Error('The document is closed'); +} + +protected function _put($s) +{ + $this->buffer .= $s."\n"; +} + +protected function _getoffset() +{ + return strlen($this->buffer); +} + +protected function _newobj($n=null) +{ + // Begin a new object + if($n===null) + $n = ++$this->n; + $this->offsets[$n] = $this->_getoffset(); + $this->_put($n.' 0 obj'); +} + +protected function _putstream($data) +{ + $this->_put('stream'); + $this->_put($data); + $this->_put('endstream'); +} + +protected function _putstreamobject($data) +{ + if($this->compress) + { + $entries = '/Filter /FlateDecode '; + $data = gzcompress($data); + } + else + $entries = ''; + $entries .= '/Length '.strlen($data); + $this->_newobj(); + $this->_put('<<'.$entries.'>>'); + $this->_putstream($data); + $this->_put('endobj'); +} + +protected function _putpage($n) +{ + $this->_newobj(); + $this->_put('<_put('/Parent 1 0 R'); + if(isset($this->PageInfo[$n]['size'])) + $this->_put(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageInfo[$n]['size'][0],$this->PageInfo[$n]['size'][1])); + if(isset($this->PageInfo[$n]['rotation'])) + $this->_put('/Rotate '.$this->PageInfo[$n]['rotation']); + $this->_put('/Resources 2 0 R'); + if(isset($this->PageLinks[$n])) + { + // Links + $annots = '/Annots ['; + foreach($this->PageLinks[$n] as $pl) + { + $rect = sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]); + $annots .= '<_textstring($pl[4]).'>>>>'; + else + { + $l = $this->links[$pl[4]]; + if(isset($this->PageInfo[$l[0]]['size'])) + $h = $this->PageInfo[$l[0]]['size'][1]; + else + $h = ($this->DefOrientation=='P') ? $this->DefPageSize[1]*$this->k : $this->DefPageSize[0]*$this->k; + $annots .= sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',$this->PageInfo[$l[0]]['n'],$h-$l[1]*$this->k); + } + } + $this->_put($annots.']'); + } + if($this->WithAlpha) + $this->_put('/Group <>'); + $this->_put('/Contents '.($this->n+1).' 0 R>>'); + $this->_put('endobj'); + // Page content + if(!empty($this->AliasNbPages)) + $this->pages[$n] = str_replace($this->AliasNbPages,$this->page,$this->pages[$n]); + $this->_putstreamobject($this->pages[$n]); +} + +protected function _putpages() +{ + $nb = $this->page; + for($n=1;$n<=$nb;$n++) + $this->PageInfo[$n]['n'] = $this->n+1+2*($n-1); + for($n=1;$n<=$nb;$n++) + $this->_putpage($n); + // Pages root + $this->_newobj(1); + $this->_put('<PageInfo[$n]['n'].' 0 R '; + $this->_put($kids.']'); + $this->_put('/Count '.$nb); + if($this->DefOrientation=='P') + { + $w = $this->DefPageSize[0]; + $h = $this->DefPageSize[1]; + } + else + { + $w = $this->DefPageSize[1]; + $h = $this->DefPageSize[0]; + } + $this->_put(sprintf('/MediaBox [0 0 %.2F %.2F]',$w*$this->k,$h*$this->k)); + $this->_put('>>'); + $this->_put('endobj'); +} + +protected function _putfonts() +{ + foreach($this->FontFiles as $file=>$info) + { + // Font file embedding + $this->_newobj(); + $this->FontFiles[$file]['n'] = $this->n; + $font = file_get_contents($this->fontpath.$file,true); + if(!$font) + $this->Error('Font file not found: '.$file); + $compressed = (substr($file,-2)=='.z'); + if(!$compressed && isset($info['length2'])) + $font = substr($font,6,$info['length1']).substr($font,6+$info['length1']+6,$info['length2']); + $this->_put('<_put('/Filter /FlateDecode'); + $this->_put('/Length1 '.$info['length1']); + if(isset($info['length2'])) + $this->_put('/Length2 '.$info['length2'].' /Length3 0'); + $this->_put('>>'); + $this->_putstream($font); + $this->_put('endobj'); + } + foreach($this->fonts as $k=>$font) + { + // Encoding + if(isset($font['diff'])) + { + if(!isset($this->encodings[$font['enc']])) + { + $this->_newobj(); + $this->_put('<>'); + $this->_put('endobj'); + $this->encodings[$font['enc']] = $this->n; + } + } + // ToUnicode CMap + if(isset($font['uv'])) + { + if(isset($font['enc'])) + $cmapkey = $font['enc']; + else + $cmapkey = $font['name']; + if(!isset($this->cmaps[$cmapkey])) + { + $cmap = $this->_tounicodecmap($font['uv']); + $this->_putstreamobject($cmap); + $this->cmaps[$cmapkey] = $this->n; + } + } + // Font object + $this->fonts[$k]['n'] = $this->n+1; + $type = $font['type']; + $name = $font['name']; + if($font['subsetted']) + $name = 'AAAAAA+'.$name; + if($type=='Core') + { + // Core font + $this->_newobj(); + $this->_put('<_put('/BaseFont /'.$name); + $this->_put('/Subtype /Type1'); + if($name!='Symbol' && $name!='ZapfDingbats') + $this->_put('/Encoding /WinAnsiEncoding'); + if(isset($font['uv'])) + $this->_put('/ToUnicode '.$this->cmaps[$cmapkey].' 0 R'); + $this->_put('>>'); + $this->_put('endobj'); + } + elseif($type=='Type1' || $type=='TrueType') + { + // Additional Type1 or TrueType/OpenType font + $this->_newobj(); + $this->_put('<_put('/BaseFont /'.$name); + $this->_put('/Subtype /'.$type); + $this->_put('/FirstChar 32 /LastChar 255'); + $this->_put('/Widths '.($this->n+1).' 0 R'); + $this->_put('/FontDescriptor '.($this->n+2).' 0 R'); + if(isset($font['diff'])) + $this->_put('/Encoding '.$this->encodings[$font['enc']].' 0 R'); + else + $this->_put('/Encoding /WinAnsiEncoding'); + if(isset($font['uv'])) + $this->_put('/ToUnicode '.$this->cmaps[$cmapkey].' 0 R'); + $this->_put('>>'); + $this->_put('endobj'); + // Widths + $this->_newobj(); + $cw = &$font['cw']; + $s = '['; + for($i=32;$i<=255;$i++) + $s .= $cw[chr($i)].' '; + $this->_put($s.']'); + $this->_put('endobj'); + // Descriptor + $this->_newobj(); + $s = '<$v) + $s .= ' /'.$k.' '.$v; + if(!empty($font['file'])) + $s .= ' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$font['file']]['n'].' 0 R'; + $this->_put($s.'>>'); + $this->_put('endobj'); + } + else + { + // Allow for additional types + $mtd = '_put'.strtolower($type); + if(!method_exists($this,$mtd)) + $this->Error('Unsupported font type: '.$type); + $this->$mtd($font); + } + } +} + +protected function _tounicodecmap($uv) +{ + $ranges = ''; + $nbr = 0; + $chars = ''; + $nbc = 0; + foreach($uv as $c=>$v) + { + if(is_array($v)) + { + $ranges .= sprintf("<%02X> <%02X> <%04X>\n",$c,$c+$v[1]-1,$v[0]); + $nbr++; + } + else + { + $chars .= sprintf("<%02X> <%04X>\n",$c,$v); + $nbc++; + } + } + $s = "/CIDInit /ProcSet findresource begin\n"; + $s .= "12 dict begin\n"; + $s .= "begincmap\n"; + $s .= "/CIDSystemInfo\n"; + $s .= "<0) + { + $s .= "$nbr beginbfrange\n"; + $s .= $ranges; + $s .= "endbfrange\n"; + } + if($nbc>0) + { + $s .= "$nbc beginbfchar\n"; + $s .= $chars; + $s .= "endbfchar\n"; + } + $s .= "endcmap\n"; + $s .= "CMapName currentdict /CMap defineresource pop\n"; + $s .= "end\n"; + $s .= "end"; + return $s; +} + +protected function _putimages() +{ + foreach(array_keys($this->images) as $file) + { + $this->_putimage($this->images[$file]); + unset($this->images[$file]['data']); + unset($this->images[$file]['smask']); + } +} + +protected function _putimage(&$info) +{ + $this->_newobj(); + $info['n'] = $this->n; + $this->_put('<_put('/Subtype /Image'); + $this->_put('/Width '.$info['w']); + $this->_put('/Height '.$info['h']); + if($info['cs']=='Indexed') + $this->_put('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]'); + else + { + $this->_put('/ColorSpace /'.$info['cs']); + if($info['cs']=='DeviceCMYK') + $this->_put('/Decode [1 0 1 0 1 0 1 0]'); + } + $this->_put('/BitsPerComponent '.$info['bpc']); + if(isset($info['f'])) + $this->_put('/Filter /'.$info['f']); + if(isset($info['dp'])) + $this->_put('/DecodeParms <<'.$info['dp'].'>>'); + if(isset($info['trns']) && is_array($info['trns'])) + { + $trns = ''; + for($i=0;$i_put('/Mask ['.$trns.']'); + } + if(isset($info['smask'])) + $this->_put('/SMask '.($this->n+1).' 0 R'); + $this->_put('/Length '.strlen($info['data']).'>>'); + $this->_putstream($info['data']); + $this->_put('endobj'); + // Soft mask + if(isset($info['smask'])) + { + $dp = '/Predictor 15 /Colors 1 /BitsPerComponent 8 /Columns '.$info['w']; + $smask = array('w'=>$info['w'], 'h'=>$info['h'], 'cs'=>'DeviceGray', 'bpc'=>8, 'f'=>$info['f'], 'dp'=>$dp, 'data'=>$info['smask']); + $this->_putimage($smask); + } + // Palette + if($info['cs']=='Indexed') + $this->_putstreamobject($info['pal']); +} + +protected function _putxobjectdict() +{ + foreach($this->images as $image) + $this->_put('/I'.$image['i'].' '.$image['n'].' 0 R'); +} + +protected function _putresourcedict() +{ + $this->_put('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]'); + $this->_put('/Font <<'); + foreach($this->fonts as $font) + $this->_put('/F'.$font['i'].' '.$font['n'].' 0 R'); + $this->_put('>>'); + $this->_put('/XObject <<'); + $this->_putxobjectdict(); + $this->_put('>>'); +} + +protected function _putresources() +{ + $this->_putfonts(); + $this->_putimages(); + // Resource dictionary + $this->_newobj(2); + $this->_put('<<'); + $this->_putresourcedict(); + $this->_put('>>'); + $this->_put('endobj'); +} + +protected function _putinfo() +{ + $this->metadata['Producer'] = 'FPDF '.FPDF_VERSION; + $this->metadata['CreationDate'] = 'D:'.@date('YmdHis'); + foreach($this->metadata as $key=>$value) + $this->_put('/'.$key.' '.$this->_textstring($value)); +} + +protected function _putcatalog() +{ + $n = $this->PageInfo[1]['n']; + $this->_put('/Type /Catalog'); + $this->_put('/Pages 1 0 R'); + if($this->ZoomMode=='fullpage') + $this->_put('/OpenAction ['.$n.' 0 R /Fit]'); + elseif($this->ZoomMode=='fullwidth') + $this->_put('/OpenAction ['.$n.' 0 R /FitH null]'); + elseif($this->ZoomMode=='real') + $this->_put('/OpenAction ['.$n.' 0 R /XYZ null null 1]'); + elseif(!is_string($this->ZoomMode)) + $this->_put('/OpenAction ['.$n.' 0 R /XYZ null null '.sprintf('%.2F',$this->ZoomMode/100).']'); + if($this->LayoutMode=='single') + $this->_put('/PageLayout /SinglePage'); + elseif($this->LayoutMode=='continuous') + $this->_put('/PageLayout /OneColumn'); + elseif($this->LayoutMode=='two') + $this->_put('/PageLayout /TwoColumnLeft'); +} + +protected function _putheader() +{ + $this->_put('%PDF-'.$this->PDFVersion); +} + +protected function _puttrailer() +{ + $this->_put('/Size '.($this->n+1)); + $this->_put('/Root '.$this->n.' 0 R'); + $this->_put('/Info '.($this->n-1).' 0 R'); +} + +protected function _enddoc() +{ + $this->_putheader(); + $this->_putpages(); + $this->_putresources(); + // Info + $this->_newobj(); + $this->_put('<<'); + $this->_putinfo(); + $this->_put('>>'); + $this->_put('endobj'); + // Catalog + $this->_newobj(); + $this->_put('<<'); + $this->_putcatalog(); + $this->_put('>>'); + $this->_put('endobj'); + // Cross-ref + $offset = $this->_getoffset(); + $this->_put('xref'); + $this->_put('0 '.($this->n+1)); + $this->_put('0000000000 65535 f '); + for($i=1;$i<=$this->n;$i++) + $this->_put(sprintf('%010d 00000 n ',$this->offsets[$i])); + // Trailer + $this->_put('trailer'); + $this->_put('<<'); + $this->_puttrailer(); + $this->_put('>>'); + $this->_put('startxref'); + $this->_put($offset); + $this->_put('%%EOF'); + $this->state = 3; +} +} +?> diff --git a/plugin/test2pdf/config.php b/plugin/test2pdf/config.php new file mode 100644 index 0000000000..648687fc84 --- /dev/null +++ b/plugin/test2pdf/config.php @@ -0,0 +1,8 @@ +install(); diff --git a/plugin/test2pdf/lang/english.php b/plugin/test2pdf/lang/english.php new file mode 100644 index 0000000000..4f3a20b834 --- /dev/null +++ b/plugin/test2pdf/lang/english.php @@ -0,0 +1,16 @@ +Plugins) + * @package chamilo.plugin.test2pdf + */ +/** + * Plugin details (must be present) + */ +require_once dirname(__FILE__) . '/config.php'; +$plugin_info = Test2pdfPlugin::create()->get_info(); diff --git a/plugin/test2pdf/resources/css/style.css b/plugin/test2pdf/resources/css/style.css new file mode 100644 index 0000000000..98e1ea1afa --- /dev/null +++ b/plugin/test2pdf/resources/css/style.css @@ -0,0 +1,6 @@ +.ta-center{ + text-align:center; +} +#courses_table td.valign-middle{ + vertical-align: middle; +} \ No newline at end of file diff --git a/plugin/test2pdf/resources/img/128/accept.png b/plugin/test2pdf/resources/img/128/accept.png new file mode 100644 index 0000000000000000000000000000000000000000..6a287f392970f24872ffb4cc8a7ffb1c5b40a188 GIT binary patch literal 7061 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 literal 0 HcmV?d00001 diff --git a/plugin/test2pdf/resources/img/22/test2pdf.png b/plugin/test2pdf/resources/img/22/test2pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..dab8f27376aeb9d67db21a023f7be624b995a18a GIT binary patch literal 829 zcmV-D1H$}?P)TlwW9-WgN#p-{*bjIqm39>RLOQ&N#022aISYU7VmG zqnSZiMuJ3OSAu%6i^z+pz?)#~N+JZQ7-0i1+J#Ob!lVLExq=nTAudBx_s7|Be>~@X zeqBws^}cQwelMTr`~C3!J^XmYsp#Qg^wvulS?-4%rD!^HDhx)ajv!Y+jNBJ6)CTFv zVu*ObW+wY|zW4zEs~&kk_4yh=OMpa-{8h4R!&9>d*4Xx;Qq}Dt;50Hk7Jb~_51=jY zKI7i$Yylfz6f33dboZ~m=V1Trk?TA=#+qgeW86>Jgp%+RK{vn#fH7d%TwVxZ3n|a-%+T~~Juay5 z`Fj&w{H+Wi7i<9A0bIfu#F4|)2s{S%&s;>@Q%tLF{hO|?;ccYzmdSP){1HXIJM_Lz z@Fy?@OyKRZK}ts1SNQ>xO)3d&fj?n^Z&2hqfChsU03B_`irl=X)API9wPJNu^i9{- zfM;?dN^X4o@V`F0veRwdcU9Asy>9=PUjVmbCIcw>-mXu%IZ~e6?JhV>g?h9pbLZ+z zFLtK)n8C3G;5^OC2I<>?DL7iH82s$KeYHsbDpDDX5a#FGpU5fPKqtN zS30?7gLIrrFYhTRm){Glnr&lOh7Q^BL*K^wjk1^h9&+;VxQ8E-X42-@Hj&HE-QR%m zD`o5ZEEa5cObK%Bd)8^^N87c2<8GFv*K+qC2$gxTPEWpQRA)ySI(s8Fp9HpCew$hf z2gqbw7ZeDn&NivFa6q{Y+mrH%`zWJ`_n!b&36=_QE-C*Xoe&DFHdg2H00000NkvXX Hu0mjfB}tFn literal 0 HcmV?d00001 diff --git a/plugin/test2pdf/resources/img/24/download.png b/plugin/test2pdf/resources/img/24/download.png new file mode 100644 index 0000000000000000000000000000000000000000..b4678205dd082348ad861fca5759d6ab16d72bbb GIT binary patch literal 384 zcmV-`0e}99P)$XyBd5BfUWY4$kETMRi+@Wa}^#B~_nG2~4{x^=AzeyHG% zD9T%;5;-m=3(cY-T~1s-)K^}ZKP5I2eF)O$_0Z!c`LxRPj|tewbR|{tqOXFLmrqHX eZ1iISujP)>8s;Sa4#&odtd9n4x*_#$zDL$;Uvn=2L;1O1~!YISa1A0TS%YP$Yi!eErj`1891@FQtXO=}e><#1RmG z(Pb)h?r@C5uSf8nOEVO~AXJNB*#J46%|%K=(fyO6@!IjCP+f-AsY;U zVz5%ExKNG7XnK@Dyg3n0wEbQP!&XgCTs-xs2z$4L=#R+vFHky7;mg}yOq?;!hLBs` zmb$er%PeDWe=C9bS+q=?;h2n8+?G3Vm}~LJ&S<^;=YJwFJQe5)_wV>h4;}walS|}} zeC^LmaF*F>O$PIRPw~>Ko_GuXcr!Ok043HrWQ))qI?$TY)AvOqk;|`s$xqvv)Qtt) zQ;d9dXBnk&F(3V5*~mK>R=5NiDd*cP(`F<@et{ijc?`%WNO5_683j z85`c-LwFpEXLW>*K0E(`qD@UZqlo)9JNV=(SFO`p-4aQ5DhaKZv1BooU^cl^ef{3* z(~Uh|vE}$=ti=Uyl-g#k_J#k=s1Snr?#D^$5t@5`O}+{CxpYTcUQMUd>lCwHEgq*% z{#+n>0V%~OWE)sK;XBkhR{@}iLQeT#BUd1H35#j`!%^M$P4QC8^i>Y?v^RU>SGZjU zVWeTw_nGNf&H#{7(%AVeT6*`8%W0WGU;nk`iqxr3XOg$QdxKE8ck+*^DQ+O2z?8o} z*-Ugvy&{CEE~&+kl0lUeR%2CMc%vs6icu7>-1Ac^iWZSeO39I~7ikXsj(jOCft1vV zms{%mNiE_YJiLn4mAfb~+Ig#c2S>YJK_`=c)3IXu&zLrDVP3dSwS6<^ zdiF6Kqd^Ud=l@la1XS`YD&N4zC#)r3D0!XTSJu&&>SAT(FDbXqB3DLFv){Xs*4_h* zKu|pUcBKzN*^Q4#Axk~aGuwSX`7%;N(~}e!t>n`56nn3%=VIt@jEJO7JpESHNdfa2 z!beJ0&@lDeWD7Bzw4PwsrN_D4cZ`vea6~+HqH4Q9JjO7_TWffzavLtQhry&Wao&7q zEp2_LxET`p1F^ZO`auwT7}mgnd!X_KX1bP;t6z)ooAYb97CFn!lS{>u|E#fs@Bud7 zkAQ^}S98zQ4Hyk3V(B2iYF$HTq?KFH3vz;3x3>aYiMkzlj1ltKXJ?B%%#n`Q@x?B2 zi(W}awT)uIBW@OcvD5?N9iV^@Mhs-dnSDJzQD8Ih=x?hiv@2VHr}4B*h#4pwZd=x}<>i-5m_n8c`(ZNR5O*OR`3FI+?FgM3UZ4uyNaI|J8rbGeja zA25&6aZCugB6L0R-u@>p6Ax-bf6bIa1NC2)CiTDQa1;EM3_<>&t*^b-gU zZVoQNynBjvh=U2F(#DrGsSf$WZMpaRz2hDPz%-KQQF0fF2T1J4mgKJSxuyx=@!(tq zOm3dDfEm0HCq#h>_ct%oNso-HOQin+TGmU^n-qA$xFoO6rxqv>08-FGf0g!Kt zD78!=a0}PoQa11)g1j0M_kSNdKM2VinZm=MNPHLB_`V>omhP~wFOc{WgMU7--HK74qpC<+A@M*E zuN(E)ZY7W&An7Kw+%h2XZgiB!0sv5wydtExX8L_ZAb2rqA1u=Kv;v9Ka?3xK_N);2 ze*#FliIN++6zS&h66*R0f$7zl2~1f49ku;e0%&`CU*eCpHOa;zeEpF literal 0 HcmV?d00001 diff --git a/plugin/test2pdf/resources/img/32/info.png b/plugin/test2pdf/resources/img/32/info.png new file mode 100644 index 0000000000000000000000000000000000000000..09501dd09ec2244111d9715c09e08a92d8199e4f GIT binary patch literal 311 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 literal 0 HcmV?d00001 diff --git a/plugin/test2pdf/resources/img/logo.png b/plugin/test2pdf/resources/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7f36f474295a55e24883679528a5d69b0bbe31 GIT binary patch literal 8823 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'enable_plugin'); +if($enable != "true"){ + header('Location: ../../../index.php'); +} + +require('../class/fpdf.php'); + +api_protect_course_script(); + +$course_id = (int) $_GET['c_id']; +$id_quiz = (int) $_GET['id_quiz']; + +class PDF extends FPDF +{ + function Header() + { + global $title_course; + global $title_quiz; + + $logo = '../resources/img/logo.png'; + $this->Image($logo,10,0); + + // Title + $this->SetFont('Courier','I',14); + $this->Cell(0,5,$title_course,0,1,'R'); + $this->SetFont('Helvetica','I',14); + $this->Cell(0,5,$title_quiz,0,1,'R'); + + // Line break + $this->SetLineWidth(0.5); + $this->SetDrawColor(60,120,255); + $this->Line(10, 24, 200, 24); + $this->SetLineWidth(0.4); + $this->SetDrawColor(200); + $this->Line(11, 24.5, 199, 24.5); + $this->Ln(10); + } + + function Footer() + { + global $test2pdfPlugin; + // Position at 1.5 cm from bottom + $this->SetY(-15); + $y = $this->GetY(); + // Line break + $this->SetLineWidth(0.5); + $this->SetDrawColor(60,120,255); + $this->Line(10, $y, 200, $y); + $this->SetLineWidth(0.4); + $this->SetDrawColor(200); + $this->Line(11, $y+0.5, 199, $y+0.5); + + + // Arial italic 8 + $this->SetFont('Arial','I',8); + // Text color in gray + $this->SetTextColor(128); + // Page number + $this->Cell(0,10,utf8_decode(sprintf($test2pdfPlugin->get_lang('PageX'), $this->PageNo())),0,0,'C'); + $this->Cell(0,10,date('Y'),0,0,'R'); + } + + var $B; + var $I; + var $U; + var $HREF; + var $fontList; + var $issetfont; + var $issetcolor; + + function PDF($orientation='P', $unit='mm', $format='A4') + { + //Call parent constructor + $this->__construct($orientation,$unit,$format); + //Initialization + $this->B=0; + $this->I=0; + $this->U=0; + $this->HREF=''; + $this->fontlist=array('arial', 'times', 'courier', 'helvetica', 'symbol'); + $this->issetfont=false; + $this->issetcolor=false; + } + + function WriteHTML($html) + { + //HTML parser + $html=strip_tags($html,"