From e9618248c3a51fec7ca601fed036320ed9c0bd3d Mon Sep 17 00:00:00 2001
From: mudrd8mz
Date: Mon, 20 Jul 2009 17:31:48 +0000
Subject: [PATCH] MDL-19876 upgrade to tcpdf-4.6.020 (php5 version)
See lib/tcpdf/README-MOODLE.TXT for the detailed description about how
the upgrade was done.
MDL-18663 removing all fonts but the selected ones.
---
lib/pdflib.php | 92 +-
lib/tcpdf/2dbarcodes.php | 126 +
lib/tcpdf/CHANGELOG.TXT | 1490 +-
lib/tcpdf/README-MOODLE.TXT | 21 +-
lib/tcpdf/README.TXT | 171 +-
lib/tcpdf/barcodes.php | 2618 +-
lib/tcpdf/config/lang/eng.php | 49 -
lib/tcpdf/config/tcpdf_config.php | 477 +-
lib/tcpdf/config/tcpdf_config_alt.php | 227 -
lib/tcpdf/fonts/README-MOODLE.TXT | 6 +
lib/tcpdf/fonts/almohanad.ctg.z | Bin 2780 -> 0 bytes
lib/tcpdf/fonts/almohanad.php | 101 -
lib/tcpdf/fonts/almohanad.z | Bin 121292 -> 0 bytes
lib/tcpdf/fonts/courier.php | 32 +-
lib/tcpdf/fonts/courierb.php | 5 -
lib/tcpdf/fonts/courierbi.php | 5 -
lib/tcpdf/fonts/courieri.php | 5 -
lib/tcpdf/fonts/dejavu-fonts-ttf-2.25/AUTHORS | 44 -
lib/tcpdf/fonts/dejavu-fonts-ttf-2.25/BUGS | 3 -
lib/tcpdf/fonts/dejavu-fonts-ttf-2.25/LICENSE | 99 -
lib/tcpdf/fonts/dejavu-fonts-ttf-2.25/NEWS | 1055 -
lib/tcpdf/fonts/dejavu-fonts-ttf-2.25/README | 59 -
.../fonts/dejavu-fonts-ttf-2.25/langcover.txt | 193 -
.../fonts/dejavu-fonts-ttf-2.25/unicover.txt | 160 -
lib/tcpdf/fonts/dejavusans-extralight.ctg.z | Bin 3485 -> 0 bytes
lib/tcpdf/fonts/dejavusans-extralight.php | 119 -
lib/tcpdf/fonts/dejavusans-extralight.z | Bin 147954 -> 0 bytes
lib/tcpdf/fonts/dejavusans.ctg.z | Bin 9642 -> 0 bytes
lib/tcpdf/fonts/dejavusans.php | 322 -
lib/tcpdf/fonts/dejavusans.z | Bin 326816 -> 0 bytes
lib/tcpdf/fonts/dejavusansb.ctg.z | Bin 9384 -> 0 bytes
lib/tcpdf/fonts/dejavusansb.php | 314 -
lib/tcpdf/fonts/dejavusansb.z | Bin 297973 -> 0 bytes
lib/tcpdf/fonts/dejavusansbi.ctg.z | Bin 8419 -> 0 bytes
lib/tcpdf/fonts/dejavusansbi.php | 285 -
lib/tcpdf/fonts/dejavusansbi.z | Bin 280423 -> 0 bytes
lib/tcpdf/fonts/dejavusanscondensed.ctg.z | Bin 9642 -> 0 bytes
lib/tcpdf/fonts/dejavusanscondensed.php | 322 -
lib/tcpdf/fonts/dejavusanscondensed.z | Bin 278499 -> 0 bytes
lib/tcpdf/fonts/dejavusanscondensedb.ctg.z | Bin 9384 -> 0 bytes
lib/tcpdf/fonts/dejavusanscondensedb.php | 314 -
lib/tcpdf/fonts/dejavusanscondensedb.z | Bin 275365 -> 0 bytes
lib/tcpdf/fonts/dejavusanscondensedbi.ctg.z | Bin 8419 -> 0 bytes
lib/tcpdf/fonts/dejavusanscondensedbi.php | 285 -
lib/tcpdf/fonts/dejavusanscondensedbi.z | Bin 266323 -> 0 bytes
lib/tcpdf/fonts/dejavusanscondensedi.ctg.z | Bin 8672 -> 0 bytes
lib/tcpdf/fonts/dejavusanscondensedi.php | 293 -
lib/tcpdf/fonts/dejavusanscondensedi.z | Bin 263109 -> 0 bytes
lib/tcpdf/fonts/dejavusansi.ctg.z | Bin 8672 -> 0 bytes
lib/tcpdf/fonts/dejavusansi.php | 293 -
lib/tcpdf/fonts/dejavusansi.z | Bin 280376 -> 0 bytes
lib/tcpdf/fonts/dejavusansmono.ctg.z | Bin 5840 -> 0 bytes
lib/tcpdf/fonts/dejavusansmono.php | 196 -
lib/tcpdf/fonts/dejavusansmono.z | Bin 181541 -> 0 bytes
lib/tcpdf/fonts/dejavusansmonob.ctg.z | Bin 5593 -> 0 bytes
lib/tcpdf/fonts/dejavusansmonob.php | 188 -
lib/tcpdf/fonts/dejavusansmonob.z | Bin 174731 -> 0 bytes
lib/tcpdf/fonts/dejavusansmonobi.ctg.z | Bin 4451 -> 0 bytes
lib/tcpdf/fonts/dejavusansmonobi.php | 152 -
lib/tcpdf/fonts/dejavusansmonobi.z | Bin 125365 -> 0 bytes
lib/tcpdf/fonts/dejavusansmonoi.ctg.z | Bin 4675 -> 0 bytes
lib/tcpdf/fonts/dejavusansmonoi.php | 160 -
lib/tcpdf/fonts/dejavusansmonoi.z | Bin 127172 -> 0 bytes
lib/tcpdf/fonts/dejavuserif.ctg.z | Bin 5499 -> 0 bytes
lib/tcpdf/fonts/dejavuserif.php | 189 -
lib/tcpdf/fonts/dejavuserif.z | Bin 164620 -> 0 bytes
lib/tcpdf/fonts/dejavuserifb.ctg.z | Bin 5230 -> 0 bytes
lib/tcpdf/fonts/dejavuserifb.php | 180 -
lib/tcpdf/fonts/dejavuserifb.z | Bin 148570 -> 0 bytes
lib/tcpdf/fonts/dejavuserifbi.ctg.z | Bin 5237 -> 0 bytes
lib/tcpdf/fonts/dejavuserifbi.php | 180 -
lib/tcpdf/fonts/dejavuserifbi.z | Bin 145186 -> 0 bytes
lib/tcpdf/fonts/dejavuserifcondensed.ctg.z | Bin 5499 -> 0 bytes
lib/tcpdf/fonts/dejavuserifcondensed.php | 189 -
lib/tcpdf/fonts/dejavuserifcondensed.z | Bin 144262 -> 0 bytes
lib/tcpdf/fonts/dejavuserifcondensedb.ctg.z | Bin 5230 -> 0 bytes
lib/tcpdf/fonts/dejavuserifcondensedb.php | 180 -
lib/tcpdf/fonts/dejavuserifcondensedb.z | Bin 133065 -> 0 bytes
lib/tcpdf/fonts/dejavuserifcondensedbi.ctg.z | Bin 5237 -> 0 bytes
lib/tcpdf/fonts/dejavuserifcondensedbi.php | 180 -
lib/tcpdf/fonts/dejavuserifcondensedbi.z | Bin 146449 -> 0 bytes
lib/tcpdf/fonts/dejavuserifcondensedi.ctg.z | Bin 5466 -> 0 bytes
lib/tcpdf/fonts/dejavuserifcondensedi.php | 188 -
lib/tcpdf/fonts/dejavuserifcondensedi.z | Bin 149250 -> 0 bytes
lib/tcpdf/fonts/dejavuserifi.ctg.z | Bin 5466 -> 0 bytes
lib/tcpdf/fonts/dejavuserifi.php | 188 -
lib/tcpdf/fonts/dejavuserifi.z | Bin 147838 -> 0 bytes
lib/tcpdf/fonts/freefont-20060126/README | 142 -
.../AUTHORS | 15 +-
.../COPYING | 0
.../CREDITS | 17 +-
.../ChangeLog | 382 +-
.../INSTALL | 59 +-
lib/tcpdf/fonts/freefont-20080323/README | 149 +
lib/tcpdf/fonts/freemono.ctg.z | Bin 5015 -> 5246 bytes
lib/tcpdf/fonts/freemono.php | 441 +-
lib/tcpdf/fonts/freemono.z | Bin 122679 -> 114084 bytes
lib/tcpdf/fonts/freemonob.ctg.z | Bin 2991 -> 3109 bytes
lib/tcpdf/fonts/freemonob.php | 259 +-
lib/tcpdf/fonts/freemonob.z | Bin 75439 -> 68986 bytes
lib/tcpdf/fonts/freemonobi.ctg.z | Bin 2002 -> 2092 bytes
lib/tcpdf/fonts/freemonobi.php | 170 +-
lib/tcpdf/fonts/freemonobi.z | Bin 70716 -> 63585 bytes
lib/tcpdf/fonts/freemonoi.ctg.z | Bin 3320 -> 3470 bytes
lib/tcpdf/fonts/freemonoi.php | 295 +-
lib/tcpdf/fonts/freemonoi.z | Bin 108815 -> 98060 bytes
lib/tcpdf/fonts/freesans.ctg.z | Bin 5485 -> 5922 bytes
lib/tcpdf/fonts/freesans.php | 478 +-
lib/tcpdf/fonts/freesans.z | Bin 296475 -> 477760 bytes
lib/tcpdf/fonts/freesansb.ctg.z | Bin 3497 -> 3613 bytes
lib/tcpdf/fonts/freesansb.php | 298 +-
lib/tcpdf/fonts/freesansb.z | Bin 85403 -> 84806 bytes
lib/tcpdf/fonts/freesansbi.ctg.z | Bin 2632 -> 2750 bytes
lib/tcpdf/fonts/freesansbi.php | 229 +-
lib/tcpdf/fonts/freesansbi.z | Bin 63094 -> 64813 bytes
lib/tcpdf/fonts/freesansi.ctg.z | Bin 2909 -> 3012 bytes
lib/tcpdf/fonts/freesansi.php | 252 +-
lib/tcpdf/fonts/freesansi.z | Bin 163535 -> 144971 bytes
lib/tcpdf/fonts/freeserif.ctg.z | Bin 7842 -> 8178 bytes
lib/tcpdf/fonts/freeserif.php | 667 +-
lib/tcpdf/fonts/freeserif.z | Bin 606181 -> 1031592 bytes
lib/tcpdf/fonts/freeserifb.ctg.z | Bin 4557 -> 4692 bytes
lib/tcpdf/fonts/freeserifb.php | 394 +-
lib/tcpdf/fonts/freeserifb.z | Bin 146460 -> 222822 bytes
lib/tcpdf/fonts/freeserifbi.ctg.z | Bin 3160 -> 3290 bytes
lib/tcpdf/fonts/freeserifbi.php | 277 +-
lib/tcpdf/fonts/freeserifbi.z | Bin 91038 -> 141109 bytes
lib/tcpdf/fonts/freeserifi.ctg.z | Bin 3441 -> 3607 bytes
lib/tcpdf/fonts/freeserifi.php | 300 +-
lib/tcpdf/fonts/freeserifi.z | Bin 214494 -> 318049 bytes
lib/tcpdf/fonts/helvetica.php | 32 +-
lib/tcpdf/fonts/helveticab.php | 32 +-
lib/tcpdf/fonts/helveticabi.php | 32 +-
lib/tcpdf/fonts/helveticai.php | 32 +-
lib/tcpdf/fonts/hysmyeongjostdmedium.php | 45 -
lib/tcpdf/fonts/kozgopromedium.php | 62 -
lib/tcpdf/fonts/kozminproregular.php | 60 -
lib/tcpdf/fonts/msungstdlight.php | 37 -
lib/tcpdf/fonts/stsongstdlight.php | 38 -
lib/tcpdf/fonts/symbol.php | 33 +-
lib/tcpdf/fonts/times.php | 32 +-
lib/tcpdf/fonts/timesb.php | 32 +-
lib/tcpdf/fonts/timesbi.php | 32 +-
lib/tcpdf/fonts/timesi.php | 32 +-
lib/tcpdf/fonts/utils/README.TXT | 80 -
lib/tcpdf/fonts/utils/enc/cp1250.map | 251 -
lib/tcpdf/fonts/utils/enc/cp1251.map | 255 -
lib/tcpdf/fonts/utils/enc/cp1252.map | 251 -
lib/tcpdf/fonts/utils/enc/cp1253.map | 239 -
lib/tcpdf/fonts/utils/enc/cp1254.map | 249 -
lib/tcpdf/fonts/utils/enc/cp1255.map | 233 -
lib/tcpdf/fonts/utils/enc/cp1257.map | 244 -
lib/tcpdf/fonts/utils/enc/cp1258.map | 247 -
lib/tcpdf/fonts/utils/enc/cp874.map | 225 -
lib/tcpdf/fonts/utils/enc/iso-8859-1.map | 256 -
lib/tcpdf/fonts/utils/enc/iso-8859-11.map | 248 -
lib/tcpdf/fonts/utils/enc/iso-8859-15.map | 256 -
lib/tcpdf/fonts/utils/enc/iso-8859-16.map | 256 -
lib/tcpdf/fonts/utils/enc/iso-8859-2.map | 256 -
lib/tcpdf/fonts/utils/enc/iso-8859-4.map | 256 -
lib/tcpdf/fonts/utils/enc/iso-8859-5.map | 256 -
lib/tcpdf/fonts/utils/enc/iso-8859-7.map | 250 -
lib/tcpdf/fonts/utils/enc/iso-8859-9.map | 256 -
lib/tcpdf/fonts/utils/enc/koi8-r.map | 256 -
lib/tcpdf/fonts/utils/enc/koi8-u.map | 256 -
lib/tcpdf/fonts/utils/makefont.php | 564 -
lib/tcpdf/fonts/utils/pfm2afm.exe | Bin 22891 -> 0 bytes
lib/tcpdf/fonts/utils/src/pfm2afm-src.zip | Bin 9321 -> 0 bytes
lib/tcpdf/fonts/utils/src/ttf2ufm-src.zip | Bin 741674 -> 0 bytes
lib/tcpdf/fonts/utils/ttf2ufm.exe | Bin 258048 -> 0 bytes
lib/tcpdf/fonts/zapfdingbats.php | 33 +-
lib/tcpdf/htmlcolors.php | 411 +-
lib/tcpdf/images/_blank.png | Bin 95 -> 0 bytes
lib/tcpdf/images/bug.eps | 1809 -
lib/tcpdf/images/image_demo.jpg | Bin 566434 -> 0 bytes
lib/tcpdf/images/logo_example.gif | Bin 21022 -> 0 bytes
lib/tcpdf/images/logo_example.jpg | Bin 32732 -> 0 bytes
lib/tcpdf/images/logo_example.png | Bin 17787 -> 0 bytes
lib/tcpdf/images/pelican.ai | 147 -
lib/tcpdf/images/tcpdf_logo.jpg | Bin 17633 -> 0 bytes
lib/tcpdf/images/tiger.ai | 3599 --
lib/tcpdf/tcpdf.pem | 36 +
lib/tcpdf/tcpdf.php | 23178 ++++++----
lib/tcpdf/unicode_data.php | 36663 ++++++++--------
lib/thirdpartylibs.xml | 2 +-
185 files changed, 39302 insertions(+), 49326 deletions(-)
create mode 100644 lib/tcpdf/2dbarcodes.php
delete mode 100755 lib/tcpdf/config/lang/eng.php
delete mode 100644 lib/tcpdf/config/tcpdf_config_alt.php
create mode 100644 lib/tcpdf/fonts/README-MOODLE.TXT
delete mode 100644 lib/tcpdf/fonts/almohanad.ctg.z
delete mode 100644 lib/tcpdf/fonts/almohanad.php
delete mode 100644 lib/tcpdf/fonts/almohanad.z
delete mode 100644 lib/tcpdf/fonts/courierb.php
delete mode 100644 lib/tcpdf/fonts/courierbi.php
delete mode 100644 lib/tcpdf/fonts/courieri.php
delete mode 100644 lib/tcpdf/fonts/dejavu-fonts-ttf-2.25/AUTHORS
delete mode 100644 lib/tcpdf/fonts/dejavu-fonts-ttf-2.25/BUGS
delete mode 100644 lib/tcpdf/fonts/dejavu-fonts-ttf-2.25/LICENSE
delete mode 100644 lib/tcpdf/fonts/dejavu-fonts-ttf-2.25/NEWS
delete mode 100644 lib/tcpdf/fonts/dejavu-fonts-ttf-2.25/README
delete mode 100644 lib/tcpdf/fonts/dejavu-fonts-ttf-2.25/langcover.txt
delete mode 100644 lib/tcpdf/fonts/dejavu-fonts-ttf-2.25/unicover.txt
delete mode 100644 lib/tcpdf/fonts/dejavusans-extralight.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavusans-extralight.php
delete mode 100644 lib/tcpdf/fonts/dejavusans-extralight.z
delete mode 100644 lib/tcpdf/fonts/dejavusans.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavusans.php
delete mode 100644 lib/tcpdf/fonts/dejavusans.z
delete mode 100644 lib/tcpdf/fonts/dejavusansb.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavusansb.php
delete mode 100644 lib/tcpdf/fonts/dejavusansb.z
delete mode 100644 lib/tcpdf/fonts/dejavusansbi.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavusansbi.php
delete mode 100644 lib/tcpdf/fonts/dejavusansbi.z
delete mode 100644 lib/tcpdf/fonts/dejavusanscondensed.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavusanscondensed.php
delete mode 100644 lib/tcpdf/fonts/dejavusanscondensed.z
delete mode 100644 lib/tcpdf/fonts/dejavusanscondensedb.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavusanscondensedb.php
delete mode 100644 lib/tcpdf/fonts/dejavusanscondensedb.z
delete mode 100644 lib/tcpdf/fonts/dejavusanscondensedbi.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavusanscondensedbi.php
delete mode 100644 lib/tcpdf/fonts/dejavusanscondensedbi.z
delete mode 100644 lib/tcpdf/fonts/dejavusanscondensedi.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavusanscondensedi.php
delete mode 100644 lib/tcpdf/fonts/dejavusanscondensedi.z
delete mode 100644 lib/tcpdf/fonts/dejavusansi.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavusansi.php
delete mode 100644 lib/tcpdf/fonts/dejavusansi.z
delete mode 100644 lib/tcpdf/fonts/dejavusansmono.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavusansmono.php
delete mode 100644 lib/tcpdf/fonts/dejavusansmono.z
delete mode 100644 lib/tcpdf/fonts/dejavusansmonob.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavusansmonob.php
delete mode 100644 lib/tcpdf/fonts/dejavusansmonob.z
delete mode 100644 lib/tcpdf/fonts/dejavusansmonobi.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavusansmonobi.php
delete mode 100644 lib/tcpdf/fonts/dejavusansmonobi.z
delete mode 100644 lib/tcpdf/fonts/dejavusansmonoi.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavusansmonoi.php
delete mode 100644 lib/tcpdf/fonts/dejavusansmonoi.z
delete mode 100644 lib/tcpdf/fonts/dejavuserif.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavuserif.php
delete mode 100644 lib/tcpdf/fonts/dejavuserif.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifb.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifb.php
delete mode 100644 lib/tcpdf/fonts/dejavuserifb.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifbi.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifbi.php
delete mode 100644 lib/tcpdf/fonts/dejavuserifbi.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifcondensed.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifcondensed.php
delete mode 100644 lib/tcpdf/fonts/dejavuserifcondensed.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifcondensedb.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifcondensedb.php
delete mode 100644 lib/tcpdf/fonts/dejavuserifcondensedb.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifcondensedbi.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifcondensedbi.php
delete mode 100644 lib/tcpdf/fonts/dejavuserifcondensedbi.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifcondensedi.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifcondensedi.php
delete mode 100644 lib/tcpdf/fonts/dejavuserifcondensedi.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifi.ctg.z
delete mode 100644 lib/tcpdf/fonts/dejavuserifi.php
delete mode 100644 lib/tcpdf/fonts/dejavuserifi.z
delete mode 100644 lib/tcpdf/fonts/freefont-20060126/README
rename lib/tcpdf/fonts/{freefont-20060126 => freefont-20080323}/AUTHORS (90%)
rename lib/tcpdf/fonts/{freefont-20060126 => freefont-20080323}/COPYING (100%)
rename lib/tcpdf/fonts/{freefont-20060126 => freefont-20080323}/CREDITS (97%)
rename lib/tcpdf/fonts/{freefont-20060126 => freefont-20080323}/ChangeLog (80%)
rename lib/tcpdf/fonts/{freefont-20060126 => freefont-20080323}/INSTALL (57%)
create mode 100644 lib/tcpdf/fonts/freefont-20080323/README
delete mode 100644 lib/tcpdf/fonts/hysmyeongjostdmedium.php
delete mode 100644 lib/tcpdf/fonts/kozgopromedium.php
delete mode 100644 lib/tcpdf/fonts/kozminproregular.php
delete mode 100644 lib/tcpdf/fonts/msungstdlight.php
delete mode 100644 lib/tcpdf/fonts/stsongstdlight.php
delete mode 100644 lib/tcpdf/fonts/utils/README.TXT
delete mode 100644 lib/tcpdf/fonts/utils/enc/cp1250.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/cp1251.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/cp1252.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/cp1253.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/cp1254.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/cp1255.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/cp1257.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/cp1258.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/cp874.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/iso-8859-1.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/iso-8859-11.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/iso-8859-15.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/iso-8859-16.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/iso-8859-2.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/iso-8859-4.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/iso-8859-5.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/iso-8859-7.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/iso-8859-9.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/koi8-r.map
delete mode 100644 lib/tcpdf/fonts/utils/enc/koi8-u.map
delete mode 100644 lib/tcpdf/fonts/utils/makefont.php
delete mode 100644 lib/tcpdf/fonts/utils/pfm2afm.exe
delete mode 100644 lib/tcpdf/fonts/utils/src/pfm2afm-src.zip
delete mode 100644 lib/tcpdf/fonts/utils/src/ttf2ufm-src.zip
delete mode 100644 lib/tcpdf/fonts/utils/ttf2ufm.exe
delete mode 100755 lib/tcpdf/images/_blank.png
delete mode 100644 lib/tcpdf/images/bug.eps
delete mode 100644 lib/tcpdf/images/image_demo.jpg
delete mode 100644 lib/tcpdf/images/logo_example.gif
delete mode 100644 lib/tcpdf/images/logo_example.jpg
delete mode 100755 lib/tcpdf/images/logo_example.png
delete mode 100644 lib/tcpdf/images/pelican.ai
delete mode 100644 lib/tcpdf/images/tcpdf_logo.jpg
delete mode 100644 lib/tcpdf/images/tiger.ai
create mode 100644 lib/tcpdf/tcpdf.pem
diff --git a/lib/pdflib.php b/lib/pdflib.php
index 4450893319..708afe9729 100644
--- a/lib/pdflib.php
+++ b/lib/pdflib.php
@@ -17,18 +17,18 @@
/**
* pdflib.php - Moodle PDF library
- *
+ *
* We currently use the TCPDF library by Nicola Asuni.
*
* The default location for fonts that are included with TCPDF is
- * lib/tcpdf/fonts/. If $CFG->datadir.'/fonts/' exists, this directory
+ * lib/tcpdf/fonts/. If PDF_CUSTOM_FONT_PATH exists, this directory
* will be used instead of lib/tcpdf/fonts/. If there is only one font
- * present in $CFG->datadir.'/fonts/', the font is used as the default
+ * present in PDF_CUSTOM_FONT_PATH, the font is used as the default
* font.
- *
+ *
* See lib/tcpdf/fonts/README for details on how to convert fonts for use
* with TCPDF.
- *
+ *
* Example usage:
*
* $doc = new pdf;
@@ -39,46 +39,72 @@
* $doc->Output();
*
*
- * @package moodlecore
- * @copyright Vy-Shane Sin Fat
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @package moodlecore
+ * @copyright Vy-Shane Sin Fat
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
+defined('MOODLE_INTERNAL') || die();
+/** defines the site-specific location of fonts */
+define('PDF_CUSTOM_FONT_PATH', $CFG->dataroot.'/fonts/');
-/** Includes */
-require_once(dirname(__FILE__).'/tcpdf/tcpdf.php');
+/** default font to be used if there are more of them available */
+define('PDF_DEFAULT_FONT', 'FreeSerif');
+/** tell tcpdf it is configured here instead of in its own config file */
+define('K_TCPDF_EXTERNAL_CONFIG', 1);
+// The configuration constants needed by tcpdf follow
-/// Constants
-define('PDF_CUSTOM_FONT_PATH', $CFG->dataroot.'/fonts/');
-define('PDF_DEFAULT_FONT', 'DejaVuSerif');
+/** tcpdf installation path */
+define('K_PATH_MAIN', $CFG->dirroot.'/lib/tcpdf/');
+
+/** URL path to tcpdf installation folder */
+define('K_PATH_URL', $CFG->wwwroot . '/lib/tcpdf/');
+
+/** path for PDF fonts */
+define('K_PATH_FONTS', K_PATH_MAIN . 'fonts/');
+
+/** cache directory for temporary files (full path) */
+define('K_PATH_CACHE', $CFG->dataroot . '/cache/');
+
+/** images directory */
+define('K_PATH_IMAGES', $CFG->dirroot . '/');
+
+/** blank image */
+define('K_BLANK_IMAGE', K_PATH_IMAGES . '/pix/spacer.gif');
+
+/** height of cell repect font height */
+define('K_CELL_HEIGHT_RATIO', 1.25);
+/** reduction factor for small font */
+define('K_SMALL_RATIO', 2/3);
+require_once(dirname(__FILE__).'/tcpdf/tcpdf.php');
/**
* Wrapper class that extends TCPDF (lib/tcpdf/tcpdf.php).
* Moodle customisations are done here.
*
- * @package moodlecore
- * @copyright Vy-Shane Sin Fat
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @package moodlecore
+ * @copyright Vy-Shane Sin Fat
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class pdf extends TCPDF {
-
+
/**
* Class constructor
- *
+ *
* See the parent class documentation for the parameters info.
*/
public function __construct($orientation='P', $unit='mm', $format='A4', $unicode=true, $encoding='UTF-8') {
-
+
parent::__construct($orientation, $unit, $format, $unicode, $encoding);
-
+
if (is_dir(PDF_CUSTOM_FONT_PATH)) {
$fontfiles = $this->_getfontfiles(PDF_CUSTOM_FONT_PATH);
-
+
if (count($fontfiles) == 1) {
$autofontname = substr($fontfile[0], 0, -4);
$this->AddFont($autofontname, '', $autofontname.'.php');
@@ -89,9 +115,14 @@ class pdf extends TCPDF {
} else {
$this->SetFont(PDF_DEFAULT_FONT);
}
+
+ // theses replace the tcpdf's config/lang/ definitions
+ $this->l['w_page'] = get_string('page');
+ $this->l['a_meta_language'] = current_language();
+ $this->l['a_meta_charset'] = 'UTF-8';
+ $this->l['a_meta_dir'] = get_string('thisdirection');
}
-
-
+
/**
* Return fonts path
* Overriding TCPDF::_getfontpath()
@@ -100,24 +131,23 @@ class pdf extends TCPDF {
*/
protected function _getfontpath() {
global $CFG;
-
+
if (is_dir(PDF_CUSTOM_FONT_PATH)
&& count($this->_getfontfiles(PDF_CUSTOM_FONT_PATH)) > 0) {
$fontpath = PDF_CUSTOM_FONT_PATH;
} else {
- $fontpath = $CFG->dirroot.'/lib/tcpdf/fonts/';
+ $fontpath = K_PATH_FONTS;
}
return $fontpath;
}
-
-
+
/**
* Get the .php files for the fonts
*/
protected function _getfontfiles($fontdir) {
$dirlist = get_directory_list($fontdir);
$fontfiles = array();
-
+
foreach ($dirlist as $file) {
if (substr($file, -4) == '.php') {
array_push($fontfiles, $file);
@@ -125,9 +155,5 @@ class pdf extends TCPDF {
}
return $fontfiles;
}
-
-
-} // End class pdf
-
-?>
+}
diff --git a/lib/tcpdf/2dbarcodes.php b/lib/tcpdf/2dbarcodes.php
new file mode 100644
index 0000000000..13e5fcbcd0
--- /dev/null
+++ b/lib/tcpdf/2dbarcodes.php
@@ -0,0 +1,126 @@
+.
+//
+// See LICENSE.TXT file for more information.
+// ----------------------------------------------------------------------------
+//
+// Description : PHP class to creates array representations for
+// 2D barcodes to be used with TCPDF.
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+// Nicola Asuni
+// Tecnick.com S.r.l.
+// Via della Pace, 11
+// 09044 Quartucciu (CA)
+// ITALY
+// www.tecnick.com
+// info@tecnick.com
+//============================================================+
+
+/**
+ * PHP class to creates array representations for 2D barcodes to be used with TCPDF.
+ * @package com.tecnick.tcpdf
+ * @abstract Functions for generating string representation of 2D barcodes.
+ * @author Nicola Asuni
+ * @copyright 2008-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
+ * @link http://www.tcpdf.org
+ * @license http://www.gnu.org/copyleft/lesser.html LGPL
+ * @version 1.0.000
+ */
+
+ /**
+ * PHP class to creates array representations for 2D barcodes to be used with TCPDF (http://www.tcpdf.org).
+ * @name TCPDFBarcode
+ * @package com.tecnick.tcpdf
+ * @version 1.0.000
+ * @author Nicola Asuni
+ * @link http://www.tcpdf.org
+ * @license http://www.gnu.org/copyleft/lesser.html LGPL
+ */
+class TCPDF2DBarcode {
+
+ /**
+ * @var array representation of barcode.
+ * @access protected
+ */
+ protected $barcode_array;
+
+ /**
+ * This is the class constructor.
+ * Return an array representations for 2D barcodes:
+ * - $arrcode['code'] code to be printed on text label
+ * - $arrcode['num_rows'] required number of rows
+ * - $arrcode['num_cols'] required number of columns
+ * - $arrcode['bcode'][$r][$c] value of the cell is $r row and $c column (0 = transparent, 1 = black)
+ * @param string $code code to print
+ * @param string $type type of barcode:
+ */
+ public function __construct($code, $type) {
+ $this->setBarcode($code, $type);
+ }
+
+ /**
+ * Return an array representations of barcode.
+ * @return array
+ */
+ public function getBarcodeArray() {
+ return $this->barcode_array;
+ }
+
+ /**
+ * Set the barcode.
+ * @param string $code code to print
+ * @param string $type type of barcode:
+ * @return array
+ */
+ public function setBarcode($code, $type) {
+ $mode = explode(',', $type);
+ switch (strtoupper($mode[0])) {
+ case 'TEST': { // TEST MODE
+ $this->barcode_array['num_rows'] = 5;
+ $this->barcode_array['num_cols'] = 15;
+ $this->barcode_array['bcode'] = array(
+ array(1,1,1,0,1,1,1,0,1,1,1,0,1,1,1),
+ array(0,1,0,0,1,0,0,0,1,0,0,0,0,1,0),
+ array(0,1,0,0,1,1,0,0,1,1,1,0,0,1,0),
+ array(0,1,0,0,1,0,0,0,0,0,1,0,0,1,0),
+ array(0,1,0,0,1,1,1,0,1,1,1,0,0,1,0)
+ );
+ break;
+ }
+
+ // ... Add here real 2D barcodes ...
+
+ default: {
+ $this->barcode_array = false;
+ }
+ }
+ }
+} // end of class
+
+//============================================================+
+// END OF FILE
+//============================================================+
+?>
diff --git a/lib/tcpdf/CHANGELOG.TXT b/lib/tcpdf/CHANGELOG.TXT
index 47c682c16e..61d8fe0eef 100644
--- a/lib/tcpdf/CHANGELOG.TXT
+++ b/lib/tcpdf/CHANGELOG.TXT
@@ -1,488 +1,1036 @@
-4.0.015 (2008-07-29)
- - Some functions were changed to support different page formats (see example_028.php).
- - The signature of setPage() function is changed.
-
-4.0.014 (2008-07-29)
- - K_PATH_MAIN calculation on tcpdf_config.php was fixed.
- - HTML support for EPS/AI images was added (see example_006.php).
- - Bugs item #2030807 "Truncated text on multipage html fields" was fixed.
- - PDF header bug was fixed.
- - helvetica was added as default font family.
- - Stroke mode was fixed on Text function.
- - several minor bugs were fixed.
-
-4.0.013 (2008-07-27)
- - Bugs item #2027799 " Big spaces between lines after page break" was fixed.
- - K_PATH_MAIN calculation on tcpdf_config.php was changed.
- - Function setVisibility() was fixed to avoid the "Incorrect PDEObject type" error message.
-
-4.0.012 (2008-07-24)
- - Addpage(), Header() and Footer() functions were changed to simplify the implementation of external header/footer functions.
- - The following functions were added:
- setHeader()
- setFooter()
- getImageRBX()
- getImageRBY()
- getCellHeightRatio()
- getHeaderFont()
- getFooterFont()
- getRTL()
- getBarcode()
- getHeaderData()
- getHeaderMargin()
- getFooterMargin()
-
-4.0.011 (2008-07-23)
- - Font support was improved.
- - The folder /fonts/utils contains new utilities and instructions for embedd font files.
- - Documentation was updated.
-
-4.0.010 (2008-07-22)
- - HTML tables were fixed to work across pages.
- - Header() and Footer() functions were updated to preserve previous settings.
- - example_035.php was added.
-
-4.0.009 (2008-07-21)
- - UTF8StringToArray() function was fixed for non-unicode mode.
-
-4.0.008 (2008-07-21)
- - Barcodes alignment was fixed (see example_027.php).
- - unicode_data.php was updated.
- - Arabic shaping for "Zero-Width Non-Joiner" character (U+200C) was fixed.
-
-4.0.007 (2008-07-18)
- - str_split was replaced by preg_split for compatibility with PHP4 version.
- - Clipping mode was added to all graphic functions by using parameter $style = "CNZ" or "CEO" (see example_034.php).
-
-4.0.006 (2008-07-16)
- - HTML rowspan bug was fixed.
- - Line style for MultiCell() was fixed.
- - WriteHTML() function was improved.
- - CODE128C barcode was fixed (barcodes.php).
-
-4.0.005 (2008-07-11)
- - Bug [2015715] "PHP Error/Warning" was fixed.
-
-4.0.004 (2008-07-09)
- - HTML cell internal padding was fixed.
-
-4.0.003 (2008-07-08)
- - Removed URL encoding when F option is selected on Output() function.
- - fixed some minor bugs in html tables.
-
-4.0.002 (2008-07-07)
- - Bug [2000861] was still unfixed and has been fixed.
-
-4.0.001 (2008-07-05)
- - Bug [2000861] was fixed.
-
-4.0.000 (2008-07-03)
- - THIS IS A MAIN RELEASE THAT INCLUDES SEVERAL NEW FEATURES AND BUGFIXES
- - Signature fo SetTextColor() and SetFillColor() functions was changed (parameter $storeprev was removed).
- - HTML support was completely rewritten and improved (see example 6).
- - Alignments parameters were fixed.
- - Functions GetArrStringWidth() and GetStringWidth() now include font parameters.
- - Fonts support was improved.
- - All core fonts were replaced and moved to fonts/ directory.
- - The following functions were added: getMargins(), getFontSize(), getFontSizePt().
- - File config/tcpdf_config_old.php was renamed tcpdf_config_alt.php and updated.
- - Multicell and WriteHTMLCell fill function was fixed.
- - Several minor bugs were fixed.
- - barcodes.php was updated.
+4.6.020 (2009-07-16)
+ - Bug item #2821921 "issue in example 18" was fixed.
+ - Signature of SetRTL() method was changed.
+
+4.6.019 (2009-07-13)
+ - Bug item #2820703 "xref table broken" was fixed.
+
+4.6.018 (2009-07-10)
+ - Bug item #2819319 "Text over text" was fixed.
+ - Method Arrow() was added to print graphic arrows (example 12 was updated).
+
+4.6.017 (2009-07-05)
+ - Bug item #2816079 "Example 48 not working" was fixed.
+ - The signature of the checkPageBreak() was changed. The parameter $addpage was added to turn off the automatic page creation.
+
+4.6.016 (2009-06-16)
+ - Method setSpacesRE() was added to set the regular expression used for detecting withespaces or word separators. If you are using chinese, try: setSpacesRE('/[\s\p{Z}\p{Lo}]/');, otherwise you can use setSpacesRE('/[\s\p{Z}]/');
+ - The method _putinfo() now automatically fills the metadata with '?' in case of empty string.
+
+4.6.015 (2009-06-11)
+ - Bug #2804667 "word wrap bug" was fixed.
+
+4.6.014 (2009-06-04)
+ - Bug #2800931 "Table thead tag bug" was fixed.
+ - A bug related to tag was fixed.
+
+4.6.013 (2009-05-28)
+ - List bullets position was fixed for RTL languages.
+
+4.6.012 (2009-05-23)
+ - setUserRights() method doesn't work anymore unless you call the setSignature() method with the Adobe private key!
+
+4.6.011 (2009-05-18)
+ - Signature of the Image() method was changed to include the new $fitbox parameter (see source code documentation).
+
+4.6.010 (2009-05-17)
+ - Image() method was improved: now is possible to specify the maximum dimensions for a constraint box defined by $w and $h parameters, and setting the $resize parameter to null.
+ - tag indent problem was fixed.
+ - $y parameter was added to checkPageBreak() method.
+ - Bug n. 2791773 "writeHTML" was fixed.
+
+4.6.009 (2009-05-13)
+ - xref table for embedded files was fixed.
+
+4.6.008 (2009-05-07)
+ - setSignature() method was improved (but is still experimental).
+ - Example n. 52 was added.
+
+4.6.007 (2009-05-05)
+ - Bug #2786685 "writeHtmlCell and
in custom footer" was fixed.
+ - Table header repeating bug was fixed.
+ - Some newlines and tabs are now automatically removed from HTML strings.
+
+4.6.006 (2009-04-28)
+ - Support for "..." was added.
+ - By default TCPDF requires PCRE Unicode support turned on but now works also without it (with limited ability to detect some Unicode blank spaces).
+
+4.6.005 (2009-04-25)
+ - Points (pt) conversion in getHTMLUnitToUnits() was fixed.
+ - Default tcpdf.pem certificate file was added.
+ - Experimental support for signing document was added but it is not yet completed (some help is needed - I think that the calculation of the ByteRange is OK and the problem is on the signature calculation).
+
+4.6.004 (2009-04-23)
+ - Method deletePage() was added to delete pages (see example n. 44).
+
+4.6.003 (2009-04-21)
+ - The caching mechanism of the UTF8StringToArray() method was fixed.
+
+4.6.002 (2009-04-20)
+ - Documentation of rollbackTransaction() method was fixed.
+ - The setImageScale() and getImageScale() methods now set and get the adjusting parameter used by pixelsToUnits() method.
+ - HTML images now support other units of measure than pixels (getHTMLUnitToUnits() is now used instead of pixelsToUnits()).
+ - WARNING: PDF_IMAGE_SCALE_RATIO has been changed by default to 1.
+
+4.6.001 (2009-04-17)
+ - Spaces between HTML block tags are now automatically removed.
+ - The bug related to cMargin changes between tables was fixed.
+
+4.6.000 (2009-04-16)
+ - WARNING: THIS VERSION CHANGES THE BEHAVIOUR OF $x and $y parameters for several TCPDF methods:
+ zero coordinates for $x and $y are now valid coordinates;
+ set $x and $y as empty strings to get the current value.
+ - Some error caused by 'empty' funtion were fixed.
+ - Default color for convertHTMLColorToDec() method was changed to white and the return value for invalid color is false.
+ - HTML on footer bug was fixed.
+ - The following examples were fixed: 5,7,10,17,19,20,21,33,42,43.
+
+4.5.043 (2009-04-15)
+ - Barcode class (barcode.php) was extended to include new linear barcode types (see example n. 27):
+ C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9
+ C39+ : CODE 39 with checksum
+ C39E : CODE 39 EXTENDED
+ C39E+ : CODE 39 EXTENDED + CHECKSUM
+ C93 : CODE 93 - USS-93
+ S25 : Standard 2 of 5
+ S25+ : Standard 2 of 5 + CHECKSUM
+ I25 : Interleaved 2 of 5
+ I25+ : Interleaved 2 of 5 + CHECKSUM
+ C128A : CODE 128 A
+ C128B : CODE 128 B
+ C128C : CODE 128 C
+ EAN2 : 2-Digits UPC-Based Extention
+ EAN5 : 5-Digits UPC-Based Extention
+ EAN8 : EAN 8
+ EAN13 : EAN 13
+ UPCA : UPC-A
+ UPCE : UPC-E
+ MSI : MSI (Variation of Plessey code)
+ MSI+ : MSI + CHECKSUM (modulo 11)
+ POSTNET : POSTNET
+ PLANET : PLANET
+ RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)
+ KIX : KIX (Klant index - Customer index)
+ IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200 (NOTE: requires BCMath PHP extension)
+ CODABAR : CODABAR
+ CODE11 : CODE 11
+ PHARMA : PHARMACODE
+ PHARMA2T : PHARMACODE TWO-TRACKS
+
+4.5.042 (2009-04-15)
+ - Method Write() was fixed for the strings containing only zero value.
+
+4.5.041 (2009-04-14)
+ - Barcode methods were fixed.
+
+4.5.040 (2009-04-14)
+ - Method Write() was fixed to handle empty strings.
+
+4.5.039 (2009-04-11)
+ - Support for linear barcodes was extended (see example n. 27 and barcodes.php documentation).
+
+4.5.038 (2009-04-10)
+ - Write() method was improved to support separators for Japanese, Korean, Chinese Traditional and Chinese Simplified.
+
+4.5.037 (2009-04-09)
+ - General performances were improved.
+ - The signature of the method utf8Bidi() was changed.
+ - The method UniArrSubString() was added.
+ - Experimental support for 2D barcodes were added (see example n. 50 and 2dbarcodes.php class).
+
+4.5.036 (2009-04-03)
+ - TCPDF methods can be called inside the HTML code (see example n. 49).
+ - All tag attributes, such as must be enclosed within double quotes.
+
+4.5.035 (2009-03-28)
+ - Bug #2717436 "writeHTML rowspan problem (continued)" was fixed.
+ - Bug #2719090 "writeHTML fix follow up" was fixed.
+ - The method _putuserrights() was changed to avoid Adobe Reader 9.1 crash. This broken the 'trick' that was used to display forms in Acrobat Reader.
+
+4.5.034 (2009-03-27)
+ - Bug #2716914 "Bug writeHTML of a table in body and footer related with pb" was fixed.
+ - Bug #2717056 ] "writeHTML problem when setting tr style" was fixed.
+ - The signature of the Cell() method was changed.
+
+4.5.033 (2009-03-27)
+ - The support for rowspan/colspan on HTML tables was improved (see example n. 48).
+
+4.5.032 (2009-03-23)
+ - setPrintFooter(false) bug was fixed.
+
+4.5.031 (2009-03-20)
+ - Table header support was extended to multiple pages.
+
+4.5.030 (2009-03-20)
+ - thead tag is now supported on HTML tables (header rows are repeated after page breaks).
+ - The startTransaction() was improved to autocommit.
+ - List bullets now uses the foreground color (putHtmlListBullet()).
+
+4.5.029 (2009-03-19)
+ - The following methods were added to UNDO commands (see example 47): startTransaction(), commitTransaction(), rollbackTransaction().
+ - All examples were updated.
+
+4.5.028 (2009-03-18)
+ - Bug #2690945 "List Bugs" was fixed.
+ - HTML text alignment on lists was fixed.
+ - The constant PDF_FONT_MONOSPACED was added to the configuration file to define the default monospaced font.
+ - The following methods were fixed: getPageWidth(), getPageHeight(), getBreakMargin().
- All examples were updated.
+
+4.5.027 (2009-03-16)
+ - Method getPageDimensions() was added to get page dimensions.
+ - The signature of the following methos were changed: getPageWidth(), getPageHeight(), getBreakMargin().
+ - _parsepng() method was fixed for PNG URL images (fread bug).
+
+4.5.026 (2009-03-11)
+ - Bug #2681793 affecting URL images with spaces was fixed.
+
+4.5.025 (2009-03-10)
+ - A small bug affecting hyphenation support was fixed.
+ - The method SetDefaultMonospacedFont() was added to define the default monospaced font.
+
+4.5.024 (2009-03-07)
+ - The bug #2666493 was fixed "Footer corrupts document".
+
+4.5.023 (2009-03-06)
+ - The bug #2666688 was fixed "Rowspan in tables".
+
+4.5.022 (2009-03-05)
+ - The bug #2659676 was fixed "refer to #2157099 test 4 < BR > problem still not fixed".
+ - addTOC() function bug was fixed.
+
+4.5.020 (2009-03-03)
+ - The following bug was fixed: "function removeSHY corrupts unicode".
+
+4.5.019 (2009-02-28)
+ - The problem of decimal separator using different locale was fixed.
+ - The text hyphenation is now supported (see example n. 46).
+
+4.5.018 (2009-02-26)
+ - The _destroy() method was added to unset all class variables and frees memory.
+ - Now it's possible to call Output() method multiple times.
+
+4.5.017 (2009-02-24)
+ - A minor bug that raises a PHP warning was fixed.
+
+4.5.016 (2009-02-24)
+ - Bug item #2631200 "getNumLines() counts wrong" was fixed.
+ - Multiple attachments bug was fixed.
+ - All class variables are now cleared on Output() for memory otpimization.
-------------------------------------------------------------
+4.5.015 (2009-02-18)
+ - Bug item #2612553 "function Write() must not break a line on character" was fixed.
+
+4.5.014 (2009-02-13)
+ - Bug item #2595015 "POSTNET Barcode Checksum Error" was fixed (on barcode.php).
+ - Pagebreak bug for barcode was fixed.
+
+4.5.013 (2009-02-12)
+ - border attribute is now supported on HTML images (only accepts the same values accepted by Cell()).
+
+4.5.012 (2009-02-12)
+ - An error on image border feature was fixed.
+
+4.5.011 (2009-02-12)
+ - HTML links for images are now supported.
+ - height attribute is now supported on HTML cells.
+ - $border parameter was added to Image() and ImageEps() methods.
+ - The method getNumLines() was added to estimate the number of lines required for the specified text.
+
+4.5.010 (2009-01-29)
+ - Bug n. 2546108 "BarCode Y position" was fixed.
+
+4.5.009 (2009-01-26)
+ - Bug n. 2538094 "Empty pdf file created" was fixed.
+
+4.5.008 (2009-01-26)
+ - setPage() method was fixed to correctly restore graphic states.
+ - Source code was cleaned up for performances.
+
+4.5.007 (2009-01-24)
+ - checkPageBreak() and write1DBarcode() methods were fixed.
+ - Source code was cleaned up for performances.
+ - barcodes.php was updated.
+
+4.5.006 (2009-01-23)
+ - getHTMLUnitToPoints() method was replaced by getHTMLUnitToUnits() to fix HTML units bugs.
+
+4.5.005 (2009-01-23)
+ - Page closing bug was fixed.
+
+4.5.004 (2009-01-21)
+ - The access of convertHTMLColorToDec() method was changed to public
+ - Fixed bug on UL tag.
+
+4.5.003 (2009-01-19)
+ - Fonts on different folders are now supported.
-3.1.001 (2008-06-13)
- - Bug [1992515] "K_PATH_FONTS default value wrong" was fixed.
- - Vera font was removed, DejaVu font and Free fonts were updated.
- - Image handling was improved.
+4.5.002 (2009-01-07)
+ - addTOC() function was improved (see example n. 45).
+
+4.5.001 (2009-01-04)
+ - The signature of startPageGroup() function was changed.
+ - Method Footer() was improved to automatically print page or page-group number (see example n. 23).
+ - Protected method formatTOCPageNumber() was added to customize the format of page numbers on the Table Of Content.
+ - The signature of addTOC() was changed to include the font used for page numbers.
+
+4.5.000 (2009-01-03)
+ - A new $diskcache parameter was added to class constructor to enable disk caching and reduce RAM memory usage (see example n. 43).
+ - The method movePageTo() was added to move pages to previous positions (see example n. 44).
+ - The methods getAliasNumPage() and getPageNumGroupAlias() were added to get the alias for page number (needed when using movepageTo()).
+ - The methods addTOC() was added to print a Table Of Content (see example n. 45).
+ - Imagick class constant was removed for better compatibility with PHP4.
+ - All existing examples were updated and new examples were added.
+
+4.4.009 (2008-12-29)
+ - Examples 1 and 35 were fixed.
+
+4.4.008 (2008-12-28)
+ - Bug #2472169 "Unordered bullet size not adjusted for unit type" was fixed.
+
+4.4.007 (2008-12-23)
+ - Bug #2459935 "no unit conversion for header line" was fixed.
+ - Example n. 42 for image alpha channel was added.
- All examples were updated.
+
+4.4.006 (2008-12-11)
+ - Method setLIsymbol() was changed to reflect latest changes in HTML list handling.
+
+4.4.005 (2008-12-10)
+ - Bug item #2413870 "ordered list override value" was fixed.
+
+4.4.004 (2008-12-10)
+ - The protected method getHTMLUnitToPoints() was added to accept various HTML units of measure (em, ex, px, in, cm, mm, pt, pc, %).
+ - The method intToRoman() was added to convert integer number to Roman representation.
+ - Support fot HTML lists was improved: the CSS property list-style-type is now supported.
+
+4.4.003 (2008-12-09)
+ - Bug item #2412147 "Warning on line 3367" was fixed.
+ - Method setHtmlLinksStyle() was added to set default HTML link colors and font style.
+ - Method addHtmlLink() was changed to use color and style defined on the inline CSS.
-3.1.000 (2008-06-11)
- - setPDFVersion() was added to change the default PDF version (currently 1.7).
- - setViewerPreferences() was added to control the way the document is to be presented on the screen or printed (see example 29).
- - SetDisplayMode() signature was changed (new options were added).
- - LinearGradient(), RadialGradient(), CoonsPatchMesh() functions were added to print various color gradients (see example 30).
- - PieSector() function was added to render render pie charts (see example 31).
- - ImageEps() was added to display EPS and AI images with limited support (see example 32).
- - writeBarcode() function is now depracated, a new write1DBarcode() function was added. The barcode directory was removed and a new barcodes.php file was added.
- - The new write1DBarcode() function support more barcodes and do not need the GD library (see example 027). All barcodes are directly written to PDF using graphic functions.
- - HTML lists were improved and could be nested (you may now represent trees).
- - AddFont() bug was fixed.
- - _putfonts() bug was fixed.
- - graphics functions were fixed.
- - unicode_data.php file was updated (fixed).
- - almohanad font was updated.
- - example 18 was updated (Farsi and Arabic languages).
- - source code cleanup.
- - All examples were updated and new examples were added.
-
-3.0.015 (2008-06-06)
- - AddPage() function signature is changed to include page format.
- - example 28 was added to show page format changes.
- - setPageUnit() function was added to change the page units of measure.
- - setPageFormat() function was added to change the page format and orientation between pages.
- - setPageOrientation() function was added to change the page orientation.
- - Arabic font shaping was fixed for laa letter and square boxes (see the example 18).
-
-3.0.014 (2008-06-04)
- - Arabic font shaping was fixed.
- - setDefaultTableColumns() function was added.
- - $cell_height_ratio variable was added.
- - setCellHeightRatio() function was added to define the default height of cell repect font height.
-
-3.0.013 (2008-06-03)
- - Multicell height parameter was fixed.
- - Arabic font shaping was improved.
- - unicode_data.php was updated.
-
-3.0.012 (2008-05-30)
- - K_PATH_MAIN and K_PATH_URL constants are now automatically set on config file.
- - DOCUMENT_ROOT constant was fixed for IIS Webserver (config file was updated).
- - Arabic font shaping was improved.
- - TranslateY() function was fixed (bug [1977962]).
- - setVisibility() function was fixed.
- - writeBarcode() function was fixed to scale using $xref parameter.
+4.4.002 (2008-12-09)
+ - Borders on Multicell() were fixed.
+ - Problem of Multicell() on Header function (Bug item #2407579) was fixed.
+ - Problem on graphics tranformations applied to Multicell() was fixed.
+ - Support for ImageMagick was added.
+ - Width calculation for nested tables was fixed.
+
+4.4.001 (2008-12-08)
+ - Some missing core fonts were added on fonts directory.
+ - CID0 fonts rendering was fixed.
+ - HTML support was improved (
and tags are now supported).
+ - Bug item #2406022 "Left padding bug in MultiCell with maxh" was fixed.
+
+4.4.000 (2008-12-07)
+ - File attachments are now supported (see example n. 41).
+ - Font functions were optimized to reduce document size.
+ - makefont.php was updated.
+ - Linux binaries were added on /fonts/utils
+ - All fonts were updated.
+ - $autopadding parameter was added to Multicell() to disable automatic padding features.
+ - $maxh parameter was added to Multicell() and Write() to set a maximum height.
+
+4.3.009 (2008-12-05)
+ - Bug item #2392989 (Custom header + setlinewidth + cell border bug) was fixed.
+
+4.3.008 (2008-12-05)
+ - Bug item #2390566 "rect bug" was fixed.
+ - File path was fixed for font embedded files.
+ - SetFont() method signature was changed to include the font filename.
+ - Some font-related methods were improved.
+ - Methods getFontFamily() and getFontStyle() were added.
+
+4.3.007 (2008-12-03)
+ - PNG alpha channel is now supported (GD library is required).
+ - AddFont() function now support custom font file path on $file parameter.
+ - The default width variable ($dw) is now always defined for any font.
+ - The 'Style' attribute on CID-0 fonts was removed because of protection bug.
+
+4.3.006 (2008-12-01)
+ - A regular expression on getHtmlDomArray() to find HTML tags was fixed.
+
+4.3.005 (2008-11-25)
+ - makefont.php was fixed.
+ - Bug item #2339877 was fixed (false loop condition detected on WriteHTML()).
+ - Bug item #2336733 was fixed (lasth value update on Multicell() when border and fill are disabled).
+ - Bug item #2342303 was fixed (automatic page-break on Image() and ImageEPS()).
+
+4.3.004 (2008-11-19)
+ - Function _textstring() was fixed (bug 2309051).
- All examples were updated.
-3.0.011 (2008-05-23)
- - CMYK color support was added to all graphic functions.
- - HTML table support was improved:
- -- now it's possible to include additional html tags inside a cell;
- -- colspan attribute was added.
- - example 006 was updated.
-
-3.0.010 (2008-05-21)
- - fixed $laa_array inclusion on utf8Bidi() function.
-
-3.0.009 (2008-05-20)
- - unicode_data.php was updated.
- - Arabic laa letter problem was fixed.
-
-3.0.008 (2008-05-12)
- - Arabic support was fixed and improved (unicode_data.php was updated).
- - Polycurve() function was added to draw a poly-Bezier curve.
- - list items alignment was fixed.
- - example 6 was updated.
-
-3.0.007 (2008-05-06)
- - Arabic support was fixed and improved.
- - AlMohanad (arabic) font was added.
- - C128 barcode bugs were fixed.
-
-3.0.006 (2008-04-21)
- - Condition to check negative width values was added.
-
-3.0.005 (2008-04-18)
- - back-Slash character escape was fixed on writeHTML() function.
- - Exampe 6 was updated.
-
-3.0.004 (2008-04-11)
- - Bug [1939304] (Right to Left Issue) was fixed.
-
-3.0.003 (2008-04-07)
- - Bug [1934523](Words between HTML tags in cell not kept on one line) was fixed.
- - "face" attribute of "font" tag is now fully supported.
-
-3.0.002 (2008-04-01)
- - Write() functions now return the number of cells and not the number of lines.
- - TCPDF is released under LGPL 2.1, or any later version.
-
-3.0.001 (2008-05-28)
- - _legacyparsejpeg() and _legacyparsepng() were renamed _parsejpeg() and _parsepng().
- - function writeBarcode() was fixed.
- - all examples were updated.
- - example 27 was added to show various barcodes.
-
-3.0.000 (2008-03-27)
- - private function pixelsToMillimeters() was changed to public function pixelsToUnits() to fix html image size bug.
- - Image-related functions were rewritten.
- - resize parameter was added to Image() signature to reduce the image size and fit width and height (see example 9).
- - TCPDF now supports all images supported by GD library: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM.
- - CMYK support was added to SetDrawColor(), SetFillColor(), SetTextColor() (see example 22).
- - Page Groups were added (see example 23).
- - setVisibility() function was added to restrict the rendering of some elements to screen or printout (see example 24).
- - All private variables and functions were changed to protected.
- - setAlpha() function was added to give transparency support for all objects (see example 25).
- - Clipping and stroke modes were added to Text() function (see example 26).
- - All examples were moved to "examples" directory.
- - function setJPEGQuality() was added to set the JPEG image comrpession (see example 9).
-
-2.9.000 (2008-03-26)
- - htmlcolors.php file was added to include html colors.
- - Support for HTML color names and three-digit hexadecimal color codes was added.
- - private function convertColorHexToDec() was renamed convertHTMLColorToDec().
- - color and bgcolor attributes are now supported on all HTML tags (color nesting is also supported).
- - Write() function were fixed.
- - example_006.php was updated.
- - private function setUserRights() was added to release user rights on Acrobat Reader (this allows to display forms, see example 14)
-
-2.8.000 (2008-03-20)
- - Private variables were changed to protected.
- - Function Write() was fixed and improved.
- - Support for dl, dt, dd, del HTML tags was introduced.
- - Line-trought mode was added for HTML and text.
- - Text vertical alignment on cells were fixed.
- - Examples were updated to reflect changes.
-
-2.7.002 (2008-03-13)
- - Bug "[1912142] Encrypted PDF created/modified date" was fixed.
-
-2.7.001 (2008-03-10)
- - Cell justification was fixed for non-unicode mode.
-
-2.7.000 (2008-03-09)
- - Cell() stretching mode 4 (forced character spacing) was fixed.
- - writeHTMLCell() now uses Multicell() to write.
- - Multicell() has a new parameter $ishtml to act as writeHTMLCell().
- - Write() speed was improved for non-arabic strings.
- - Example n. 20 was changed.
-
-2.6.000 (2008-03-07)
- - various alignments bugs were fixed.
-
-2.5.000 (2008-03-07)
- - Several bugs were fixed.
- - example_019.php was added to test non-unicode mode using old fonts.
-
-2.4.000 (2008-03-06)
- - RTL support was deeply improved.
- - GetStringWidth() was fixed to support RTL languages.
- - Text() RTL alignment was fixed.
- - Some functions were added: GetArrStringWidth(), GetCharWidth(), uniord(), utf8Bidi().
- - example_018.php was added and test_unicode.php was removed.
-
-2.3.000 (2008-03-05)
- - MultiCell() signature is changed. Now support multiple columns across pages (see example_017).
- - Write() signature is changed. Now support the cell mode to be used with MultiCell.
- - Header() and Footer() were changed.
- - The following functions were added: UTF8ArrSubString() and unichr().
- - Examples were updated to reflect last changes.
-
-2.2.004 (2008-03-04)
- - Several examples were added.
- - AddPage() Header() and Footer() were fixed.
- - Documentation is now available on http://www.tcpdf.org
-
-2.2.003 (2008-03-03)
- - [1894853] Performance of MultiCell() was improved.
- - RadioButton and ListBox functions were added.
- - javascript form functions were rewritten and properties names are changed. The properties function supported by form fields are listed on Possible values are listed on http://www.adobe.com/devnet/acrobat/pdfs/js_developer_guide.pdf.
-
-2.2.002 (2008-02-28)
- - [1900495] html images path was fixed.
- - Legacy image functions were reintroduced to allow PNG and JPEG support without GD library.
-
-2.2.001 (2008-02-16)
- - The bug "[1894700] bug with replace relative path" was fixed
- - Justification was fixed
-
-2.2.000 (2008-02-12)
- - fixed javascript bug introduced with latest release
-
-2.1.002 (2008-02-12)
- - Justify function was fixed on PHP4 version.
- - Bookmank function was added ([1578250] Table of contents).
- - Javascript and Form fields support was added ([1796359] Form fields).
-
-2.1.001 (2008-02-10)
- - The bug "[1885776] Race Condition in function justitfy" was fixed.
- - The bug "[1890217] xpdf complains that pdf is incorrect" was fixed.
-
-2.1.000 (2008-01-07)
- - FPDF_FONTPATH constant was changed to K_PATH_FONTS on config file
- - Bidirectional Algorithm to correctly reverse bidirectional languages was added.
- - SetLeftMargin, SetTopMargin, SetRightMargin functions were fixed.
- - SetCellPadding function was added.
- - writeHTML was updated with new parameters.
- - Text function was fixed.
- - MultiCell function was fixed, now works also across multiple pages.
- - Line width was fixed on Header and Footer functions and
tag.
- - "GetImageSize" was renamed "getimagesize".
- - Document version was changed from 1.3 to 1.5.
- - _begindoc() function was fixed.
- - ChangeDate was fixed and ModDate was added.
- - The following functions were added:
- setPage() : Move pointer to the specified document page.
- getPage() : Get current document page number.
- lastpage() : Reset pointer to the last document page.
- getNumPages() : Get the total number of inserted pages.
- GetNumChars() : count the number of (UTF-8) characters in a string.
- - $stretch parameter was added to Cell() function to fit text on cell:
- 0 = disabled
- 1 = horizontal scaling only if necessary
- 2 = forced horizontal scaling
- 3 = character spacing only if necessary
- 4 = forced character spacing
- - Line function was fixed for RTL.
- - Graphic transformation functions were added [1811158]:
- StartTransform()
- StopTransform()
- ScaleX()
- ScaleY()
- ScaleXY()
- Scale()
- MirrorH()
- MirrorV()
- MirrorP()
- MirrorL()
- TranslateX()
- TranslateY()
- Translate()
- Rotate()
- SkewX()
- SkewY()
- Skew()
- - Graphic function were added/updated [1688549]:
- SetLineStyle()
- _outPoint()
- _outLine()
- _outRect()
- _outCurve()
- Line()
- Rect()
- Curve
- Ellipse
- Circle
- Polygon
- RegularPolygon
-
-2.0.000 (2008-01-04)
- - RTL (Right-To-Left) languages support was added. Language direction is set using the $l['a_meta_dir'] setting on /configure/language/xxx.php language files.
- - setRTL($enable) method was added to manually enable/disable the RTL text direction.
- - The attribute "dir" was added to support custom text direction on HTML tags. Possible values are: ltr - for Left-To-Right and RTL for Right-To-Left.
- - RC4 40bit encryption was added. Check the SetProtection method.
- - [1815213] Improved image support for GIF, JPEG, PNG formats.
- - [1800094] Attribute "value" was added to ordered list items .
- - Image function now has a new "align" parameter that indicates the alignment of the pointer next to image insertion and relative to image height. The value can be:
- T: top-right for LTR or top-left for RTL
- M: middle-right for LTR or middle-left for RTL
- B: bottom-right for LTR or bottom-left for RTL
- N: next line
- - Attribute "align" was added to
html tag to set the above image "align" parameter. Possible values are:
- top: top-right for LTR or top-left for RTL
- middle: middle-right for LTR or middle-left for RTL
- bottom: bottom-right for LTR or bottom-left for RTL
- - [1798103] newline was added after , and
tages.
- - [1816393] Documentation was updated.
- - 'ln' parameter was fixed on writeHTMLCell. Now it's possible to print two or more columns across several pages;
- - The method lastPage() was added to move the pointer on the last page;
-
-------------------------------------------------------------
-
-1.53.0.TC034 (2007-07-30)
- - fixed htmlentities conversion.
- - MultiCell() function returns the number of cells.
-
-1.53.0.TC033 (2007-07-30)
- - fixed bug 1762550: case sensitive for font files
- - NOTE: all fonts files names must be in lowercase!
-
-1.53.0.TC032 (2007-07-27)
- - setLastH method was added to resolve bug 1689071.
- - all fonts names were converted in lowercase (bug 1713005).
- - bug 1740954 was fixed.
- - justification was added as Cell option.
-
-1.53.0.TC031 (2007-03-20)
- - ToUnicode CMap were added on _puttruetypeunicode function. Now you may search and copy unicode text.
-
-1.53.0.TC030 (2007-03-06)
- - fixed bug on PHP4 version.
-
-1.53.0.TC029 (2007-03-06)
- - DejaVu Fonts were added.
-
-1.53.0.TC028 (2007-03-03)
- - MultiCell function signature were changed: the $ln parameter were added. Check documentation for further information.
- - Greek language were added on example sentences.
- - setPrintHeader() and setPrintFooter() functions were added to enable or disable page header and footer.
-
-1.53.0.TC027 (2006-12-14)
- - $attr['face'] bug were fixed.
- - K_TCPDF_EXTERNAL_CONFIG control where introduced on /config/tcpdf_config.php to use external configuration files.
-
-1.53.0.TC026 (2006-10-28)
- - writeHTML function call were fixed on examples.
-
-1.53.0.TC025 (2006-10-27)
- - Bugs item #1421290 were fixed (0D - 0A substitution in some characters)
- - Bugs item #1573174 were fixed (MultiCell documentation)
-
-1.53.0.TC024 (2006-09-26)
- - getPageHeight() function were fixed (bug 1543476).
- - fixed missing breaks on closedHTMLTagHandler function (bug 1535263).
- - fixed extra spaces on Write function (bug 1535262).
-
-1.53.0.TC023 (2006-08-04)
- - paths to barcode directory were fixed.
- - documentation were updated.
-
-1.53.0.TC022 (2006-07-16)
- - fixed bug: [ 1516858 ] Probs with PHP autoloader and class_exists()
-
-1.53.0.TC021 (2006-07-01)
- - HTML attributes with whitespaces are now supported (thanks to Nelson Benitez for his support)
-
-1.53.0.TC020 (2006-06-23)
- - code cleanup
-
-1.53.0.TC019 (2006-05-21)
- - fixed and closing tags
-
-1.53.0.TC018 (2006-05-18)
- - fixed font names bug
-
-1.53.0.TC017 (2006-05-18)
- - the TTF2UFM utility to convert True Type fonts for TCPDF were included on fonts folder.
- - new free unicode fonts were included on /fonts/freefont.
- - test_unicode.php example were exended.
- - parameter $fill were added on Write, writeHTML and writeHTMLCell functions.
- - documentation were updated.
-
-1.53.0.TC016 (2006-03-09)
- - fixed closing tag on html parser.
-
-1.53.0.TC016 (2005-08-28)
- - fpdf.php and tcpdf.php files were joined in one single class (you can still extend TCPDF with your own class).
- - fixed problem when mb_internal_encoding is set.
-
-1.53.0.TC014 (2005-05-29)
- - fixed WriteHTMLCell new page issue.
-
-1.53.0.TC013 (2005-05-29)
- - fixed WriteHTMLCell across pages.
+4.3.003 (2008-11-18)
+ - CID-0 font bug was fixed.
+ - Some functions were optimized.
+ - Function getGroupPageNoFormatted() was added.
+ - Example n. 23 was updated.
+
+4.3.002 (2008-11-17)
+ - Bug item #2305518 "CID-0 font don't work with encryption" was fixed.
+
+4.3.001 (2008-11-17)
+ - Bug item #2300007 "download mimetype pdf" was fixed.
+ - Double quotes were replaced by single quotes to improve PHP performances.
+ - A bug relative to HTML cell borders was fixed.
+
+4.3.000 (2008-11-14)
+ - The function setOpenCell() was added to set the top/bottom cell sides to be open or closed when the cell cross the page.
+ - A bug relative to list items indentation was fixed.
+ - A bug relative to borders on HTML tables and Multicell was fixed.
+ - A bug relative to rowspanned cells was fixed.
+ - A bug relative to html images across pages was fixed.
+
+4.2.009 (2008-11-13)
+ - Spaces between li tags are now automatically removed.
+
+4.2.008 (2008-11-12)
+ - A bug relative to fill color on next page was fixed.
+
+4.2.007 (2008-11-12)
+ - The function setListIndentWidth() was added to set custom indentation widht for HTML lists.
-1.53.0.TC012 (2005-05-29)
- - font color attribute bug were fixed.
+4.2.006 (2008-11-06)
+ - A bug relative to HTML justification was fixed.
-1.53.0.TC011 (2005-03-31)
- - SetFont function were fixed (thank Sjaak Lauwers for bug notice).
+4.2.005 (2008-11-06)
+ - A bug relative to HTML justification was fixed.
+ - The methods formatPageNumber() and PageNoFormatted() were added to format page numbers.
+ - Default Footer() method was changed to use PageNoFormatted() instead of PageNo().
+ - Example 6 was updated.
-1.53.0.TC010 (2005-03-22)
- - the html functions were improved (thanks to Manfred Vervuert for bug reporting).
+4.2.004 (2008-11-04)
+ - Bug item n. 2217039 "filename handling improvement" was fixed.
-1.53.0.TC009 (2005-03-19)
- - a wrong reference to convertColorHexToDec were fixed.
+4.2.003 (2008-10-31)
+ - Font style bug was fixed.
-1.53.0.TC008 (2005-02-07)
- - removed some extra bytes from PHP files.
+4.2.002 (2008-10-31)
+ - Bug item #2210922 (htm element br not work) was fixed.
+ - Write() function was improved to support margin changes.
-1.53.0.TC007 (2005-01-08)
- - fill attribute were removed from writeHTMLCell method.
+4.2.001 (2008-10-30)
+ - setHtmlVSpace($tagvs) function was added to set custom vertical spaces for HTML tags.
+ - writeHTML() function now support margin changes during execution.
+ - Signature of addHTMLVertSpace() function is changed.
-1.53.0.TC006 (2005-01-08)
- - the documentation were updated.
+4.2.000 (2008-10-29)
+ - htmlcolors.php was changed to support class-loaders.
+ - ImageEps() function was improved in performances.
+ - Signature of Link() And Annotation() functions were changed.
+ - (Bug item #2198926) Links and Annotations alignment were fixed (support for geometric tranformations was added).
+ - rowspan mode for HTML table cells was improved and fixed.
+ - Booklet mode for double-sided pages was added; see SetBooklet() function and example n. 40.
+ - lastPage() signature is changed.
+ - Signature of Write() function is changed.
+ - Some HTML justification problems were fixed.
+ - Some functions were fixed to better support RTL mode.
+ - Example n. 10 was changed to support RTL mode.
+ - All examples were updated.
+
+4.1.004 (2008-10-23)
+ - unicode_data.php was changed to support class-loaders.
+ - Bug item #2186040/2 (writeHTML margin problem) was fixed.
+
+4.1.003 (2008-10-22)
+ - Bug item #2185399 was fixed (rowspan and page break).
+ - Bugs item #2186040 was fixed (writeHTML margin problem).
+ - Newline after table was removed.
+
+4.1.002 (2008-10-21)
+ - Bug item #2184525 was fixed (rowspan on HTML cell).
+
+4.1.001 (2008-10-21)
+ - Support for "start" attribute was added to HTML ordered list.
+ - unicode_data.php file was changed to include UTF-8 to ASCII table.
+ - Some functions were modified to better support UTF-8 extensions to core fonts.
+ - Support for images on HTML lists was improved.
+ - Examples n. 1 and 6 were updated.
+
+4.1.000 (2008-10-18)
+ - Page-break bug using HTML content was fixed.
+ - The "false" parameter was reintroduced to class_exists function on PHP5 version to avoid autoload.
+ - addHtmlLink() function was improved to support internal links (i.e.: link to page 23).
+ - Justification alignment is now supported on HTML (see example n. 39).
+ - example_006.php was updated.
-1.53.0.TC005 (2005-01-05)
- - Steven Wittens's unicode methods were removed.
- - All unicode methods were rewritten from scratch.
- - TCPDF is now licensed as LGPL.
+4.0.033 (2008-10-13)
+ - Bug n. 2157099 was fixed.
+ - SetX() and SetY() functions were improved.
+ - SetY() includes a new parameter to avoid the X reset.
+
+4.0.032 (2008-10-10)
+ - Bug n. 2156926 was fixed (bold, italic, underlined, linethrough).
+ - setStyle() method was removed.
+ - Configuration file was changed to use helvetica (non-unicode) font by default.
+ - The use of mixed font types was improved.
+ - All examples were updated.
-1.53.0.TC004 (2005-01-04)
- - this changelog were added.
- - removed comercial fonts for licensing issue.
- - Bitstream Vera Fonts were added (http://www.bitstream.com/font_rendering/products/dev_fonts/vera.html).
- - Now the AddFont and SetFont functions returns the basic font if the styled version do not exist.
+4.0.031 (2008-10-09)
+ - _putannots() and _putbookmarks() links alignments were fixed.
+4.0.030 (2008-10-07)
+ - _putbookmarks() function was fixed.
+ - _putannots() was fixed to include internal links.
+
+4.0.029 (2008-09-27)
+ - Infinite loop bug was fixed [Bug item #130309].
+ - Multicell() problem on Header() was fixed.
+
+4.0.028 (2008-09-26)
+ - setLIsymbol() was added to set the LI symbol used on UL lists.
+ - Missing $padding and $encryption_key variables declarations were added [Bug item #2129058].
+
+4.0.027 (2008-09-19)
+ - Bug #2118588 "Undefined offset in tcpdf.php on line 9581" was fixed.
+ - arailunicid0.php font was updated.
+ - The problem of javascript form fields duplication after saving was fixed.
+
+4.0.026 (2008-09-17)
+ - convertHTMLColorToDec() function was improved to support rgb(RR,GG,BB) notation.
+ - The following inline CSS attributes are now supported: text-decoration, color, background-color and font-size names: xx-small, x-small, small, medium, large, x-large, xx-large
+ - Example n. 6 was updated.
+
+4.0.025 (2008-09-15)
+ - _putcidfont0 function was improved to include CJK fonts (Chinese, Japanese, Korean, CJK, Asian fonts) without embedding.
+ - arialunicid0 font was added (see the new example n. 38).
+ - The following Unicode to CID-0 tables were added on fonts folder: uni2cid_ak12.php, uni2cid_aj16.php, uni2cid_ag15.php, uni2cid_ac15.php.
+
+4.0.024 (2008-09-12)
+ - "stripos" function was replaced with "strpos + strtolower" for backward compatibility with PHP4.
+ - support for Spot Colors were added. Check the new example n. 37 and the following new functions:
+ AddSpotColor()
+ SetDrawSpotColor()
+ SetFillSpotColor()
+ SetTextSpotColor()
+ _putspotcolors()
+ - Bookmark() function was improved to fix wrong levels.
+ - $lasth changes after header/footer calls were fixed.
+
+4.0.023 (2008-09-05)
+ - Some HTML related problems were fixed.
+ - Image alignment on HTML was changed, now it always defaults to the normal mode (see example_006.php).
+
+4.0.022 (2008-08-28)
+ - Line height on HTML was fixed.
+ - Image inside an HTML cell problem was fixed.
+ - A new "zarbold" persian font was added.
+
+4.0.021 (2008-08-24)
+ - HTTP headers were fixed on Output function().
+ - getAliasNbPages() and getPageGroupAlias() functions were changed to support non-unicode fonts on unicode documents.
+ - Function Write() was fixed.
+ - The problem of additional vertical spaces on HTML was fixed.
+ - The problem of frame around HTML links was fixed.
+
+4.0.020 (2008-08-15)
+ - "[2052259] WriteHTML & " bug was fixed.
+
+4.0.019 (2008-08-13)
+ - "Rowspan on first cell" bug was fixed.
+
+4.0.018 (2008-08-08)
+ - Default cellpadding for HTML tables was fixed.
+ - Annotation() function was added to support some PDF annotations (see example_036.php and section 8.4 of PDF reference 1.7).
+ - HTML links are now correclty shifted during line alignments.
+ - function getAliasNbPages() was added and Footer() was updated.
+ - RowSpan mode for HTML tables was fixed.
+ - Bugs item #2043610 "Multiple sizes vertical align wrong" was fixed.
+ - ImageEPS() function was improved and RTL alignment was fixed (see example_032.php).
+
+4.0.017 (2008-08-05)
+ - Missing CNZ and CEO style modes were added to Rect() function.
+ - Fonts utils were updated to include support for OpenType fonts.
+ - getLastH() function was added.
+
+4.0.016 (2008-07-30)
+ - setPageMark() function was added. This function must be called after calling Image() function for a background image.
+
+4.0.015 (2008-07-29)
+ - Some functions were changed to support different page formats (see example_028.php).
+ - The signature of setPage() function is changed.
+
+4.0.014 (2008-07-29)
+ - K_PATH_MAIN calculation on tcpdf_config.php was fixed.
+ - HTML support for EPS/AI images was added (see example_006.php).
+ - Bugs item #2030807 "Truncated text on multipage html fields" was fixed.
+ - PDF header bug was fixed.
+ - helvetica was added as default font family.
+ - Stroke mode was fixed on Text function.
+ - several minor bugs were fixed.
+
+4.0.013 (2008-07-27)
+ - Bugs item #2027799 " Big spaces between lines after page break" was fixed.
+ - K_PATH_MAIN calculation on tcpdf_config.php was changed.
+ - Function setVisibility() was fixed to avoid the "Incorrect PDEObject type" error message.
+
+4.0.012 (2008-07-24)
+ - Addpage(), Header() and Footer() functions were changed to simplify the implementation of external header/footer functions.
+ - The following functions were added:
+ setHeader()
+ setFooter()
+ getImageRBX()
+ getImageRBY()
+ getCellHeightRatio()
+ getHeaderFont()
+ getFooterFont()
+ getRTL()
+ getBarcode()
+ getHeaderData()
+ getHeaderMargin()
+ getFooterMargin()
+
+4.0.011 (2008-07-23)
+ - Font support was improved.
+ - The folder /fonts/utils contains new utilities and instructions for embedd font files.
+ - Documentation was updated.
+
+4.0.010 (2008-07-22)
+ - HTML tables were fixed to work across pages.
+ - Header() and Footer() functions were updated to preserve previous settings.
+ - example_035.php was added.
+
+4.0.009 (2008-07-21)
+ - UTF8StringToArray() function was fixed for non-unicode mode.
+
+4.0.008 (2008-07-21)
+ - Barcodes alignment was fixed (see example_027.php).
+ - unicode_data.php was updated.
+ - Arabic shaping for "Zero-Width Non-Joiner" character (U+200C) was fixed.
+
+4.0.007 (2008-07-18)
+ - str_split was replaced by preg_split for compatibility with PHP4 version.
+ - Clipping mode was added to all graphic functions by using parameter $style = "CNZ" or "CEO" (see example_034.php).
+
+4.0.006 (2008-07-16)
+ - HTML rowspan bug was fixed.
+ - Line style for MultiCell() was fixed.
+ - WriteHTML() function was improved.
+ - CODE128C barcode was fixed (barcodes.php).
+
+4.0.005 (2008-07-11)
+ - Bug [2015715] "PHP Error/Warning" was fixed.
+
+4.0.004 (2008-07-09)
+ - HTML cell internal padding was fixed.
+
+4.0.003 (2008-07-08)
+ - Removed URL encoding when F option is selected on Output() function.
+ - fixed some minor bugs in html tables.
+
+4.0.002 (2008-07-07)
+ - Bug [2000861] was still unfixed and has been fixed.
+
+4.0.001 (2008-07-05)
+ - Bug [2000861] was fixed.
+
+4.0.000 (2008-07-03)
+ - THIS IS A MAIN RELEASE THAT INCLUDES SEVERAL NEW FEATURES AND BUGFIXES
+ - Signature fo SetTextColor() and SetFillColor() functions was changed (parameter $storeprev was removed).
+ - HTML support was completely rewritten and improved (see example 6).
+ - Alignments parameters were fixed.
+ - Functions GetArrStringWidth() and GetStringWidth() now include font parameters.
+ - Fonts support was improved.
+ - All core fonts were replaced and moved to fonts/ directory.
+ - The following functions were added: getMargins(), getFontSize(), getFontSizePt().
+ - File config/tcpdf_config_old.php was renamed tcpdf_config_alt.php and updated.
+ - Multicell and WriteHTMLCell fill function was fixed.
+ - Several minor bugs were fixed.
+ - barcodes.php was updated.
+ - All examples were updated.
+
+------------------------------------------------------------
+
+3.1.001 (2008-06-13)
+ - Bug [1992515] "K_PATH_FONTS default value wrong" was fixed.
+ - Vera font was removed, DejaVu font and Free fonts were updated.
+ - Image handling was improved.
+ - All examples were updated.
+
+3.1.000 (2008-06-11)
+ - setPDFVersion() was added to change the default PDF version (currently 1.7).
+ - setViewerPreferences() was added to control the way the document is to be presented on the screen or printed (see example 29).
+ - SetDisplayMode() signature was changed (new options were added).
+ - LinearGradient(), RadialGradient(), CoonsPatchMesh() functions were added to print various color gradients (see example 30).
+ - PieSector() function was added to render render pie charts (see example 31).
+ - ImageEps() was added to display EPS and AI images with limited support (see example 32).
+ - writeBarcode() function is now depracated, a new write1DBarcode() function was added. The barcode directory was removed and a new barcodes.php file was added.
+ - The new write1DBarcode() function support more barcodes and do not need the GD library (see example 027). All barcodes are directly written to PDF using graphic functions.
+ - HTML lists were improved and could be nested (you may now represent trees).
+ - AddFont() bug was fixed.
+ - _putfonts() bug was fixed.
+ - graphics functions were fixed.
+ - unicode_data.php file was updated (fixed).
+ - almohanad font was updated.
+ - example 18 was updated (Farsi and Arabic languages).
+ - source code cleanup.
+ - All examples were updated and new examples were added.
+
+3.0.015 (2008-06-06)
+ - AddPage() function signature is changed to include page format.
+ - example 28 was added to show page format changes.
+ - setPageUnit() function was added to change the page units of measure.
+ - setPageFormat() function was added to change the page format and orientation between pages.
+ - setPageOrientation() function was added to change the page orientation.
+ - Arabic font shaping was fixed for laa letter and square boxes (see the example 18).
+
+3.0.014 (2008-06-04)
+ - Arabic font shaping was fixed.
+ - setDefaultTableColumns() function was added.
+ - $cell_height_ratio variable was added.
+ - setCellHeightRatio() function was added to define the default height of cell repect font height.
+
+3.0.013 (2008-06-03)
+ - Multicell height parameter was fixed.
+ - Arabic font shaping was improved.
+ - unicode_data.php was updated.
+
+3.0.012 (2008-05-30)
+ - K_PATH_MAIN and K_PATH_URL constants are now automatically set on config file.
+ - DOCUMENT_ROOT constant was fixed for IIS Webserver (config file was updated).
+ - Arabic font shaping was improved.
+ - TranslateY() function was fixed (bug [1977962]).
+ - setVisibility() function was fixed.
+ - writeBarcode() function was fixed to scale using $xref parameter.
+ - All examples were updated.
+
+3.0.011 (2008-05-23)
+ - CMYK color support was added to all graphic functions.
+ - HTML table support was improved:
+ -- now it's possible to include additional html tags inside a cell;
+ -- colspan attribute was added.
+ - example 006 was updated.
+
+3.0.010 (2008-05-21)
+ - fixed $laa_array inclusion on utf8Bidi() function.
+
+3.0.009 (2008-05-20)
+ - unicode_data.php was updated.
+ - Arabic laa letter problem was fixed.
+
+3.0.008 (2008-05-12)
+ - Arabic support was fixed and improved (unicode_data.php was updated).
+ - Polycurve() function was added to draw a poly-Bezier curve.
+ - list items alignment was fixed.
+ - example 6 was updated.
+
+3.0.007 (2008-05-06)
+ - Arabic support was fixed and improved.
+ - AlMohanad (arabic) font was added.
+ - C128 barcode bugs were fixed.
+
+3.0.006 (2008-04-21)
+ - Condition to check negative width values was added.
+
+3.0.005 (2008-04-18)
+ - back-Slash character escape was fixed on writeHTML() function.
+ - Exampe 6 was updated.
+
+3.0.004 (2008-04-11)
+ - Bug [1939304] (Right to Left Issue) was fixed.
+
+3.0.003 (2008-04-07)
+ - Bug [1934523](Words between HTML tags in cell not kept on one line) was fixed.
+ - "face" attribute of "font" tag is now fully supported.
+
+3.0.002 (2008-04-01)
+ - Write() functions now return the number of cells and not the number of lines.
+ - TCPDF is released under LGPL 2.1, or any later version.
+
+3.0.001 (2008-05-28)
+ - _legacyparsejpeg() and _legacyparsepng() were renamed _parsejpeg() and _parsepng().
+ - function writeBarcode() was fixed.
+ - all examples were updated.
+ - example 27 was added to show various barcodes.
+
+3.0.000 (2008-03-27)
+ - private function pixelsToMillimeters() was changed to public function pixelsToUnits() to fix html image size bug.
+ - Image-related functions were rewritten.
+ - resize parameter was added to Image() signature to reduce the image size and fit width and height (see example 9).
+ - TCPDF now supports all images supported by GD library: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM.
+ - CMYK support was added to SetDrawColor(), SetFillColor(), SetTextColor() (see example 22).
+ - Page Groups were added (see example 23).
+ - setVisibility() function was added to restrict the rendering of some elements to screen or printout (see example 24).
+ - All private variables and functions were changed to protected.
+ - setAlpha() function was added to give transparency support for all objects (see example 25).
+ - Clipping and stroke modes were added to Text() function (see example 26).
+ - All examples were moved to "examples" directory.
+ - function setJPEGQuality() was added to set the JPEG image comrpession (see example 9).
+
+2.9.000 (2008-03-26)
+ - htmlcolors.php file was added to include html colors.
+ - Support for HTML color names and three-digit hexadecimal color codes was added.
+ - private function convertColorHexToDec() was renamed convertHTMLColorToDec().
+ - color and bgcolor attributes are now supported on all HTML tags (color nesting is also supported).
+ - Write() function were fixed.
+ - example_006.php was updated.
+ - private function setUserRights() was added to release user rights on Acrobat Reader (this allows to display forms, see example 14)
+
+2.8.000 (2008-03-20)
+ - Private variables were changed to protected.
+ - Function Write() was fixed and improved.
+ - Support for dl, dt, dd, del HTML tags was introduced.
+ - Line-trought mode was added for HTML and text.
+ - Text vertical alignment on cells were fixed.
+ - Examples were updated to reflect changes.
+
+2.7.002 (2008-03-13)
+ - Bug "[1912142] Encrypted PDF created/modified date" was fixed.
+
+2.7.001 (2008-03-10)
+ - Cell justification was fixed for non-unicode mode.
+
+2.7.000 (2008-03-09)
+ - Cell() stretching mode 4 (forced character spacing) was fixed.
+ - writeHTMLCell() now uses Multicell() to write.
+ - Multicell() has a new parameter $ishtml to act as writeHTMLCell().
+ - Write() speed was improved for non-arabic strings.
+ - Example n. 20 was changed.
+
+2.6.000 (2008-03-07)
+ - various alignments bugs were fixed.
+
+2.5.000 (2008-03-07)
+ - Several bugs were fixed.
+ - example_019.php was added to test non-unicode mode using old fonts.
+
+2.4.000 (2008-03-06)
+ - RTL support was deeply improved.
+ - GetStringWidth() was fixed to support RTL languages.
+ - Text() RTL alignment was fixed.
+ - Some functions were added: GetArrStringWidth(), GetCharWidth(), uniord(), utf8Bidi().
+ - example_018.php was added and test_unicode.php was removed.
+
+2.3.000 (2008-03-05)
+ - MultiCell() signature is changed. Now support multiple columns across pages (see example_017).
+ - Write() signature is changed. Now support the cell mode to be used with MultiCell.
+ - Header() and Footer() were changed.
+ - The following functions were added: UTF8ArrSubString() and unichr().
+ - Examples were updated to reflect last changes.
+
+2.2.004 (2008-03-04)
+ - Several examples were added.
+ - AddPage() Header() and Footer() were fixed.
+ - Documentation is now available on http://www.tcpdf.org
+
+2.2.003 (2008-03-03)
+ - [1894853] Performance of MultiCell() was improved.
+ - RadioButton and ListBox functions were added.
+ - javascript form functions were rewritten and properties names are changed. The properties function supported by form fields are listed on Possible values are listed on http://www.adobe.com/devnet/acrobat/pdfs/js_developer_guide.pdf.
+
+2.2.002 (2008-02-28)
+ - [1900495] html images path was fixed.
+ - Legacy image functions were reintroduced to allow PNG and JPEG support without GD library.
+
+2.2.001 (2008-02-16)
+ - The bug "[1894700] bug with replace relative path" was fixed
+ - Justification was fixed
+
+2.2.000 (2008-02-12)
+ - fixed javascript bug introduced with latest release
+
+2.1.002 (2008-02-12)
+ - Justify function was fixed on PHP4 version.
+ - Bookmank function was added ([1578250] Table of contents).
+ - Javascript and Form fields support was added ([1796359] Form fields).
+
+2.1.001 (2008-02-10)
+ - The bug "[1885776] Race Condition in function justitfy" was fixed.
+ - The bug "[1890217] xpdf complains that pdf is incorrect" was fixed.
+
+2.1.000 (2008-01-07)
+ - FPDF_FONTPATH constant was changed to K_PATH_FONTS on config file
+ - Bidirectional Algorithm to correctly reverse bidirectional languages was added.
+ - SetLeftMargin, SetTopMargin, SetRightMargin functions were fixed.
+ - SetCellPadding function was added.
+ - writeHTML was updated with new parameters.
+ - Text function was fixed.
+ - MultiCell function was fixed, now works also across multiple pages.
+ - Line width was fixed on Header and Footer functions and
tag.
+ - "GetImageSize" was renamed "getimagesize".
+ - Document version was changed from 1.3 to 1.5.
+ - _begindoc() function was fixed.
+ - ChangeDate was fixed and ModDate was added.
+ - The following functions were added:
+ setPage() : Move pointer to the specified document page.
+ getPage() : Get current document page number.
+ lastpage() : Reset pointer to the last document page.
+ getNumPages() : Get the total number of inserted pages.
+ GetNumChars() : count the number of (UTF-8) characters in a string.
+ - $stretch parameter was added to Cell() function to fit text on cell:
+ 0 = disabled
+ 1 = horizontal scaling only if necessary
+ 2 = forced horizontal scaling
+ 3 = character spacing only if necessary
+ 4 = forced character spacing
+ - Line function was fixed for RTL.
+ - Graphic transformation functions were added [1811158]:
+ StartTransform()
+ StopTransform()
+ ScaleX()
+ ScaleY()
+ ScaleXY()
+ Scale()
+ MirrorH()
+ MirrorV()
+ MirrorP()
+ MirrorL()
+ TranslateX()
+ TranslateY()
+ Translate()
+ Rotate()
+ SkewX()
+ SkewY()
+ Skew()
+ - Graphic function were added/updated [1688549]:
+ SetLineStyle()
+ _outPoint()
+ _outLine()
+ _outRect()
+ _outCurve()
+ Line()
+ Rect()
+ Curve
+ Ellipse
+ Circle
+ Polygon
+ RegularPolygon
+
+2.0.000 (2008-01-04)
+ - RTL (Right-To-Left) languages support was added. Language direction is set using the $l['a_meta_dir'] setting on /configure/language/xxx.php language files.
+ - setRTL($enable) method was added to manually enable/disable the RTL text direction.
+ - The attribute "dir" was added to support custom text direction on HTML tags. Possible values are: ltr - for Left-To-Right and RTL for Right-To-Left.
+ - RC4 40bit encryption was added. Check the SetProtection method.
+ - [1815213] Improved image support for GIF, JPEG, PNG formats.
+ - [1800094] Attribute "value" was added to ordered list items .
+ - Image function now has a new "align" parameter that indicates the alignment of the pointer next to image insertion and relative to image height. The value can be:
+ T: top-right for LTR or top-left for RTL
+ M: middle-right for LTR or middle-left for RTL
+ B: bottom-right for LTR or bottom-left for RTL
+ N: next line
+ - Attribute "align" was added to
html tag to set the above image "align" parameter. Possible values are:
+ top: top-right for LTR or top-left for RTL
+ middle: middle-right for LTR or middle-left for RTL
+ bottom: bottom-right for LTR or bottom-left for RTL
+ - [1798103] newline was added after , and tages.
+ - [1816393] Documentation was updated.
+ - 'ln' parameter was fixed on writeHTMLCell. Now it's possible to print two or more columns across several pages;
+ - The method lastPage() was added to move the pointer on the last page;
+
+------------------------------------------------------------
+
+1.53.0.TC034 (2007-07-30)
+ - fixed htmlentities conversion.
+ - MultiCell() function returns the number of cells.
+
+1.53.0.TC033 (2007-07-30)
+ - fixed bug 1762550: case sensitive for font files
+ - NOTE: all fonts files names must be in lowercase!
+
+1.53.0.TC032 (2007-07-27)
+ - setLastH method was added to resolve bug 1689071.
+ - all fonts names were converted in lowercase (bug 1713005).
+ - bug 1740954 was fixed.
+ - justification was added as Cell option.
+
+1.53.0.TC031 (2007-03-20)
+ - ToUnicode CMap were added on _puttruetypeunicode function. Now you may search and copy unicode text.
+
+1.53.0.TC030 (2007-03-06)
+ - fixed bug on PHP4 version.
+
+1.53.0.TC029 (2007-03-06)
+ - DejaVu Fonts were added.
+
+1.53.0.TC028 (2007-03-03)
+ - MultiCell function signature were changed: the $ln parameter were added. Check documentation for further information.
+ - Greek language were added on example sentences.
+ - setPrintHeader() and setPrintFooter() functions were added to enable or disable page header and footer.
+
+1.53.0.TC027 (2006-12-14)
+ - $attr['face'] bug were fixed.
+ - K_TCPDF_EXTERNAL_CONFIG control where introduced on /config/tcpdf_config.php to use external configuration files.
+
+1.53.0.TC026 (2006-10-28)
+ - writeHTML function call were fixed on examples.
+
+1.53.0.TC025 (2006-10-27)
+ - Bugs item #1421290 were fixed (0D - 0A substitution in some characters)
+ - Bugs item #1573174 were fixed (MultiCell documentation)
+
+1.53.0.TC024 (2006-09-26)
+ - getPageHeight() function were fixed (bug 1543476).
+ - fixed missing breaks on closedHTMLTagHandler function (bug 1535263).
+ - fixed extra spaces on Write function (bug 1535262).
+
+1.53.0.TC023 (2006-08-04)
+ - paths to barcode directory were fixed.
+ - documentation were updated.
+
+1.53.0.TC022 (2006-07-16)
+ - fixed bug: [ 1516858 ] Probs with PHP autoloader and class_exists()
+
+1.53.0.TC021 (2006-07-01)
+ - HTML attributes with whitespaces are now supported (thanks to Nelson Benitez for his support)
+
+1.53.0.TC020 (2006-06-23)
+ - code cleanup
+
+1.53.0.TC019 (2006-05-21)
+ - fixed and closing tags
+
+1.53.0.TC018 (2006-05-18)
+ - fixed font names bug
+
+1.53.0.TC017 (2006-05-18)
+ - the TTF2UFM utility to convert True Type fonts for TCPDF were included on fonts folder.
+ - new free unicode fonts were included on /fonts/freefont.
+ - test_unicode.php example were exended.
+ - parameter $fill were added on Write, writeHTML and writeHTMLCell functions.
+ - documentation were updated.
+
+1.53.0.TC016 (2006-03-09)
+ - fixed closing tag on html parser.
+
+1.53.0.TC016 (2005-08-28)
+ - fpdf.php and tcpdf.php files were joined in one single class (you can still extend TCPDF with your own class).
+ - fixed problem when mb_internal_encoding is set.
+
+1.53.0.TC014 (2005-05-29)
+ - fixed WriteHTMLCell new page issue.
+
+1.53.0.TC013 (2005-05-29)
+ - fixed WriteHTMLCell across pages.
+
+1.53.0.TC012 (2005-05-29)
+ - font color attribute bug were fixed.
+
+1.53.0.TC011 (2005-03-31)
+ - SetFont function were fixed (thank Sjaak Lauwers for bug notice).
+
+1.53.0.TC010 (2005-03-22)
+ - the html functions were improved (thanks to Manfred Vervuert for bug reporting).
+
+1.53.0.TC009 (2005-03-19)
+ - a wrong reference to convertColorHexToDec were fixed.
+
+1.53.0.TC008 (2005-02-07)
+ - removed some extra bytes from PHP files.
+
+1.53.0.TC007 (2005-01-08)
+ - fill attribute were removed from writeHTMLCell method.
+
+1.53.0.TC006 (2005-01-08)
+ - the documentation were updated.
+
+1.53.0.TC005 (2005-01-05)
+ - Steven Wittens's unicode methods were removed.
+ - All unicode methods were rewritten from scratch.
+ - TCPDF is now licensed as LGPL.
+
+1.53.0.TC004 (2005-01-04)
+ - this changelog were added.
+ - removed commercial fonts for licensing issue.
+ - Bitstream Vera Fonts were added (http://www.bitstream.com/font_rendering/products/dev_fonts/vera.html).
+ - Now the AddFont and SetFont functions returns the basic font if the styled version do not exist.
+
diff --git a/lib/tcpdf/README-MOODLE.TXT b/lib/tcpdf/README-MOODLE.TXT
index 98d53aaf39..db014d592d 100644
--- a/lib/tcpdf/README-MOODLE.TXT
+++ b/lib/tcpdf/README-MOODLE.TXT
@@ -1,7 +1,24 @@
Moodle-specific changes to TCPDF are tracked here.
+==================================================
-2008/07/29
-Upgrade to tcpdf_php5 TCPDF 4.0.015 (MDL-15055)
+2008/07/20
+==========
+Upgrade to tcpdf_php5 TCPDF 4.6.020 (MDL-19876)
+by David Mudrak
+
+* deleted cache/ doc/ examples/ config/tcpdf_config_alt.php config/lang/ images/
+* removed all fonts but the core ones (courier.php, helveticabi.php,
+ helveticab.php, helveticai.php, helvetica.php, symbol.php, timesbi.php,
+ timesb.php, timesi.php, times.php, zapfdingbats.php) and FreeFont
+* FreeFont chosen as a default utf8 font distributed by default, all others will
+ be downloadable from moodle.org via new UI
+* removed font/utils/
+* moving configuration to the lib/pdflib.php wrapper so we do not need to modify
+ TCPDF at all. Credit to Chardelle Busch for this solution in MDL-17179
+
+2008/07/29
+==========
+Upgrade to tcpdf_php5 TCPDF 4.0.015 (MDL-15055)
by David Mudrak
* deleted cache/ doc/ examples/
diff --git a/lib/tcpdf/README.TXT b/lib/tcpdf/README.TXT
index 8073c61800..dd573aabb5 100755
--- a/lib/tcpdf/README.TXT
+++ b/lib/tcpdf/README.TXT
@@ -1,91 +1,86 @@
-TCPDF - README
-============================================================
-
-IF YOU'D LIKE TO SUPPORT TCPDF, PLEASE CONSIDER MAKING A
-DONATION:
-http://sourceforge.net/donate/index.php?group_id=128076
-
-------------------------------------------------------------
-
-Name:
- TCPDF
-
-Version:
- 4.0.015
-
-Release date:
- 2008-07-29
-
-Author:
- Nicola Asuni
-
-Copyright (c) 2001-2008:
- Nicola Asuni
- Tecnick.com s.r.l.
- Via Della Pace, 11
- 09044 Quartucciu (CA)
- ITALY
- www.tecnick.com
-
-URLs:
- http://www.tcpdf.org
- http://www.sourceforge.net/projects/tcpdf
-
-Description:
- TCPDF is a PHP class for generating PDF files on-the-fly without requiring external extensions.
- TCPDF has been originally derived from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org).
-
-Main Features:
-// * no external libraries are required for the basic functions;
+TCPDF - README
+============================================================
+
+IF YOU'D LIKE TO SUPPORT TCPDF, PLEASE CONSIDER MAKING A
+DONATION:
+http://sourceforge.net/donate/index.php?group_id=128076
+
+------------------------------------------------------------
+
+Name: TCPDF
+Version: 4.6.020
+Release date: 2009-07-16
+Author: Nicola Asuni
+
+Copyright (c) 2001-2009:
+ Nicola Asuni
+ Tecnick.com s.r.l.
+ Via Della Pace, 11
+ 09044 Quartucciu (CA)
+ ITALY
+ www.tecnick.com
+
+URLs:
+ http://www.tcpdf.org
+ http://www.sourceforge.net/projects/tcpdf
+
+Description:
+ TCPDF is a PHP class for generating PDF files on-the-fly without requiring external extensions.
+ TCPDF has been originally derived from the Public Domain FPDF class by Olivier Plathey (http://www.fpdf.org).
+
+Main Features:
+// * no external libraries are required for the basic functions;
// * supports all ISO page formats;
+// * supports custom page formats, margins and units of measure;
// * supports UTF-8 Unicode and Right-To-Left languages;
-// * supports document encryption;
-// * includes methods to publish some XHTML code;
-// * includes graphic (geometric) and transformation methods;
-// * includes bookmarks;
-// * includes Javascript and forms support;
-// * includes a method to print various barcode formats;
-// * supports TrueTypeUnicode, TrueType, Type1 and CID-0 fonts;
-// * supports custom page formats, margins and units of measure;
-// * includes methods for page header and footer management;
-// * supports automatic page break;
-// * supports automatic page numbering and page groups;
-// * supports automatic line break and text justification;
-// * supports JPEG and PNG images whitout GD library and all images supported by GD: GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM;
-// * supports stroke and clipping mode for text;
-// * supports clipping masks;
-// * supports Grayscale, RGB and CMYK colors and transparency;
-// * supports links;
+// * supports TrueTypeUnicode, OpenTypeUnicode, TrueType, OpenType, Type1 and CID-0 fonts;
+// * supports document encryption;
+// * includes methods to publish some XHTML code;
+// * includes graphic (geometric) and transformation methods;
+// * includes Javascript and forms support;
+// * includes a method to print various barcode formats: CODE 39, ANSI MH10.8M-1983, USD-3, 3 of 9, CODE 93, USS-93, Standard 2 of 5, Interleaved 2 of 5, CODE 128 A/B/C, 2 and 5 Digits UPC-Based Extention, EAN 8, EAN 13, UPC-A, UPC-E, MSI, POSTNET, PLANET, RMS4CC (Royal Mail 4-state Customer Code), CBC (Customer Bar Code), KIX (Klant index - Customer index), Intelligent Mail Barcode, Onecode, USPS-B-3200, CODABAR, CODE 11, PHARMACODE, PHARMACODE TWO-TRACKS;
+// * includes methods to set Bookmarks and print a Table of Content;
+// * includes methods to move and delete pages;
+// * includes methods for automatic page header and footer management;
+// * supports automatic page break;
+// * supports automatic page numbering and page groups;
+// * supports automatic line break and text justification;
+// * supports JPEG and PNG images natively, all images supported by GD (GD, GD2, GD2PART, GIF, JPEG, PNG, BMP, XBM, XPM) and all images supported via ImagMagick (http://www.imagemagick.org/www/formats.html)
+// * supports stroke and clipping mode for text;
+// * supports clipping masks;
+// * supports Grayscale, RGB, CMYK, Spot Colors and Transparencies;
+// * supports several annotations, including links, text and file attachments;
// * supports page compression (requires zlib extension);
-// * supports PDF user's rights.
-
-Installation (full instructions on http://www.tcpdf.org):
- 1. copy the folder on your Web server
- 2. set your installation path on the config/tcpdf_config.php
- 3. call the example/example_001.php page with your browser to see an example
-
-Source Code Documentation:
- doc/index.html
-
-For Additional Documentation:
- http://www.tcpdf.org
-
-License
- Copyright (C) 2002-2008 Nicola Asuni - Tecnick.com S.r.l.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation, either version 2.1 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program. If not, see .
-
- See LICENSE.TXT file for more information.
-
-============================================================
\ No newline at end of file
+// * supports text hyphenation.
+// * supports transactions to UNDO commands.
+
+Installation (full instructions on http://www.tcpdf.org):
+ 1. copy the folder on your Web server
+ 2. set your installation path and other parameters on the config/tcpdf_config.php
+ 3. call the examples/example_001.php page with your browser to see an example
+
+Source Code Documentation:
+ doc/index.html
+
+For Additional Documentation:
+ http://www.tcpdf.org
+
+License
+ Copyright (C) 2002-2009 Nicola Asuni - Tecnick.com S.r.l.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation, either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program. If not, see .
+
+ See LICENSE.TXT file for more information.
+
+============================================================
diff --git a/lib/tcpdf/barcodes.php b/lib/tcpdf/barcodes.php
index 93256f32f1..1279c2e745 100644
--- a/lib/tcpdf/barcodes.php
+++ b/lib/tcpdf/barcodes.php
@@ -1,808 +1,1976 @@
-.
-//
-// See LICENSE.TXT file for more information.
-// ----------------------------------------------------------------------------
-//
-// Description : PHP class to creates array representations for
-// common 1D barcodes to be used with TCPDF.
-//
-// Author: Nicola Asuni
-//
-// (c) Copyright:
-// Nicola Asuni
-// Tecnick.com S.r.l.
-// Via della Pace, 11
-// 09044 Quartucciu (CA)
-// ITALY
-// www.tecnick.com
-// info@tecnick.com
-//============================================================+
-
-/**
- * PHP class to creates array representations for common 1D barcodes to be used with TCPDF.
- * @package com.tecnick.tcpdf
- * @abstract Functions for generating string representation of common 1D barcodes.
- * @author Nicola Asuni
- * @copyright 2008 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
- * @link http://www.tcpdf.org
- * @license http://www.gnu.org/copyleft/lesser.html LGPL
- * @version 1.0.001
- */
-
- /**
- * PHP class to creates array representations for common 1D barcodes to be used with TCPDF (http://www.tcpdf.org).
- * @name TCPDFBarcode
- * @package com.tecnick.tcpdf
- * @version 1.0.001
- * @author Nicola Asuni
- * @link http://www.tcpdf.org
- * @license http://www.gnu.org/copyleft/lesser.html LGPL
- */
-class TCPDFBarcode {
-
- /**
- * @var array representation of barcode.
- * @access protected
- */
- protected $barcode_array;
-
- /**
- * This is the class constructor.
- * Return an array representations for common 1D barcodes:
- * - $arrcode["code"] code to be printed on text label
- * - $arrcode["maxh"] max bar height
- * - $arrcode["maxw"] max bar width
- * - $arrcode["bcode"][$k] single bar or space in $k position
- * - $arrcode["bcode"][$k]["t"] bar type: true = bar, false = space.
- * - $arrcode["bcode"][$k]["w"] bar width in units.
- * - $arrcode["bcode"][$k]["h"] bar height in units.
- * - $arrcode["bcode"][$k]["p"] bar top position (0 = top, 1 = middle)
- * @param string $code code to print
- * @param string $type type of barcode: - C39 : CODE 39
- C39+ : CODE 39 with checksum
- C39E : CODE 39 EXTENDED
- C39E+ : CODE 39 EXTENDED with checksum
- I25 : Interleaved 2 of 5
- C128A : CODE 128 A
- C128B : CODE 128 B
- C128C : CODE 128 C
- EAN13 : EAN 13
- UPCA : UPC-A
- POSTNET : POSTNET
- CODABAR : CODABAR
- */
- public function __construct($code, $type) {
- $this->setBarcode($code, $type);
- }
-
- /**
- * Return an array representations of barcode.
- * @return array
- */
- public function getBarcodeArray() {
- return $this->barcode_array;
- }
-
- /**
- * Set the barcode.
- * @param string $code code to print
- * @param string $type type of barcode: - C39 : CODE 39
- C39+ : CODE 39 with checksum
- C39E : CODE 39 EXTENDED
- C39E+ : CODE 39 EXTENDED with checksum
- I25 : Interleaved 2 of 5
- C128A : CODE 128 A
- C128B : CODE 128 B
- C128C : CODE 128 C
- EAN13 : EAN 13
- UPCA : UPC-A
- POSTNET : POSTNET
- CODABAR : CODABAR
- * @return array
- */
- public function setBarcode($code, $type) {
- switch (strtoupper($type)) {
- case "C39": { // CODE 39
- $arrcode = $this->barcode_code39($code, false, false);
- break;
+.
+//
+// See LICENSE.TXT file for more information.
+// ----------------------------------------------------------------------------
+//
+// Description : PHP class to creates array representations for
+// common 1D barcodes to be used with TCPDF.
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright:
+// Nicola Asuni
+// Tecnick.com S.r.l.
+// Via della Pace, 11
+// 09044 Quartucciu (CA)
+// ITALY
+// www.tecnick.com
+// info@tecnick.com
+//============================================================+
+
+/**
+ * PHP class to creates array representations for common 1D barcodes to be used with TCPDF.
+ * @package com.tecnick.tcpdf
+ * @abstract Functions for generating string representation of common 1D barcodes.
+ * @author Nicola Asuni
+ * @copyright 2008-2009 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
+ * @link http://www.tcpdf.org
+ * @license http://www.gnu.org/copyleft/lesser.html LGPL
+ * @version 1.0.008
+ */
+
+ /**
+ * PHP class to creates array representations for common 1D barcodes to be used with TCPDF (http://www.tcpdf.org).
+ * @name TCPDFBarcode
+ * @package com.tecnick.tcpdf
+ * @version 1.0.008
+ * @author Nicola Asuni
+ * @link http://www.tcpdf.org
+ * @license http://www.gnu.org/copyleft/lesser.html LGPL
+ */
+class TCPDFBarcode {
+
+ /**
+ * @var array representation of barcode.
+ * @access protected
+ */
+ protected $barcode_array;
+
+ /**
+ * This is the class constructor.
+ * Return an array representations for common 1D barcodes:
+ * - $arrcode['code'] code to be printed on text label
+ * - $arrcode['maxh'] max bar height
+ * - $arrcode['maxw'] max bar width
+ * - $arrcode['bcode'][$k] single bar or space in $k position
+ * - $arrcode['bcode'][$k]['t'] bar type: true = bar, false = space.
+ * - $arrcode['bcode'][$k]['w'] bar width in units.
+ * - $arrcode['bcode'][$k]['h'] bar height in units.
+ * - $arrcode['bcode'][$k]['p'] bar top position (0 = top, 1 = middle)
+ * @param string $code code to print
+ * @param string $type type of barcode: - C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.
- C39+ : CODE 39 with checksum
- C39E : CODE 39 EXTENDED
- C39E+ : CODE 39 EXTENDED + CHECKSUM
- C93 : CODE 93 - USS-93
- S25 : Standard 2 of 5
- S25+ : Standard 2 of 5 + CHECKSUM
- I25 : Interleaved 2 of 5
- I25+ : Interleaved 2 of 5 + CHECKSUM
- C128A : CODE 128 A
- C128B : CODE 128 B
- C128C : CODE 128 C
- EAN2 : 2-Digits UPC-Based Extention
- EAN5 : 5-Digits UPC-Based Extention
- EAN8 : EAN 8
- EAN13 : EAN 13
- UPCA : UPC-A
- UPCE : UPC-E
- MSI : MSI (Variation of Plessey code)
- MSI+ : MSI + CHECKSUM (modulo 11)
- POSTNET : POSTNET
- PLANET : PLANET
- RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)
- KIX : KIX (Klant index - Customer index)
- IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200
- CODABAR : CODABAR
- CODE11 : CODE 11
- PHARMA : PHARMACODE
- PHARMA2T : PHARMACODE TWO-TRACKS
+ */
+ public function __construct($code, $type) {
+ $this->setBarcode($code, $type);
+ }
+
+ /**
+ * Return an array representations of barcode.
+ * @return array
+ */
+ public function getBarcodeArray() {
+ return $this->barcode_array;
+ }
+
+ /**
+ * Set the barcode.
+ * @param string $code code to print
+ * @param string $type type of barcode: - C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.
- C39+ : CODE 39 with checksum
- C39E : CODE 39 EXTENDED
- C39E+ : CODE 39 EXTENDED + CHECKSUM
- C93 : CODE 93 - USS-93
- S25 : Standard 2 of 5
- S25+ : Standard 2 of 5 + CHECKSUM
- I25 : Interleaved 2 of 5
- I25+ : Interleaved 2 of 5 + CHECKSUM
- C128A : CODE 128 A
- C128B : CODE 128 B
- C128C : CODE 128 C
- EAN2 : 2-Digits UPC-Based Extention
- EAN5 : 5-Digits UPC-Based Extention
- EAN8 : EAN 8
- EAN13 : EAN 13
- UPCA : UPC-A
- UPCE : UPC-E
- MSI : MSI (Variation of Plessey code)
- MSI+ : MSI + CHECKSUM (modulo 11)
- POSTNET : POSTNET
- PLANET : PLANET
- RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)
- KIX : KIX (Klant index - Customer index)
- IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200
- CODABAR : CODABAR
- CODE11 : CODE 11
- PHARMA : PHARMACODE
- PHARMA2T : PHARMACODE TWO-TRACKS
+ * @return array
+ */
+ public function setBarcode($code, $type) {
+ switch (strtoupper($type)) {
+ case 'C39': { // CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.
+ $arrcode = $this->barcode_code39($code, false, false);
+ break;
+ }
+ case 'C39+': { // CODE 39 with checksum
+ $arrcode = $this->barcode_code39($code, false, true);
+ break;
+ }
+ case 'C39E': { // CODE 39 EXTENDED
+ $arrcode = $this->barcode_code39($code, true, false);
+ break;
+ }
+ case 'C39E+': { // CODE 39 EXTENDED + CHECKSUM
+ $arrcode = $this->barcode_code39($code, true, true);
+ break;
}
- case "C39+": { // CODE 39 with checksum
- $arrcode = $this->barcode_code39($code, false, true);
- break;
+ case 'C93': { // CODE 93 - USS-93
+ $arrcode = $this->barcode_code93($code);
+ break;
+ }
+ case 'S25': { // Standard 2 of 5
+ $arrcode = $this->barcode_s25($code, false);
+ break;
+ }
+ case 'S25+': { // Standard 2 of 5 + CHECKSUM
+ $arrcode = $this->barcode_s25($code, true);
+ break;
+ }
+ case 'I25': { // Interleaved 2 of 5
+ $arrcode = $this->barcode_i25($code, false);
+ break;
+ }
+ case 'I25+': { // Interleaved 2 of 5 + CHECKSUM
+ $arrcode = $this->barcode_i25($code, true);
+ break;
+ }
+ case 'C128A': { // CODE 128 A
+ $arrcode = $this->barcode_c128($code, 'A');
+ break;
+ }
+ case 'C128B': { // CODE 128 B
+ $arrcode = $this->barcode_c128($code, 'B');
+ break;
+ }
+ case 'C128C': { // CODE 128 C
+ $arrcode = $this->barcode_c128($code, 'C');
+ break;
}
- case "C39E": { // CODE 39 EXTENDED
- $arrcode = $this->barcode_code39($code, true, false);
- break;
+ case 'EAN2': { // 2-Digits UPC-Based Extention
+ $arrcode = $this->barcode_eanext($code, 2);
+ break;
}
- case "C39E+": { // CODE 39 EXTENDED with checksum
- $arrcode = $this->barcode_code39($code, true, true);
- break;
+ case 'EAN5': { // 5-Digits UPC-Based Extention
+ $arrcode = $this->barcode_eanext($code, 5);
+ break;
}
- case "I25": { // Interleaved 2 of 5
- $arrcode = $this->barcode_i25($code);
- break;
+ case 'EAN8': { // EAN 8
+ $arrcode = $this->barcode_eanupc($code, 8);
+ break;
+ }
+ case 'EAN13': { // EAN 13
+ $arrcode = $this->barcode_eanupc($code, 13);
+ break;
+ }
+ case 'UPCA': { // UPC-A
+ $arrcode = $this->barcode_eanupc($code, 12);
+ break;
+ }
+ case 'UPCE': { // UPC-E
+ $arrcode = $this->barcode_eanupc($code, 6);
+ break;
}
- case "C128A": { // CODE 128 A
- $arrcode = $this->barcode_c128($code, "A");
- break;
+ case 'MSI': { // MSI (Variation of Plessey code)
+ $arrcode = $this->barcode_msi($code, false);
+ break;
}
- case "C128B": { // CODE 128 B
- $arrcode = $this->barcode_c128($code, "B");
- break;
+ case 'MSI+': { // MSI + CHECKSUM (modulo 11)
+ $arrcode = $this->barcode_msi($code, true);
+ break;
+ }
+ case 'POSTNET': { // POSTNET
+ $arrcode = $this->barcode_postnet($code, false);
+ break;
}
- case "C128C": { // CODE 128 C
- $arrcode = $this->barcode_c128($code, "C");
- break;
+ case 'PLANET': { // PLANET
+ $arrcode = $this->barcode_postnet($code, true);
+ break;
}
- case "EAN13": { // EAN 13
- $arrcode = $this->barcode_ean13($code, 13);
- break;
+ case 'RMS4CC': { // RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)
+ $arrcode = $this->barcode_rms4cc($code, false);
+ break;
}
- case "UPCA": { // UPC-A
- $arrcode = $this->barcode_ean13($code, 12);
- break;
+ case 'KIX': { // KIX (Klant index - Customer index)
+ $arrcode = $this->barcode_rms4cc($code, true);
+ break;
}
- case "POSTNET": { // POSTNET
- $arrcode = $this->barcode_postnet($code);
- break;
+ case 'IMB': { // IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200
+ $arrcode = $this->barcode_imb($code);
+ break;
+ }
+ case 'CODABAR': { // CODABAR
+ $arrcode = $this->barcode_codabar($code);
+ break;
}
- case "CODABAR": { // CODABAR
- $arrcode = $this->barcode_codabar($code);
- break;
+ case 'CODE11': { // CODE 11
+ $arrcode = $this->barcode_code11($code);
+ break;
}
- default: {
- $this->barcode_array = false;
+ case 'PHARMA': { // PHARMACODE
+ $arrcode = $this->barcode_pharmacode($code);
+ break;
}
- }
- $this->barcode_array = $arrcode;
- }
-
- /**
- * CODE 39
- * @param string $code code to represent.
- * @param boolean $checksum if true add a checksum to the code
- * @return array barcode representation.
- * @access protected
- */
- protected function barcode_code39($code, $extended=false, $checksum=false) {
- $chr['0'] = '111221211';
- $chr['1'] = '211211112';
- $chr['2'] = '112211112';
- $chr['3'] = '212211111';
- $chr['4'] = '111221112';
- $chr['5'] = '211221111';
- $chr['6'] = '112221111';
- $chr['7'] = '111211212';
- $chr['8'] = '211211211';
- $chr['9'] = '112211211';
- $chr['A'] = '211112112';
- $chr['B'] = '112112112';
- $chr['C'] = '212112111';
- $chr['D'] = '111122112';
- $chr['E'] = '211122111';
- $chr['F'] = '112122111';
- $chr['G'] = '111112212';
- $chr['H'] = '211112211';
- $chr['I'] = '112112211';
- $chr['J'] = '111122211';
- $chr['K'] = '211111122';
- $chr['L'] = '112111122';
- $chr['M'] = '212111121';
- $chr['N'] = '111121122';
- $chr['O'] = '211121121';
- $chr['P'] = '112121121';
- $chr['Q'] = '111111222';
- $chr['R'] = '211111221';
- $chr['S'] = '112111221';
- $chr['T'] = '111121221';
- $chr['U'] = '221111112';
- $chr['V'] = '122111112';
- $chr['W'] = '222111111';
- $chr['X'] = '121121112';
- $chr['Y'] = '221121111';
- $chr['Z'] = '122121111';
- $chr['-'] = '121111212';
- $chr['.'] = '221111211';
- $chr[' '] = '122111211';
- $chr['*'] = '121121211';
- $chr['$'] = '121212111';
- $chr['/'] = '121211121';
- $chr['+'] = '121112121';
+ case 'PHARMA2T': { // PHARMACODE TWO-TRACKS
+ $arrcode = $this->barcode_pharmacode2t($code);
+ break;
+ }
+ default: {
+ $this->barcode_array = false;
+ }
+ }
+ $this->barcode_array = $arrcode;
+ }
+
+ /**
+ * CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.
+ * General-purpose code in very wide use world-wide
+ * @param string $code code to represent.
+ * @param boolean $checksum if true add a checksum to the code
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_code39($code, $extended=false, $checksum=false) {
+ $chr['0'] = '111221211';
+ $chr['1'] = '211211112';
+ $chr['2'] = '112211112';
+ $chr['3'] = '212211111';
+ $chr['4'] = '111221112';
+ $chr['5'] = '211221111';
+ $chr['6'] = '112221111';
+ $chr['7'] = '111211212';
+ $chr['8'] = '211211211';
+ $chr['9'] = '112211211';
+ $chr['A'] = '211112112';
+ $chr['B'] = '112112112';
+ $chr['C'] = '212112111';
+ $chr['D'] = '111122112';
+ $chr['E'] = '211122111';
+ $chr['F'] = '112122111';
+ $chr['G'] = '111112212';
+ $chr['H'] = '211112211';
+ $chr['I'] = '112112211';
+ $chr['J'] = '111122211';
+ $chr['K'] = '211111122';
+ $chr['L'] = '112111122';
+ $chr['M'] = '212111121';
+ $chr['N'] = '111121122';
+ $chr['O'] = '211121121';
+ $chr['P'] = '112121121';
+ $chr['Q'] = '111111222';
+ $chr['R'] = '211111221';
+ $chr['S'] = '112111221';
+ $chr['T'] = '111121221';
+ $chr['U'] = '221111112';
+ $chr['V'] = '122111112';
+ $chr['W'] = '222111111';
+ $chr['X'] = '121121112';
+ $chr['Y'] = '221121111';
+ $chr['Z'] = '122121111';
+ $chr['-'] = '121111212';
+ $chr['.'] = '221111211';
+ $chr[' '] = '122111211';
+ $chr['$'] = '121212111';
+ $chr['/'] = '121211121';
+ $chr['+'] = '121112121';
$chr['%'] = '111212121';
-
+ $chr['*'] = '121121211';
+
+ $code = strtoupper($code);
+ if ($extended) {
+ // extended mode
+ $code = $this->encode_code39_ext($code);
+ }
+ if ($code === false) {
+ return false;
+ }
+ if ($checksum) {
+ // checksum
+ $code .= $this->checksum_code39($code);
+ }
+ // add start and stop codes
+ $code = '*'.$code.'*';
+
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+ $k = 0;
+ $clen = strlen($code);
+ for ($i = 0; $i < $clen; ++$i) {
+ $char = $code{$i};
+ if(!isset($chr[$char])) {
+ // invalid character
+ return false;
+ }
+ for ($j = 0; $j < 9; ++$j) {
+ if (($j % 2) == 0) {
+ $t = true; // bar
+ } else {
+ $t = false; // space
+ }
+ $w = $chr[$char]{$j};
+ $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+ $bararray['maxw'] += $w;
+ ++$k;
+ }
+ $bararray['bcode'][$k] = array('t' => false, 'w' => 1, 'h' => 1, 'p' => 0);
+ $bararray['maxw'] += 1;
+ ++$k;
+ }
+ return $bararray;
+ }
+
+ /**
+ * Encode a string to be used for CODE 39 Extended mode.
+ * @param string $code code to represent.
+ * @return encoded string.
+ * @access protected
+ */
+ protected function encode_code39_ext($code) {
+ $encode = array(
+ chr(0) => '%U', chr(1) => '$A', chr(2) => '$B', chr(3) => '$C',
+ chr(4) => '$D', chr(5) => '$E', chr(6) => '$F', chr(7) => '$G',
+ chr(8) => '$H', chr(9) => '$I', chr(10) => '$J', chr(11) => '£K',
+ chr(12) => '$L', chr(13) => '$M', chr(14) => '$N', chr(15) => '$O',
+ chr(16) => '$P', chr(17) => '$Q', chr(18) => '$R', chr(19) => '$S',
+ chr(20) => '$T', chr(21) => '$U', chr(22) => '$V', chr(23) => '$W',
+ chr(24) => '$X', chr(25) => '$Y', chr(26) => '$Z', chr(27) => '%A',
+ chr(28) => '%B', chr(29) => '%C', chr(30) => '%D', chr(31) => '%E',
+ chr(32) => ' ', chr(33) => '/A', chr(34) => '/B', chr(35) => '/C',
+ chr(36) => '/D', chr(37) => '/E', chr(38) => '/F', chr(39) => '/G',
+ chr(40) => '/H', chr(41) => '/I', chr(42) => '/J', chr(43) => '/K',
+ chr(44) => '/L', chr(45) => '-', chr(46) => '.', chr(47) => '/O',
+ chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3',
+ chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7',
+ chr(56) => '8', chr(57) => '9', chr(58) => '/Z', chr(59) => '%F',
+ chr(60) => '%G', chr(61) => '%H', chr(62) => '%I', chr(63) => '%J',
+ chr(64) => '%V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C',
+ chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G',
+ chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K',
+ chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O',
+ chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S',
+ chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W',
+ chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => '%K',
+ chr(92) => '%L', chr(93) => '%M', chr(94) => '%N', chr(95) => '%O',
+ chr(96) => '%W', chr(97) => '+A', chr(98) => '+B', chr(99) => '+C',
+ chr(100) => '+D', chr(101) => '+E', chr(102) => '+F', chr(103) => '+G',
+ chr(104) => '+H', chr(105) => '+I', chr(106) => '+J', chr(107) => '+K',
+ chr(108) => '+L', chr(109) => '+M', chr(110) => '+N', chr(111) => '+O',
+ chr(112) => '+P', chr(113) => '+Q', chr(114) => '+R', chr(115) => '+S',
+ chr(116) => '+T', chr(117) => '+U', chr(118) => '+V', chr(119) => '+W',
+ chr(120) => '+X', chr(121) => '+Y', chr(122) => '+Z', chr(123) => '%P',
+ chr(124) => '%Q', chr(125) => '%R', chr(126) => '%S', chr(127) => '%T');
+ $code_ext = '';
+ $clen = strlen($code);
+ for ($i = 0 ; $i < $clen; ++$i) {
+ if (ord($code{$i}) > 127) {
+ return false;
+ }
+ $code_ext .= $encode[$code{$i}];
+ }
+ return $code_ext;
+ }
+
+ /**
+ * Calculate CODE 39 checksum (modulo 43).
+ * @param string $code code to represent.
+ * @return char checksum.
+ * @access protected
+ */
+ protected function checksum_code39($code) {
+ $chars = array(
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
+ 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%');
+ $sum = 0;
+ $clen = strlen($code);
+ for ($i = 0 ; $i < $clen; ++$i) {
+ $k = array_keys($chars, $code{$i});
+ $sum += $k[0];
+ }
+ $j = ($sum % 43);
+ return $chars[$j];
+ }
+
+ /**
+ * CODE 93 - USS-93
+ * Compact code similar to Code 39
+ * @param string $code code to represent.
+ * @param boolean $checksum if true add a checksum to the code
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_code93($code) {
+ $chr['0'] = '131112';
+ $chr['1'] = '111213';
+ $chr['2'] = '111312';
+ $chr['3'] = '111411';
+ $chr['4'] = '121113';
+ $chr['5'] = '121212';
+ $chr['6'] = '121311';
+ $chr['7'] = '111114';
+ $chr['8'] = '131211';
+ $chr['9'] = '141111';
+ $chr['A'] = '211113';
+ $chr['B'] = '211212';
+ $chr['C'] = '211311';
+ $chr['D'] = '221112';
+ $chr['E'] = '221211';
+ $chr['F'] = '231111';
+ $chr['G'] = '112113';
+ $chr['H'] = '112212';
+ $chr['I'] = '112311';
+ $chr['J'] = '122112';
+ $chr['K'] = '132111';
+ $chr['L'] = '111123';
+ $chr['M'] = '111222';
+ $chr['N'] = '111321';
+ $chr['O'] = '121122';
+ $chr['P'] = '131121';
+ $chr['Q'] = '212112';
+ $chr['R'] = '212211';
+ $chr['S'] = '211122';
+ $chr['T'] = '211221';
+ $chr['U'] = '221121';
+ $chr['V'] = '222111';
+ $chr['W'] = '112122';
+ $chr['X'] = '112221';
+ $chr['Y'] = '122121';
+ $chr['Z'] = '123111';
+ $chr['-'] = '121131';
+ $chr['.'] = '311112';
+ $chr[' '] = '311211';
+ $chr['$'] = '321111';
+ $chr['/'] = '112131';
+ $chr['+'] = '113121';
+ $chr['%'] = '211131';
+ $chr[128] = '121221'; // ($)
+ $chr[129] = '311121'; // (/)
+ $chr[130] = '122211'; // (+)
+ $chr[131] = '312111'; // (%)
+ $chr['*'] = '111141';
$code = strtoupper($code);
- if ($extended) {
- // extended mode
- $code = $this->encode_code39_ext($code);
- }
- if ($code === false) {
- return false;
- }
- if ($checksum) {
- // checksum
- $code .= $this->checksum_code39($code);
- }
- // add start and stop codes
- $code = "*".$code."*";
-
- $bararray = array("code" => $code, "maxw" => 0, "maxh" => 1, "bcode" => array());
+ $encode = array(
+ chr(0) => chr(131).'U', chr(1) => chr(128).'A', chr(2) => chr(128).'B', chr(3) => chr(128).'C',
+ chr(4) => chr(128).'D', chr(5) => chr(128).'E', chr(6) => chr(128).'F', chr(7) => chr(128).'G',
+ chr(8) => chr(128).'H', chr(9) => chr(128).'I', chr(10) => chr(128).'J', chr(11) => '£K',
+ chr(12) => chr(128).'L', chr(13) => chr(128).'M', chr(14) => chr(128).'N', chr(15) => chr(128).'O',
+ chr(16) => chr(128).'P', chr(17) => chr(128).'Q', chr(18) => chr(128).'R', chr(19) => chr(128).'S',
+ chr(20) => chr(128).'T', chr(21) => chr(128).'U', chr(22) => chr(128).'V', chr(23) => chr(128).'W',
+ chr(24) => chr(128).'X', chr(25) => chr(128).'Y', chr(26) => chr(128).'Z', chr(27) => chr(131).'A',
+ chr(28) => chr(131).'B', chr(29) => chr(131).'C', chr(30) => chr(131).'D', chr(31) => chr(131).'E',
+ chr(32) => ' ', chr(33) => chr(129).'A', chr(34) => chr(129).'B', chr(35) => chr(129).'C',
+ chr(36) => chr(129).'D', chr(37) => chr(129).'E', chr(38) => chr(129).'F', chr(39) => chr(129).'G',
+ chr(40) => chr(129).'H', chr(41) => chr(129).'I', chr(42) => chr(129).'J', chr(43) => chr(129).'K',
+ chr(44) => chr(129).'L', chr(45) => '-', chr(46) => '.', chr(47) => chr(129).'O',
+ chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3',
+ chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7',
+ chr(56) => '8', chr(57) => '9', chr(58) => chr(129).'Z', chr(59) => chr(131).'F',
+ chr(60) => chr(131).'G', chr(61) => chr(131).'H', chr(62) => chr(131).'I', chr(63) => chr(131).'J',
+ chr(64) => chr(131).'V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C',
+ chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G',
+ chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K',
+ chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O',
+ chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S',
+ chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W',
+ chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => chr(131).'K',
+ chr(92) => chr(131).'L', chr(93) => chr(131).'M', chr(94) => chr(131).'N', chr(95) => chr(131).'O',
+ chr(96) => chr(131).'W', chr(97) => chr(130).'A', chr(98) => chr(130).'B', chr(99) => chr(130).'C',
+ chr(100) => chr(130).'D', chr(101) => chr(130).'E', chr(102) => chr(130).'F', chr(103) => chr(130).'G',
+ chr(104) => chr(130).'H', chr(105) => chr(130).'I', chr(106) => chr(130).'J', chr(107) => chr(130).'K',
+ chr(108) => chr(130).'L', chr(109) => chr(130).'M', chr(110) => chr(130).'N', chr(111) => chr(130).'O',
+ chr(112) => chr(130).'P', chr(113) => chr(130).'Q', chr(114) => chr(130).'R', chr(115) => chr(130).'S',
+ chr(116) => chr(130).'T', chr(117) => chr(130).'U', chr(118) => chr(130).'V', chr(119) => chr(130).'W',
+ chr(120) => chr(130).'X', chr(121) => chr(130).'Y', chr(122) => chr(130).'Z', chr(123) => chr(131).'P',
+ chr(124) => chr(131).'Q', chr(125) => chr(131).'R', chr(126) => chr(131).'S', chr(127) => chr(131).'T');
+ $code_ext = '';
+ $clen = strlen($code);
+ for ($i = 0 ; $i < $clen; ++$i) {
+ if (ord($code{$i}) > 127) {
+ return false;
+ }
+ $code_ext .= $encode[$code{$i}];
+ }
+ // checksum
+ $code .= $this->checksum_code93($code);
+ // add start and stop codes
+ $code = '*'.$code.'*';
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
$k = 0;
- for($i=0; $i < strlen($code); $i++) {
- $char = $code{$i};
- if(!isset($chr[$char])) {
- // invalid character
- return false;
+ $clen = strlen($code);
+ for ($i = 0; $i < $clen; ++$i) {
+ $char = $code{$i};
+ if(!isset($chr[$char])) {
+ // invalid character
+ return false;
+ }
+ for ($j = 0; $j < 6; ++$j) {
+ if (($j % 2) == 0) {
+ $t = true; // bar
+ } else {
+ $t = false; // space
+ }
+ $w = $chr[$char]{$j};
+ $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+ $bararray['maxw'] += $w;
+ ++$k;
+ }
+ }
+ $bararray['bcode'][$k] = array('t' => true, 'w' => 1, 'h' => 1, 'p' => 0);
+ $bararray['maxw'] += 1;
+ ++$k;
+ return $bararray;
+ }
+
+ /**
+ * Calculate CODE 93 checksum (modulo 47).
+ * @param string $code code to represent.
+ * @return string checksum code.
+ * @access protected
+ */
+ protected function checksum_code93($code) {
+ $chars = array(
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
+ 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
+ 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%');
+ // translate special characters
+ $code = strtr($code, chr(128).chr(129).chr(130).chr(131), '$/+%');
+ $len = strlen($code);
+ // calculate check digit C
+ $p = 1;
+ $check = 0;
+ for ($i = ($len - 1); $i >= 0; --$i) {
+ $k = array_keys($chars, $code{$i});
+ $check += ($k[0] * $p);
+ ++$p;
+ if ($p > 20) {
+ $p = 1;
}
- for($j=0; $j < 9; $j++) {
- if (($j % 2) == 0) {
- $t = true; // bar
- } else {
- $t = false; // space
- }
- $w = $chr[$char]{$j};
- $bararray["bcode"][$k] = array("t" => $t, "w" => $w, "h" => 1, "p" => 0);
- $bararray["maxw"] += $w;
- $k++;
+ }
+ $check %= 47;
+ $c = $chars[$check];
+ $code .= $c;
+ // calculate check digit K
+ $p = 1;
+ $check = 0;
+ for ($i = $len; $i >= 0; --$i) {
+ $k = array_keys($chars, $code{$i});
+ $check += ($k[0] * $p);
+ ++$p;
+ if ($p > 15) {
+ $p = 1;
}
- $bararray["bcode"][$k] = array("t" => false, "w" => 1, "h" => 1, "p" => 0);
- $bararray["maxw"] += 1;
- $k++;
}
- return $bararray;
+ $check %= 47;
+ $k = $chars[$check];
+ return $c.$k;
+ }
+
+ /**
+ * Checksum for standard 2 of 5 barcodes.
+ * @param string $code code to process.
+ * @return int checksum.
+ * @access protected
+ */
+ protected function checksum_s25($code) {
+ $len = strlen($code);
+ $sum = 0;
+ for ($i = 0; $i < $len; $i+=2) {
+ $sum += $code{$i};
+ }
+ $sum *= 3;
+ for ($i = 1; $i < $len; $i+=2) {
+ $sum += ($code{$i});
+ }
+ $r = $sum % 10;
+ if($r > 0) {
+ $r = (10 - $r);
+ }
+ return $r;
}
- /**
- * Encode a string to be used for CODE 39 Extended mode.
+ /**
+ * MSI.
+ * Variation of Plessey code, with similar applications
+ * Contains digits (0 to 9) and encodes the data only in the width of bars.
* @param string $code code to represent.
- * @return encoded string.
- * @access protected
- */
- protected function encode_code39_ext($code) {
- $encode = array(
- chr(0) => '%U', chr(1) => '$A', chr(2) => '$B', chr(3) => '$C',
- chr(4) => '$D', chr(5) => '$E', chr(6) => '$F', chr(7) => '$G',
- chr(8) => '$H', chr(9) => '$I', chr(10) => '$J', chr(11) => '£K',
- chr(12) => '$L', chr(13) => '$M', chr(14) => '$N', chr(15) => '$O',
- chr(16) => '$P', chr(17) => '$Q', chr(18) => '$R', chr(19) => '$S',
- chr(20) => '$T', chr(21) => '$U', chr(22) => '$V', chr(23) => '$W',
- chr(24) => '$X', chr(25) => '$Y', chr(26) => '$Z', chr(27) => '%A',
- chr(28) => '%B', chr(29) => '%C', chr(30) => '%D', chr(31) => '%E',
- chr(32) => ' ', chr(33) => '/A', chr(34) => '/B', chr(35) => '/C',
- chr(36) => '/D', chr(37) => '/E', chr(38) => '/F', chr(39) => '/G',
- chr(40) => '/H', chr(41) => '/I', chr(42) => '/J', chr(43) => '/K',
- chr(44) => '/L', chr(45) => '-', chr(46) => '.', chr(47) => '/O',
- chr(48) => '0', chr(49) => '1', chr(50) => '2', chr(51) => '3',
- chr(52) => '4', chr(53) => '5', chr(54) => '6', chr(55) => '7',
- chr(56) => '8', chr(57) => '9', chr(58) => '/Z', chr(59) => '%F',
- chr(60) => '%G', chr(61) => '%H', chr(62) => '%I', chr(63) => '%J',
- chr(64) => '%V', chr(65) => 'A', chr(66) => 'B', chr(67) => 'C',
- chr(68) => 'D', chr(69) => 'E', chr(70) => 'F', chr(71) => 'G',
- chr(72) => 'H', chr(73) => 'I', chr(74) => 'J', chr(75) => 'K',
- chr(76) => 'L', chr(77) => 'M', chr(78) => 'N', chr(79) => 'O',
- chr(80) => 'P', chr(81) => 'Q', chr(82) => 'R', chr(83) => 'S',
- chr(84) => 'T', chr(85) => 'U', chr(86) => 'V', chr(87) => 'W',
- chr(88) => 'X', chr(89) => 'Y', chr(90) => 'Z', chr(91) => '%K',
- chr(92) => '%L', chr(93) => '%M', chr(94) => '%N', chr(95) => '%O',
- chr(96) => '%W', chr(97) => '+A', chr(98) => '+B', chr(99) => '+C',
- chr(100) => '+D', chr(101) => '+E', chr(102) => '+F', chr(103) => '+G',
- chr(104) => '+H', chr(105) => '+I', chr(106) => '+J', chr(107) => '+K',
- chr(108) => '+L', chr(109) => '+M', chr(110) => '+N', chr(111) => '+O',
- chr(112) => '+P', chr(113) => '+Q', chr(114) => '+R', chr(115) => '+S',
- chr(116) => '+T', chr(117) => '+U', chr(118) => '+V', chr(119) => '+W',
- chr(120) => '+X', chr(121) => '+Y', chr(122) => '+Z', chr(123) => '%P',
- chr(124) => '%Q', chr(125) => '%R', chr(126) => '%S', chr(127) => '%T');
- $code_ext = '';
- for ($i = 0 ; $i < strlen($code); $i++) {
- if (ord($code{$i}) > 127) {
- return false;
+ * @param boolean $checksum if true add a checksum to the code (modulo 11)
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_msi($code, $checksum=false) {
+ $chr['0'] = '100100100100';
+ $chr['1'] = '100100100110';
+ $chr['2'] = '100100110100';
+ $chr['3'] = '100100110110';
+ $chr['4'] = '100110100100';
+ $chr['5'] = '100110100110';
+ $chr['6'] = '100110110100';
+ $chr['7'] = '100110110110';
+ $chr['8'] = '110100100100';
+ $chr['9'] = '110100100110';
+ $chr['A'] = '110100110100';
+ $chr['B'] = '110100110110';
+ $chr['C'] = '110110100100';
+ $chr['D'] = '110110100110';
+ $chr['E'] = '110110110100';
+ $chr['F'] = '110110110110';
+ if ($checksum) {
+ // add checksum
+ $clen = strlen($code);
+ $p = 2;
+ $check = 0;
+ for ($i = ($clen - 1); $i >= 0; --$i) {
+ $check += (hexdec($code{$i}) * $p);
+ ++$p;
+ if ($p > 7) {
+ $p = 2;
+ }
}
- $code_ext .= $encode[$code{$i}];
+ $check %= 11;
+ if ($check > 0) {
+ $check = 11 - $check;
+ }
+ $code .= $check;
}
- return $code_ext;
+ $seq = '110'; // left guard
+ $clen = strlen($code);
+ for ($i = 0; $i < $clen; ++$i) {
+ $digit = $code{$i};
+ if (!isset($chr[$digit])) {
+ // invalid character
+ return false;
+ }
+ $seq .= $chr[$digit];
+ }
+ $seq .= '1001'; // right guard
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+ return $this->binseq_to_array($seq, $bararray);
}
-
- /**
- * Calculate CODE 39 checksum (modulo 43).
+
+ /**
+ * Standard 2 of 5 barcodes.
+ * Used in airline ticket marking, photofinishing
+ * Contains digits (0 to 9) and encodes the data only in the width of bars.
* @param string $code code to represent.
- * @return char checksum.
- * @access protected
- */
- protected function checksum_code39($code) {
- $chars = array(
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
- 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
- 'W', 'X', 'Y', 'Z', '-', '.', ' ', '$', '/', '+', '%');
- $sum = 0;
- for ($i=0 ; $i < strlen($code); $i++) {
- $k = array_keys($chars, $code{$i});
- $sum += $k[0];
+ * @param boolean $checksum if true add a checksum to the code
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_s25($code, $checksum=false) {
+ $chr['0'] = '10101110111010';
+ $chr['1'] = '11101010101110';
+ $chr['2'] = '10111010101110';
+ $chr['3'] = '11101110101010';
+ $chr['4'] = '10101110101110';
+ $chr['5'] = '11101011101010';
+ $chr['6'] = '10111011101010';
+ $chr['7'] = '10101011101110';
+ $chr['8'] = '10101110111010';
+ $chr['9'] = '10111010111010';
+ if ($checksum) {
+ // add checksum
+ $code .= $this->checksum_s25($code);
+ }
+ if((strlen($code) % 2) != 0) {
+ // add leading zero if code-length is odd
+ $code = '0'.$code;
}
- $j = ($sum % 43);
- return $chars[$j];
+ $seq = '11011010';
+ $clen = strlen($code);
+ for ($i = 0; $i < $clen; ++$i) {
+ $digit = $code{$i};
+ if (!isset($chr[$digit])) {
+ // invalid character
+ return false;
+ }
+ $seq .= $chr[$digit];
+ }
+ $seq .= '1101011';
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+ return $this->binseq_to_array($seq, $bararray);
}
-
- /**
- * Interleaved 2 of 5 barcodes.
- * Contains digits (0 to 9) and encodes the data in the width of both bars and spaces.
- * @param string $code code to represent.
- * @param boolean $checksum if true add a checksum to the code
- * @return array barcode representation.
- * @access protected
- */
- protected function barcode_i25($code) {
- $chr['0'] = '11221';
- $chr['1'] = '21112';
- $chr['2'] = '12112';
- $chr['3'] = '22111';
- $chr['4'] = '11212';
- $chr['5'] = '21211';
- $chr['6'] = '12211';
- $chr['7'] = '11122';
- $chr['8'] = '21121';
- $chr['9'] = '12121';
- $chr['A'] = '11';
+
+ /**
+ * Convert binary barcode sequence to TCPDF barcode array
+ * @param string $seq barcode as binary sequence
+ * òparam array $bararray TCPDF barcode array to fill up
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function binseq_to_array($seq, $bararray) {
+ $len = strlen($seq);
+ $w = 0;
+ $k = 0;
+ for ($i = 0; $i < $len; ++$i) {
+ $w += 1;
+ if (($i == ($len - 1)) OR (($i < ($len - 1)) AND ($seq{$i} != $seq{($i+1)}))) {
+ if ($seq{$i} == '1') {
+ $t = true; // bar
+ } else {
+ $t = false; // space
+ }
+ $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+ $bararray['maxw'] += $w;
+ ++$k;
+ $w = 0;
+ }
+ }
+ return $bararray;
+ }
+
+ /**
+ * Interleaved 2 of 5 barcodes.
+ * Compact numeric code, widely used in industry, air cargo
+ * Contains digits (0 to 9) and encodes the data in the width of both bars and spaces.
+ * @param string $code code to represent.
+ * @param boolean $checksum if true add a checksum to the code
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_i25($code, $checksum=false) {
+ $chr['0'] = '11221';
+ $chr['1'] = '21112';
+ $chr['2'] = '12112';
+ $chr['3'] = '22111';
+ $chr['4'] = '11212';
+ $chr['5'] = '21211';
+ $chr['6'] = '12211';
+ $chr['7'] = '11122';
+ $chr['8'] = '21121';
+ $chr['9'] = '12121';
+ $chr['A'] = '11';
$chr['Z'] = '21';
-
- if((strlen($code) % 2) != 0) {
- // add leading zero if code-length is odd
- $code = '0'.$code;
+ if ($checksum) {
+ // add checksum
+ $code .= $this->checksum_s25($code);
}
- // add start and stop codes
- $code = 'AA'.strtolower($code).'ZA';
-
- $bararray = array("code" => $code, "maxw" => 0, "maxh" => 1, "bcode" => array());
+ if((strlen($code) % 2) != 0) {
+ // add leading zero if code-length is odd
+ $code = '0'.$code;
+ }
+ // add start and stop codes
+ $code = 'AA'.strtolower($code).'ZA';
+
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
$k = 0;
- for($i=0; $i < strlen($code); $i=$i+2) {
- $char_bar = $code{$i};
- $char_space = $code{$i+1};
- if((!isset($chr[$char_bar])) OR (!isset($chr[$char_space]))) {
- // invalid character
- return false;
- }
- // create a bar-space sequence
- $seq = "";
- for($s=0; $s < strlen($chr[$char_bar]); $s++){
- $seq .= $chr[$char_bar]{$s} . $chr[$char_space]{$s};
+ $clen = strlen($code);
+ for ($i = 0; $i < $clen; $i = ($i + 2)) {
+ $char_bar = $code{$i};
+ $char_space = $code{$i+1};
+ if((!isset($chr[$char_bar])) OR (!isset($chr[$char_space]))) {
+ // invalid character
+ return false;
+ }
+ // create a bar-space sequence
+ $seq = '';
+ $chrlen = strlen($chr[$char_bar]);
+ for ($s = 0; $s < $chrlen; $s++){
+ $seq .= $chr[$char_bar]{$s} . $chr[$char_space]{$s};
}
- for($j=0; $j < strlen($seq); $j++) {
- if (($j % 2) == 0) {
- $t = true; // bar
+ $seqlen = strlen($seq);
+ for ($j = 0; $j < $seqlen; ++$j) {
+ if (($j % 2) == 0) {
+ $t = true; // bar
+ } else {
+ $t = false; // space
+ }
+ $w = $seq{$j};
+ $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+ $bararray['maxw'] += $w;
+ ++$k;
+ }
+ }
+ return $bararray;
+ }
+
+ /**
+ * C128 barcodes.
+ * Very capable code, excellent density, high reliability; in very wide use world-wide
+ * @param string $code code to represent.
+ * @param string $type barcode type: A, B or C
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_c128($code, $type='B') {
+ $chr = array(
+ '212222', /* 00 */
+ '222122', /* 01 */
+ '222221', /* 02 */
+ '121223', /* 03 */
+ '121322', /* 04 */
+ '131222', /* 05 */
+ '122213', /* 06 */
+ '122312', /* 07 */
+ '132212', /* 08 */
+ '221213', /* 09 */
+ '221312', /* 10 */
+ '231212', /* 11 */
+ '112232', /* 12 */
+ '122132', /* 13 */
+ '122231', /* 14 */
+ '113222', /* 15 */
+ '123122', /* 16 */
+ '123221', /* 17 */
+ '223211', /* 18 */
+ '221132', /* 19 */
+ '221231', /* 20 */
+ '213212', /* 21 */
+ '223112', /* 22 */
+ '312131', /* 23 */
+ '311222', /* 24 */
+ '321122', /* 25 */
+ '321221', /* 26 */
+ '312212', /* 27 */
+ '322112', /* 28 */
+ '322211', /* 29 */
+ '212123', /* 30 */
+ '212321', /* 31 */
+ '232121', /* 32 */
+ '111323', /* 33 */
+ '131123', /* 34 */
+ '131321', /* 35 */
+ '112313', /* 36 */
+ '132113', /* 37 */
+ '132311', /* 38 */
+ '211313', /* 39 */
+ '231113', /* 40 */
+ '231311', /* 41 */
+ '112133', /* 42 */
+ '112331', /* 43 */
+ '132131', /* 44 */
+ '113123', /* 45 */
+ '113321', /* 46 */
+ '133121', /* 47 */
+ '313121', /* 48 */
+ '211331', /* 49 */
+ '231131', /* 50 */
+ '213113', /* 51 */
+ '213311', /* 52 */
+ '213131', /* 53 */
+ '311123', /* 54 */
+ '311321', /* 55 */
+ '331121', /* 56 */
+ '312113', /* 57 */
+ '312311', /* 58 */
+ '332111', /* 59 */
+ '314111', /* 60 */
+ '221411', /* 61 */
+ '431111', /* 62 */
+ '111224', /* 63 */
+ '111422', /* 64 */
+ '121124', /* 65 */
+ '121421', /* 66 */
+ '141122', /* 67 */
+ '141221', /* 68 */
+ '112214', /* 69 */
+ '112412', /* 70 */
+ '122114', /* 71 */
+ '122411', /* 72 */
+ '142112', /* 73 */
+ '142211', /* 74 */
+ '241211', /* 75 */
+ '221114', /* 76 */
+ '413111', /* 77 */
+ '241112', /* 78 */
+ '134111', /* 79 */
+ '111242', /* 80 */
+ '121142', /* 81 */
+ '121241', /* 82 */
+ '114212', /* 83 */
+ '124112', /* 84 */
+ '124211', /* 85 */
+ '411212', /* 86 */
+ '421112', /* 87 */
+ '421211', /* 88 */
+ '212141', /* 89 */
+ '214121', /* 90 */
+ '412121', /* 91 */
+ '111143', /* 92 */
+ '111341', /* 93 */
+ '131141', /* 94 */
+ '114113', /* 95 */
+ '114311', /* 96 */
+ '411113', /* 97 */
+ '411311', /* 98 */
+ '113141', /* 99 */
+ '114131', /* 100 */
+ '311141', /* 101 */
+ '411131', /* 102 */
+ '211412', /* 103 START A */
+ '211214', /* 104 START B */
+ '211232', /* 105 START C */
+ '233111', /* STOP */
+ '200000' /* END */
+ );
+ $keys = '';
+ switch(strtoupper($type)) {
+ case 'A': {
+ $startid = 103;
+ $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_';
+ for ($i = 0; $i < 32; ++$i) {
+ $keys .= chr($i);
+ }
+ break;
+ }
+ case 'B': {
+ $startid = 104;
+ $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'.chr(127);
+ break;
+ }
+ case 'C': {
+ $startid = 105;
+ $keys = '';
+ if ((strlen($code) % 2) != 0) {
+ // The length of barcode value must be even ($code). You must pad the number with zeros
+ return false;
+ }
+ for ($i = 0; $i <= 99; ++$i) {
+ $keys .= chr($i);
+ }
+ $new_code = '';
+ $hclen = (strlen($code) / 2);
+ for ($i = 0; $i < $hclen; ++$i) {
+ $new_code .= chr(intval($code{(2 * $i)}.$code{(2 * $i + 1)}));
+ }
+ $code = $new_code;
+ break;
+ }
+ default: {
+ return false;
+ }
+ }
+ // calculate check character
+ $sum = $startid;
+ $clen = strlen($code);
+ for ($i = 0; $i < $clen; ++$i) {
+ $sum += (strpos($keys, $code{$i}) * ($i+1));
+ }
+ $check = ($sum % 103);
+ // add start, check and stop codes
+ $code = chr($startid).$code.chr($check).chr(106).chr(107);
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+ $k = 0;
+ $len = strlen($code);
+ for ($i = 0; $i < $len; ++$i) {
+ $ck = strpos($keys, $code{$i});
+ if (($i == 0) OR ($i > ($len-4))) {
+ $char_num = ord($code{$i});
+ $seq = $chr[$char_num];
+ } elseif(($ck >= 0) AND isset($chr[$ck])) {
+ $seq = $chr[$ck];
+ } else {
+ // invalid character
+ return false;
+ }
+ for ($j = 0; $j < 6; ++$j) {
+ if (($j % 2) == 0) {
+ $t = true; // bar
+ } else {
+ $t = false; // space
+ }
+ $w = $seq{$j};
+ $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+ $bararray['maxw'] += $w;
+ ++$k;
+ }
+ }
+ return $bararray;
+ }
+
+ /**
+ * EAN13 and UPC-A barcodes.
+ * EAN13: European Article Numbering international retail product code
+ * UPC-A: Universal product code seen on almost all retail products in the USA and Canada
+ * UPC-E: Short version of UPC symbol
+ * @param string $code code to represent.
+ * @param string $len barcode type: 6 = UPC-E, 8 = EAN8, 13 = EAN13, 12 = UPC-A
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_eanupc($code, $len=13) {
+ $upce = false;
+ if ($len == 6) {
+ $len = 12; // UPC-A
+ $upce = true; // UPC-E mode
+ }
+ $data_len = $len - 1;
+ //Padding
+ $code = str_pad($code, $data_len, '0', STR_PAD_LEFT);
+ $code_len = strlen($code);
+ // calculate check digit
+ $sum_a = 0;
+ for ($i = 1; $i < $data_len; $i+=2) {
+ $sum_a += $code{$i};
+ }
+ if ($len > 12) {
+ $sum_a *= 3;
+ }
+ $sum_b = 0;
+ for ($i = 0; $i < $data_len; $i+=2) {
+ $sum_b += ($code{$i});
+ }
+ if ($len < 13) {
+ $sum_b *= 3;
+ }
+ $r = ($sum_a + $sum_b) % 10;
+ if($r > 0) {
+ $r = (10 - $r);
+ }
+ if ($code_len == $data_len) {
+ // add check digit
+ $code .= $r;
+ } elseif ($r !== intval($code{$data_len})) {
+ // wrong checkdigit
+ return false;
+ }
+ if ($len == 12) {
+ // UPC-A
+ $code = '0'.$code;
+ ++$len;
+ }
+ if ($upce) {
+ // convert UPC-A to UPC-E
+ $tmp = substr($code, 4, 3);
+ if (($tmp == '000') OR ($tmp == '100') OR ($tmp == '200')) {
+ // manufacturer code ends in 000, 100, or 200
+ $upce_code = substr($code, 2, 2).substr($code, 9, 3).substr($code, 4, 1);
+ } else {
+ $tmp = substr($code, 5, 2);
+ if ($tmp == '00') {
+ // manufacturer code ends in 00
+ $upce_code = substr($code, 2, 3).substr($code, 10, 2).'3';
} else {
- $t = false; // space
+ $tmp = substr($code, 6, 1);
+ if ($tmp == '0') {
+ // manufacturer code ends in 0
+ $upce_code = substr($code, 2, 4).substr($code, 11, 1).'4';
+ } else {
+ // manufacturer code does not end in zero
+ $upce_code = substr($code, 2, 5).substr($code, 11, 1);
+ }
}
- $w = $seq{$j};
- $bararray["bcode"][$k] = array("t" => $t, "w" => $w, "h" => 1, "p" => 0);
- $bararray["maxw"] += $w;
- $k++;
}
- }
- return $bararray;
- }
-
- /**
- * C128 barcodes.
- *
- * @param string $code code to represent.
- * @param string $type barcode type: A, B or C
- * @return array barcode representation.
- * @access protected
- */
- protected function barcode_c128($code, $type="B") {
- $chr = array(
- '212222', /* 00 */
- '222122', /* 01 */
- '222221', /* 02 */
- '121223', /* 03 */
- '121322', /* 04 */
- '131222', /* 05 */
- '122213', /* 06 */
- '122312', /* 07 */
- '132212', /* 08 */
- '221213', /* 09 */
- '221312', /* 10 */
- '231212', /* 11 */
- '112232', /* 12 */
- '122132', /* 13 */
- '122231', /* 14 */
- '113222', /* 15 */
- '123122', /* 16 */
- '123221', /* 17 */
- '223211', /* 18 */
- '221132', /* 19 */
- '221231', /* 20 */
- '213212', /* 21 */
- '223112', /* 22 */
- '312131', /* 23 */
- '311222', /* 24 */
- '321122', /* 25 */
- '321221', /* 26 */
- '312212', /* 27 */
- '322112', /* 28 */
- '322211', /* 29 */
- '212123', /* 30 */
- '212321', /* 31 */
- '232121', /* 32 */
- '111323', /* 33 */
- '131123', /* 34 */
- '131321', /* 35 */
- '112313', /* 36 */
- '132113', /* 37 */
- '132311', /* 38 */
- '211313', /* 39 */
- '231113', /* 40 */
- '231311', /* 41 */
- '112133', /* 42 */
- '112331', /* 43 */
- '132131', /* 44 */
- '113123', /* 45 */
- '113321', /* 46 */
- '133121', /* 47 */
- '313121', /* 48 */
- '211331', /* 49 */
- '231131', /* 50 */
- '213113', /* 51 */
- '213311', /* 52 */
- '213131', /* 53 */
- '311123', /* 54 */
- '311321', /* 55 */
- '331121', /* 56 */
- '312113', /* 57 */
- '312311', /* 58 */
- '332111', /* 59 */
- '314111', /* 60 */
- '221411', /* 61 */
- '431111', /* 62 */
- '111224', /* 63 */
- '111422', /* 64 */
- '121124', /* 65 */
- '121421', /* 66 */
- '141122', /* 67 */
- '141221', /* 68 */
- '112214', /* 69 */
- '112412', /* 70 */
- '122114', /* 71 */
- '122411', /* 72 */
- '142112', /* 73 */
- '142211', /* 74 */
- '241211', /* 75 */
- '221114', /* 76 */
- '413111', /* 77 */
- '241112', /* 78 */
- '134111', /* 79 */
- '111242', /* 80 */
- '121142', /* 81 */
- '121241', /* 82 */
- '114212', /* 83 */
- '124112', /* 84 */
- '124211', /* 85 */
- '411212', /* 86 */
- '421112', /* 87 */
- '421211', /* 88 */
- '212141', /* 89 */
- '214121', /* 90 */
- '412121', /* 91 */
- '111143', /* 92 */
- '111341', /* 93 */
- '131141', /* 94 */
- '114113', /* 95 */
- '114311', /* 96 */
- '411113', /* 97 */
- '411311', /* 98 */
- '113141', /* 99 */
- '114131', /* 100 */
- '311141', /* 101 */
- '411131', /* 102 */
- '211412', /* 103 START A */
- '211214', /* 104 START B */
- '211232', /* 105 START C */
- '233111', /* STOP */
- '200000' /* END */
+ }
+ //Convert digits to bars
+ $codes = array(
+ 'A'=>array( // left odd parity
+ '0'=>'0001101',
+ '1'=>'0011001',
+ '2'=>'0010011',
+ '3'=>'0111101',
+ '4'=>'0100011',
+ '5'=>'0110001',
+ '6'=>'0101111',
+ '7'=>'0111011',
+ '8'=>'0110111',
+ '9'=>'0001011'),
+ 'B'=>array( // left even parity
+ '0'=>'0100111',
+ '1'=>'0110011',
+ '2'=>'0011011',
+ '3'=>'0100001',
+ '4'=>'0011101',
+ '5'=>'0111001',
+ '6'=>'0000101',
+ '7'=>'0010001',
+ '8'=>'0001001',
+ '9'=>'0010111'),
+ 'C'=>array( // right
+ '0'=>'1110010',
+ '1'=>'1100110',
+ '2'=>'1101100',
+ '3'=>'1000010',
+ '4'=>'1011100',
+ '5'=>'1001110',
+ '6'=>'1010000',
+ '7'=>'1000100',
+ '8'=>'1001000',
+ '9'=>'1110100')
+ );
+ $parities = array(
+ '0'=>array('A','A','A','A','A','A'),
+ '1'=>array('A','A','B','A','B','B'),
+ '2'=>array('A','A','B','B','A','B'),
+ '3'=>array('A','A','B','B','B','A'),
+ '4'=>array('A','B','A','A','B','B'),
+ '5'=>array('A','B','B','A','A','B'),
+ '6'=>array('A','B','B','B','A','A'),
+ '7'=>array('A','B','A','B','A','B'),
+ '8'=>array('A','B','A','B','B','A'),
+ '9'=>array('A','B','B','A','B','A')
);
- $keys = "";
- switch(strtoupper($type)) {
- case "A": {
- $startid = 103;
- $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_';
- for($i = 0; $i < 32; $i++) {
- $keys .= chr($i);
- }
- break;
- }
- case "B": {
- $startid = 104;
- $keys = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'.chr(127);
- break;
+ $upce_parities = array();
+ $upce_parities[0] = array(
+ '0'=>array('B','B','B','A','A','A'),
+ '1'=>array('B','B','A','B','A','A'),
+ '2'=>array('B','B','A','A','B','A'),
+ '3'=>array('B','B','A','A','A','B'),
+ '4'=>array('B','A','B','B','A','A'),
+ '5'=>array('B','A','A','B','B','A'),
+ '6'=>array('B','A','A','A','B','B'),
+ '7'=>array('B','A','B','A','B','A'),
+ '8'=>array('B','A','B','A','A','B'),
+ '9'=>array('B','A','A','B','A','B')
+ );
+ $upce_parities[1] = array(
+ '0'=>array('A','A','A','B','B','B'),
+ '1'=>array('A','A','B','A','B','B'),
+ '2'=>array('A','A','B','B','A','B'),
+ '3'=>array('A','A','B','B','B','A'),
+ '4'=>array('A','B','A','A','B','B'),
+ '5'=>array('A','B','B','A','A','B'),
+ '6'=>array('A','B','B','B','A','A'),
+ '7'=>array('A','B','A','B','A','B'),
+ '8'=>array('A','B','A','B','B','A'),
+ '9'=>array('A','B','B','A','B','A')
+ );
+ $k = 0;
+ $seq = '101'; // left guard bar
+ if ($upce) {
+ $bararray = array('code' => $upce_code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+ $p = $upce_parities[$code{1}][$r];
+ for ($i = 0; $i < 6; ++$i) {
+ $seq .= $codes[$p[$i]][$upce_code{$i}];
}
- case "C": {
- $startid = 105;
- $keys = "";
- if ((strlen($code) % 2) != 0) {
- //echo "The length of barcode value must be even ($code). You must pad the number with zeros.\n";
- return false;
- }
- for($i = 0; $i <= 99; $i++) {
- $keys .= chr($i);
+ $seq .= '010101'; // right guard bar
+ } else {
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+ $half_len = ceil($len / 2);
+ if ($len == 8) {
+ for ($i = 0; $i < $half_len; ++$i) {
+ $seq .= $codes['A'][$code{$i}];
}
- $new_code = "";
- for ($i=0; $i < (strlen($code) / 2); $i++) {
- $new_code .= chr(intval($code{(2 * $i)}.$code{(2 * $i + 1)}));
+ } else {
+ $p = $parities[$code{0}];
+ for ($i = 1; $i < $half_len; ++$i) {
+ $seq .= $codes[$p[$i-1]][$code{$i}];
}
- $code = $new_code;
- break;
- }
- default: {
- return false;
+ }
+ $seq .= '01010'; // center guard bar
+ for ($i = $half_len; $i < $len; ++$i) {
+ $seq .= $codes['C'][$code{$i}];
+ }
+ $seq .= '101'; // right guard bar
+ }
+ $clen = strlen($seq);
+ $w = 0;
+ for ($i = 0; $i < $clen; ++$i) {
+ $w += 1;
+ if (($i == ($clen - 1)) OR (($i < ($clen - 1)) AND ($seq{$i} != $seq{($i+1)}))) {
+ if ($seq{$i} == '1') {
+ $t = true; // bar
+ } else {
+ $t = false; // space
+ }
+ $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+ $bararray['maxw'] += $w;
+ ++$k;
+ $w = 0;
+ }
+ }
+ return $bararray;
+ }
+
+ /**
+ * UPC-Based Extentions
+ * 2-Digit Ext.: Used to indicate magazines and newspaper issue numbers
+ * 5-Digit Ext.: Used to mark suggested retail price of books
+ * @param string $code code to represent.
+ * @param string $len barcode type: 2 = 2-Digit, 5 = 5-Digit
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_eanext($code, $len=5) {
+ //Padding
+ $code = str_pad($code, $len, '0', STR_PAD_LEFT);
+ // calculate check digit
+ if ($len == 2) {
+ $r = $code % 4;
+ } elseif ($len == 5) {
+ $r = (3 * ($code{0} + $code{2} + $code{4})) + (9 * ($code{1} + $code{3}));
+ $r %= 10;
+ } else {
+ return false;
+ }
+ //Convert digits to bars
+ $codes = array(
+ 'A'=>array( // left odd parity
+ '0'=>'0001101',
+ '1'=>'0011001',
+ '2'=>'0010011',
+ '3'=>'0111101',
+ '4'=>'0100011',
+ '5'=>'0110001',
+ '6'=>'0101111',
+ '7'=>'0111011',
+ '8'=>'0110111',
+ '9'=>'0001011'),
+ 'B'=>array( // left even parity
+ '0'=>'0100111',
+ '1'=>'0110011',
+ '2'=>'0011011',
+ '3'=>'0100001',
+ '4'=>'0011101',
+ '5'=>'0111001',
+ '6'=>'0000101',
+ '7'=>'0010001',
+ '8'=>'0001001',
+ '9'=>'0010111')
+ );
+ $parities = array();
+ $parities[2] = array(
+ '0'=>array('A','A'),
+ '1'=>array('A','B'),
+ '2'=>array('B','A'),
+ '3'=>array('B','B')
+ );
+ $parities[5] = array(
+ '0'=>array('B','B','A','A','A'),
+ '1'=>array('B','A','B','A','A'),
+ '2'=>array('B','A','A','B','A'),
+ '3'=>array('B','A','A','A','B'),
+ '4'=>array('A','B','B','A','A'),
+ '5'=>array('A','A','B','B','A'),
+ '6'=>array('A','A','A','B','B'),
+ '7'=>array('A','B','A','B','A'),
+ '8'=>array('A','B','A','A','B'),
+ '9'=>array('A','A','B','A','B')
+ );
+ $p = $parities[$len][$r];
+ $seq = '1011'; // left guard bar
+ $seq .= $codes[$p[0]][$code{0}];
+ for ($i = 1; $i < $len; ++$i) {
+ $seq .= '01'; // separator
+ $seq .= $codes[$p[$i]][$code{$i}];
+ }
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+ return $this->binseq_to_array($seq, $bararray);
+ }
+
+ /**
+ * POSTNET and PLANET barcodes.
+ * Used by U.S. Postal Service for automated mail sorting
+ * @param string $code zip code to represent. Must be a string containing a zip code of the form DDDDD or DDDDD-DDDD.
+ * @param boolean $planet if true print the PLANET barcode, otherwise print POSTNET
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_postnet($code, $planet=false) {
+ // bar lenght
+ if ($planet) {
+ $barlen = Array(
+ 0 => Array(1,1,2,2,2),
+ 1 => Array(2,2,2,1,1),
+ 2 => Array(2,2,1,2,1),
+ 3 => Array(2,2,1,1,2),
+ 4 => Array(2,1,2,2,1),
+ 5 => Array(2,1,2,1,2),
+ 6 => Array(2,1,1,2,2),
+ 7 => Array(1,2,2,2,1),
+ 8 => Array(1,2,2,1,2),
+ 9 => Array(1,2,1,2,2)
+ );
+ } else {
+ $barlen = Array(
+ 0 => Array(2,2,1,1,1),
+ 1 => Array(1,1,1,2,2),
+ 2 => Array(1,1,2,1,2),
+ 3 => Array(1,1,2,2,1),
+ 4 => Array(1,2,1,1,2),
+ 5 => Array(1,2,1,2,1),
+ 6 => Array(1,2,2,1,1),
+ 7 => Array(2,1,1,1,2),
+ 8 => Array(2,1,1,2,1),
+ 9 => Array(2,1,2,1,1)
+ );
+ }
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 2, 'bcode' => array());
+ $k = 0;
+ $code = str_replace('-', '', $code);
+ $code = str_replace(' ', '', $code);
+ $len = strlen($code);
+ // calculate checksum
+ $sum = 0;
+ for ($i = 0; $i < $len; ++$i) {
+ $sum += intval($code{$i});
+ }
+ $chkd = ($sum % 10);
+ if($chkd > 0) {
+ $chkd = (10 - $chkd);
+ }
+ $code .= $chkd;
+ $len = strlen($code);
+ // start bar
+ $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 2, 'p' => 0);
+ $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0);
+ $bararray['maxw'] += 2;
+ for ($i = 0; $i < $len; ++$i) {
+ for ($j = 0; $j < 5; ++$j) {
+ $h = $barlen[$code{$i}][$j];
+ $p = floor(1 / $h);
+ $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p);
+ $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0);
+ $bararray['maxw'] += 2;
+ }
+ }
+ // end bar
+ $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 2, 'p' => 0);
+ $bararray['maxw'] += 1;
+ return $bararray;
+ }
+
+ /**
+ * RMS4CC - CBC - KIX
+ * RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code) - KIX (Klant index - Customer index)
+ * RM4SCC is the name of the barcode symbology used by the Royal Mail for its Cleanmail service.
+ * @param string $code code to print
+ * @param boolean $kix if true prints the KIX variation (doesn't use the start and end symbols, and the checksum) - in this case the house number must be sufficed with an X and placed at the end of the code.
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_rms4cc($code, $kix=false) {
+ $notkix = !$kix;
+ // bar mode
+ // 1 = pos 1, length 2
+ // 2 = pos 1, length 3
+ // 3 = pos 2, length 1
+ // 4 = pos 2, length 2
+ $barmode = array(
+ '0' => array(3,3,2,2),
+ '1' => array(3,4,1,2),
+ '2' => array(3,4,2,1),
+ '3' => array(4,3,1,2),
+ '4' => array(4,3,2,1),
+ '5' => array(4,4,1,1),
+ '6' => array(3,1,4,2),
+ '7' => array(3,2,3,2),
+ '8' => array(3,2,4,1),
+ '9' => array(4,1,3,2),
+ 'A' => array(4,1,4,1),
+ 'B' => array(4,2,3,1),
+ 'C' => array(3,1,2,4),
+ 'D' => array(3,2,1,4),
+ 'E' => array(3,2,2,3),
+ 'F' => array(4,1,1,4),
+ 'G' => array(4,1,2,3),
+ 'H' => array(4,2,1,3),
+ 'I' => array(1,3,4,2),
+ 'J' => array(1,4,3,2),
+ 'K' => array(1,4,4,1),
+ 'L' => array(2,3,3,2),
+ 'M' => array(2,3,4,1),
+ 'N' => array(2,4,3,1),
+ 'O' => array(1,3,2,4),
+ 'P' => array(1,4,1,4),
+ 'Q' => array(1,4,2,3),
+ 'R' => array(2,3,1,4),
+ 'S' => array(2,3,2,3),
+ 'T' => array(2,4,1,3),
+ 'U' => array(1,1,4,4),
+ 'V' => array(1,2,3,4),
+ 'W' => array(1,2,4,3),
+ 'X' => array(2,1,3,4),
+ 'Y' => array(2,1,4,3),
+ 'Z' => array(2,2,3,3)
+ );
+ $code = strtoupper($code);
+ $len = strlen($code);
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 3, 'bcode' => array());
+ if ($notkix) {
+ // table for checksum calculation (row,col)
+ $checktable = array(
+ '0' => array(1,1),
+ '1' => array(1,2),
+ '2' => array(1,3),
+ '3' => array(1,4),
+ '4' => array(1,5),
+ '5' => array(1,0),
+ '6' => array(2,1),
+ '7' => array(2,2),
+ '8' => array(2,3),
+ '9' => array(2,4),
+ 'A' => array(2,5),
+ 'B' => array(2,0),
+ 'C' => array(3,1),
+ 'D' => array(3,2),
+ 'E' => array(3,3),
+ 'F' => array(3,4),
+ 'G' => array(3,5),
+ 'H' => array(3,0),
+ 'I' => array(4,1),
+ 'J' => array(4,2),
+ 'K' => array(4,3),
+ 'L' => array(4,4),
+ 'M' => array(4,5),
+ 'N' => array(4,0),
+ 'O' => array(5,1),
+ 'P' => array(5,2),
+ 'Q' => array(5,3),
+ 'R' => array(5,4),
+ 'S' => array(5,5),
+ 'T' => array(5,0),
+ 'U' => array(0,1),
+ 'V' => array(0,2),
+ 'W' => array(0,3),
+ 'X' => array(0,4),
+ 'Y' => array(0,5),
+ 'Z' => array(0,0)
+ );
+ $row = 0;
+ $col = 0;
+ for ($i = 0; $i < $len; ++$i) {
+ $row += $checktable[$code{$i}][0];
+ $col += $checktable[$code{$i}][1];
}
+ $row %= 6;
+ $col %= 6;
+ $chk = array_keys($checktable, array($row,$col));
+ $code .= $chk[0];
+ ++$len;
}
- // calculate check character
- $sum = $startid;
- for ($i=0; $i < strlen($code); $i++) {
- $sum += (strpos($keys, $code{$i}) * ($i+1));
- }
- $check = ($sum % 103);
-
- // add start, check and stop codes
- $code = chr($startid).$code.chr($check).chr(106).chr(107);
- $bararray = array("code" => $code, "maxw" => 0, "maxh" => 1, "bcode" => array());
$k = 0;
+ if ($notkix) {
+ // start bar
+ $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 2, 'p' => 0);
+ $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0);
+ $bararray['maxw'] += 2;
+ }
+ for ($i = 0; $i < $len; ++$i) {
+ for ($j = 0; $j < 4; ++$j) {
+ switch ($barmode[$code{$i}][$j]) {
+ case 1: {
+ $p = 0;
+ $h = 2;
+ break;
+ }
+ case 2: {
+ $p = 0;
+ $h = 3;
+ break;
+ }
+ case 3: {
+ $p = 1;
+ $h = 1;
+ break;
+ }
+ case 4: {
+ $p = 1;
+ $h = 2;
+ break;
+ }
+ }
+ $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p);
+ $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0);
+ $bararray['maxw'] += 2;
+ }
+ }
+ if ($notkix) {
+ // stop bar
+ $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => 3, 'p' => 0);
+ $bararray['maxw'] += 1;
+ }
+ return $bararray;
+ }
+
+ /**
+ * CODABAR barcodes.
+ * Older code often used in library systems, sometimes in blood banks
+ * @param string $code code to represent.
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_codabar($code) {
+ $chr = array(
+ '0' => '11111221',
+ '1' => '11112211',
+ '2' => '11121121',
+ '3' => '22111111',
+ '4' => '11211211',
+ '5' => '21111211',
+ '6' => '12111121',
+ '7' => '12112111',
+ '8' => '12211111',
+ '9' => '21121111',
+ '-' => '11122111',
+ '$' => '11221111',
+ ':' => '21112121',
+ '/' => '21211121',
+ '.' => '21212111',
+ '+' => '11222221',
+ 'A' => '11221211',
+ 'B' => '12121121',
+ 'C' => '11121221',
+ 'D' => '11122211'
+ );
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+ $k = 0;
+ $w = 0;
+ $seq = '';
+ $code = 'A'.strtoupper($code).'A';
+ $len = strlen($code);
+ for ($i = 0; $i < $len; ++$i) {
+ if (!isset($chr[$code{$i}])) {
+ return false;
+ }
+ $seq = $chr[$code{$i}];
+ for ($j = 0; $j < 8; ++$j) {
+ if (($j % 2) == 0) {
+ $t = true; // bar
+ } else {
+ $t = false; // space
+ }
+ $w = $seq{$j};
+ $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+ $bararray['maxw'] += $w;
+ ++$k;
+ }
+ }
+ return $bararray;
+ }
+
+ /**
+ * CODE11 barcodes.
+ * Used primarily for labeling telecommunications equipment
+ * @param string $code code to represent.
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_code11($code) {
+ $chr = array(
+ '0' => '111121',
+ '1' => '211121',
+ '2' => '121121',
+ '3' => '221111',
+ '4' => '112121',
+ '5' => '212111',
+ '6' => '122111',
+ '7' => '111221',
+ '8' => '211211',
+ '9' => '211111',
+ '-' => '112111',
+ 'S' => '112211'
+ );
+
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+ $k = 0;
+ $w = 0;
+ $seq = '';
$len = strlen($code);
- for($i=0; $i < $len; $i++) {
- $ck = strpos($keys, $code{$i});
- if (($i == 0) OR ($i > ($len-4))) {
- $seq = $chr[ord($code{$i})];
- } elseif(($ck >= 0) AND isset($chr[$ck])) {
- $seq = $chr[$ck];
+ // calculate check digit C
+ $p = 1;
+ $check = 0;
+ for ($i = ($len - 1); $i >= 0; --$i) {
+ $digit = $code{$i};
+ if ($digit == '-') {
+ $dval = 10;
} else {
- // invalid character
- return false;
+ $dval = intval($digit);
+ }
+ $check += ($dval * $p);
+ ++$p;
+ if ($p > 10) {
+ $p = 1;
}
- for($j=0; $j < 6; $j++) {
- if (($j % 2) == 0) {
- $t = true; // bar
+ }
+ $check %= 11;
+ if ($check == 10) {
+ $check = '-';
+ }
+ $code .= $check;
+ if ($len > 10) {
+ // calculate check digit K
+ $p = 1;
+ $check = 0;
+ for ($i = $len; $i >= 0; --$i) {
+ $digit = $code{$i};
+ if ($digit == '-') {
+ $dval = 10;
} else {
- $t = false; // space
+ $dval = intval($digit);
+ }
+ $check += ($dval * $p);
+ ++$p;
+ if ($p > 9) {
+ $p = 1;
}
- $w = $seq{$j};
- $bararray["bcode"][$k] = array("t" => $t, "w" => $w, "h" => 1, "p" => 0);
- $bararray["maxw"] += $w;
- $k++;
}
+ $check %= 11;
+ $code .= $check;
+ ++$len;
+ }
+ $code = 'S'.$code.'S';
+ $len += 3;
+ for ($i = 0; $i < $len; ++$i) {
+ if (!isset($chr[$code{$i}])) {
+ return false;
+ }
+ $seq = $chr[$code{$i}];
+ for ($j = 0; $j < 6; ++$j) {
+ if (($j % 2) == 0) {
+ $t = true; // bar
+ } else {
+ $t = false; // space
+ }
+ $w = $seq{$j};
+ $bararray['bcode'][$k] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
+ $bararray['maxw'] += $w;
+ ++$k;
+ }
+ }
+ return $bararray;
+ }
+
+ /**
+ * Pharmacode
+ * Contains digits (0 to 9)
+ * @param string $code code to represent.
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_pharmacode($code) {
+ $seq = '';
+ $code = intval($code);
+ while ($code > 0) {
+ if (($code % 2) == 0) {
+ $seq .= '11100';
+ $code -= 2;
+ } else {
+ $seq .= '100';
+ $code -= 1;
+ }
+ $code /= 2;
}
- return $bararray;
+ $seq = substr($seq, 0, -2);
+ $seq = strrev($seq);
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
+ return $this->binseq_to_array($seq, $bararray);
}
+ /**
+ * Pharmacode two-track
+ * Contains digits (0 to 9)
+ * @param string $code code to represent.
+ * @return array barcode representation.
+ * @access protected
+ */
+ protected function barcode_pharmacode2t($code) {
+ $seq = '';
+ $code = intval($code);
+ do {
+ switch ($code % 3) {
+ case 0: {
+ $seq .= '3';
+ $code = ($code - 3) / 3;
+ break;
+ }
+ case 1: {
+ $seq .= '1';
+ $code = ($code - 1) / 3;
+ break;
+ }
+ case 2: {
+ $seq .= '2';
+ $code = ($code - 2) / 3;
+ break;
+ }
+ }
+ } while($code != 0);
+ $seq = strrev($seq);
+ $k = 0;
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 2, 'bcode' => array());
+ $len = strlen($seq);
+ for ($i = 0; $i < $len; ++$i) {
+ switch ($seq{$i}) {
+ case '1': {
+ $p = 1;
+ $h = 1;
+ break;
+ }
+ case '2': {
+ $p = 0;
+ $h = 1;
+ break;
+ }
+ case '3': {
+ $p = 0;
+ $h = 2;
+ break;
+ }
+ }
+ $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p);
+ $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0);
+ $bararray['maxw'] += 2;
+ }
+ unset($bararray['bcode'][($k - 1)]);
+ --$bararray['maxw'];
+ return $bararray;
+ }
+
+
/**
- * EAN13 and UPC-A barcodes.
- * @param string $code code to represent.
- * @param string $len barcode type: 13 = EAN13, 12 = UPC-A
- * @return array barcode representation.
+ * IMB - Intelligent Mail Barcode - Onecode - USPS-B-3200
+ * (requires PHP bcmath extension)
+ * Intelligent Mail barcode is a 65-bar code for use on mail in the United States.
+ * The fields are described as follows:- The Barcode Identifier shall be assigned by USPS to encode the presort identification that is currently printed in human readable form on the optional endorsement line (OEL) as well as for future USPS use. This shall be two digits, with the second digit in the range of 0â4. The allowable encoding ranges shall be 00â04, 10â14, 20â24, 30â34, 40â44, 50â54, 60â64, 70â74, 80â84, and 90â94.
- The Service Type Identifier shall be assigned by USPS for any combination of services requested on the mailpiece. The allowable encoding range shall be 000http://it2.php.net/manual/en/function.dechex.phpâ999. Each 3-digit value shall correspond to a particular mail class with a particular combination of service(s). Each service program, such as OneCode Confirm and OneCode ACS, shall provide the list of Service Type Identifier values.
- The Mailer or Customer Identifier shall be assigned by USPS as a unique, 6 or 9 digit number that identifies a business entity. The allowable encoding range for the 6 digit Mailer ID shall be 000000- 899999, while the allowable encoding range for the 9 digit Mailer ID shall be 900000000-999999999.
- The Serial or Sequence Number shall be assigned by the mailer for uniquely identifying and tracking mailpieces. The allowable encoding range shall be 000000000â999999999 when used with a 6 digit Mailer ID and 000000-999999 when used with a 9 digit Mailer ID. e. The Delivery Point ZIP Code shall be assigned by the mailer for routing the mailpiece. This shall replace POSTNET for routing the mailpiece to its final delivery point. The length may be 0, 5, 9, or 11 digits. The allowable encoding ranges shall be no ZIP Code, 00000â99999, 000000000â999999999, and 00000000000â99999999999.
+ * @param string $code code to print, separate the ZIP (routing code) from the rest using a minus char '-' (BarcodeID_ServiceTypeID_MailerID_SerialNumber-RoutingCode)
+ * @return array barcode representation.
* @access protected
- */
- protected function barcode_ean13($code, $len=13) {
- //Padding
- $code = str_pad($code, $len-1, '0', STR_PAD_LEFT);
- if($len == 12) {
- $code = '0'.$code;
+ */
+ protected function barcode_imb($code) {
+ $asc_chr = array(4,0,2,6,3,5,1,9,8,7,1,2,0,6,4,8,2,9,5,3,0,1,3,7,4,6,8,9,2,0,5,1,9,4,3,8,6,7,1,2,4,3,9,5,7,8,3,0,2,1,4,0,9,1,7,0,2,4,6,3,7,1,9,5,8);
+ $dsc_chr = array(7,1,9,5,8,0,2,4,6,3,5,8,9,7,3,0,6,1,7,4,6,8,9,2,5,1,7,5,4,3,8,7,6,0,2,5,4,9,3,0,1,6,8,2,0,4,5,9,6,7,5,2,6,3,8,5,1,9,8,7,4,0,2,6,3);
+ $asc_pos = array(3,0,8,11,1,12,8,11,10,6,4,12,2,7,9,6,7,9,2,8,4,0,12,7,10,9,0,7,10,5,7,9,6,8,2,12,1,4,2,0,1,5,4,6,12,1,0,9,4,7,5,10,2,6,9,11,2,12,6,7,5,11,0,3,2);
+ $dsc_pos = array(2,10,12,5,9,1,5,4,3,9,11,5,10,1,6,3,4,1,10,0,2,11,8,6,1,12,3,8,6,4,4,11,0,6,1,9,11,5,3,7,3,10,7,11,8,2,10,3,5,8,0,3,12,11,8,4,5,1,3,0,7,12,9,8,10);
+ $code_arr = explode('-', $code);
+ $tracking_number = $code_arr[0];
+ if (isset($code_arr[1])) {
+ $routing_code = $code_arr[1];
+ } else {
+ $routing_code = '';
}
- // add check digit
- if(strlen($code) == 12) {
- $sum=0;
- for($i=1;$i<=11;$i+=2) {
- $sum += (3 * $code{$i});
- }
- for($i=0; $i <= 10; $i+=2) {
- $sum += ($code{$i});
+ // Conversion of Routing Code
+ switch (strlen($routing_code)) {
+ case 0: {
+ $binary_code = 0;
+ break;
}
- $r = $sum % 10;
- if($r > 0) {
- $r = (10 - $r);
+ case 5: {
+ $binary_code = bcadd($routing_code, '1');
+ break;
}
- $code .= $r;
- } else { // test checkdigit
- $sum = 0;
- for($i=1; $i <= 11; $i+=2) {
- $sum += (3 * $code{$i});
+ case 9: {
+ $binary_code = bcadd($routing_code, '100001');
+ break;
}
- for($i=0; $i <= 10; $i+=2) {
- $sum += $code{$i};
+ case 11: {
+ $binary_code = bcadd($routing_code, '1000100001');
+ break;
}
- if ((($sum + $code{12}) % 10) != 0) {
+ default: {
return false;
+ break;
}
}
- //Convert digits to bars
- $codes = array(
- 'A'=>array(
- '0'=>'0001101',
- '1'=>'0011001',
- '2'=>'0010011',
- '3'=>'0111101',
- '4'=>'0100011',
- '5'=>'0110001',
- '6'=>'0101111',
- '7'=>'0111011',
- '8'=>'0110111',
- '9'=>'0001011'),
- 'B'=>array(
- '0'=>'0100111',
- '1'=>'0110011',
- '2'=>'0011011',
- '3'=>'0100001',
- '4'=>'0011101',
- '5'=>'0111001',
- '6'=>'0000101',
- '7'=>'0010001',
- '8'=>'0001001',
- '9'=>'0010111'),
- 'C'=>array(
- '0'=>'1110010',
- '1'=>'1100110',
- '2'=>'1101100',
- '3'=>'1000010',
- '4'=>'1011100',
- '5'=>'1001110',
- '6'=>'1010000',
- '7'=>'1000100',
- '8'=>'1001000',
- '9'=>'1110100')
- );
- $parities = array(
- '0'=>array('A','A','A','A','A','A'),
- '1'=>array('A','A','B','A','B','B'),
- '2'=>array('A','A','B','B','A','B'),
- '3'=>array('A','A','B','B','B','A'),
- '4'=>array('A','B','A','A','B','B'),
- '5'=>array('A','B','B','A','A','B'),
- '6'=>array('A','B','B','B','A','A'),
- '7'=>array('A','B','A','B','A','B'),
- '8'=>array('A','B','A','B','B','A'),
- '9'=>array('A','B','B','A','B','A')
- );
-
- $bararray = array("code" => $code, "maxw" => 0, "maxh" => 1, "bcode" => array());
- $k = 0;
- $seq = '101';
- $p = $parities[$code{0}];
- for($i=1; $i < 7; $i++) {
- $seq .= $codes[$p[$i-1]][$code{$i}];
+ $binary_code = bcmul($binary_code, 10);
+ $binary_code = bcadd($binary_code, $tracking_number{0});
+ $binary_code = bcmul($binary_code, 5);
+ $binary_code = bcadd($binary_code, $tracking_number{1});
+ $binary_code .= substr($tracking_number, 2, 18);
+ // convert to hexadecimal
+ $binary_code = $this->dec_to_hex($binary_code);
+ // pad to get 13 bytes
+ $binary_code = str_pad($binary_code, 26, '0', STR_PAD_LEFT);
+ // convert string to array of bytes
+ $binary_code_arr = chunk_split($binary_code, 2, "\r");
+ $binary_code_arr = substr($binary_code_arr, 0, -1);
+ $binary_code_arr = explode("\r", $binary_code_arr);
+ // calculate frame check sequence
+ $fcs = $this->imb_crc11fcs($binary_code_arr);
+ // exclude first 2 bits from first byte
+ $first_byte = sprintf('%2s', dechex((hexdec($binary_code_arr[0]) << 2) >> 2));
+ $binary_code_102bit = $first_byte.substr($binary_code, 2);
+ // convert binary data to codewords
+ $codewords = array();
+ $data = $this->hex_to_dec($binary_code_102bit);
+ $codewords[0] = bcmod($data, 636) * 2;
+ $data = bcdiv($data, 636);
+ for ($i = 1; $i < 9; ++$i) {
+ $codewords[$i] = bcmod($data, 1365);
+ $data = bcdiv($data, 1365);
}
- $seq .= '01010';
- for($i=7; $i < 13; $i++) {
- $seq .= $codes['C'][$code{$i}];
+ $codewords[9] = $data;
+ if (($fcs >> 10) == 1) {
+ $codewords[9] += 659;
}
- $seq .= '101';
- $len = strlen($seq);
- $w = 0;
- for($i=0; $i < $len; $i++) {
- $w += 1;
- if (($i == ($len - 1)) OR (($i < ($len - 1)) AND ($seq{$i} != $seq{($i+1)}))) {
- if ($seq{$i} == '1') {
- $t = true; // bar
- } else {
- $t = false; // space
- }
- $bararray["bcode"][$k] = array("t" => $t, "w" => $w, "h" => 1, "p" => 0);
- $bararray["maxw"] += $w;
- $k++;
- $w = 0;
+ // generate lookup tables
+ $table2of13 = $this->imb_tables(2, 78);
+ $table5of13 = $this->imb_tables(5, 1287);
+ // convert codewords to characters
+ $characters = array();
+ $bitmask = 512;
+ foreach($codewords as $k => $val) {
+ if ($val <= 1286) {
+ $chrcode = $table5of13[$val];
+ } else {
+ $chrcode = $table2of13[($val - 1287)];
+ }
+ if (($fcs & $bitmask) > 0) {
+ // bitwise invert
+ $chrcode = ((~$chrcode) & 8191);
}
+ $characters[] = $chrcode;
+ $bitmask /= 2;
}
- return $bararray;
+ $characters = array_reverse($characters);
+ // build bars
+ $k = 0;
+ $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 3, 'bcode' => array());
+ for ($i = 0; $i < 65; ++$i) {
+ $asc = (($characters[$asc_chr[$i]] & pow(2, $asc_pos[$i])) > 0);
+ $dsc = (($characters[$dsc_chr[$i]] & pow(2, $dsc_pos[$i])) > 0);
+ if ($asc AND $dsc) {
+ // full bar (F)
+ $p = 0;
+ $h = 3;
+ } elseif ($asc) {
+ // ascender (A)
+ $p = 0;
+ $h = 2;
+ } elseif ($dsc) {
+ // descender (D)
+ $p = 1;
+ $h = 2;
+ } else {
+ // tracker (T)
+ $p = 1;
+ $h = 1;
+ }
+ $bararray['bcode'][$k++] = array('t' => 1, 'w' => 1, 'h' => $h, 'p' => $p);
+ $bararray['bcode'][$k++] = array('t' => 0, 'w' => 1, 'h' => 2, 'p' => 0);
+ $bararray['maxw'] += 2;
+ }
+ unset($bararray['bcode'][($k - 1)]);
+ --$bararray['maxw'];
+ return $bararray;
}
/**
- * POSTNET barcodes.
- * @param string $code zip code to represent. Must be a string containing a zip code of the form DDDDD or DDDDD-DDDD.
- * @return array barcode representation.
- * @access protected
+ * Convert large integer number to hexadecimal representation.
+ * (requires PHP bcmath extension)
+ * @param string $number number to convert specified as a string
+ * @return string hexadecimal representation
*/
- protected function barcode_postnet($code) {
- // bar lenght
- $barlen = Array(
- 0 => Array(2,2,1,1,1),
- 1 => Array(1,1,1,2,2),
- 2 => Array(1,1,2,1,2),
- 3 => Array(1,1,2,2,1),
- 4 => Array(1,2,1,1,2),
- 5 => Array(1,2,1,2,1),
- 6 => Array(1,2,2,1,1),
- 7 => Array(2,1,1,1,2),
- 8 => Array(2,1,1,2,1),
- 9 => Array(2,1,2,1,1)
- );
- $bararray = array("code" => $code, "maxw" => 0, "maxh" => 2, "bcode" => array());
- $k = 0;
- $code = str_replace("-", "", $code);
- $code = str_replace(" ", "", $code);
- $len = strlen($code);
- // calculate checksum
- $sum = 0;
- for($i=0; $i < $len; $i++) {
- $sum += intval($code{$i});
+ public function dec_to_hex($number) {
+ $i = 0;
+ $hex = array();
+ if($number == 0) {
+ return '00';
}
- if(($sum % 10) == 0) {
- return false;
+ while($number > 0) {
+ if($number == 0) {
+ array_push($hex, '0');
+ } else {
+ array_push($hex, strtoupper(dechex(bcmod($number, '16'))));
+ $number = bcdiv($number, '16', 0);
+ }
}
- $code .= "".(10 - ($sum % 10))."";
- $len = strlen($code);
- // start bar
- $bararray["bcode"][$k++] = array("t" => 1, "w" => 1, "h" => 2, "p" => 0);
- $bararray["bcode"][$k++] = array("t" => 0, "w" => 1, "h" => 2, "p" => 0);
- $bararray["maxw"] += 2;
- for ($i=0; $i < $len; $i++) {
- for ($j=0; $j < 5; $j++) {
- $h = $barlen[$code{$i}][$j];
- $p = floor(1 / $h);
- $bararray["bcode"][$k++] = array("t" => 1, "w" => 1, "h" => $h, "p" => $p);
- $bararray["bcode"][$k++] = array("t" => 0, "w" => 1, "h" => 2, "p" => 0);
- $bararray["maxw"] += 2;
- }
- }
- // end bar
- $bararray["bcode"][$k++] = array("t" => 1, "w" => 1, "h" => 2, "p" => 0);
- $bararray["maxw"] += 1;
- return $bararray;
+ $hex = array_reverse($hex);
+ return implode($hex);
}
/**
- * CODABAR barcodes.
- * @param string $code code to represent.
- * @return array barcode representation.
- * @access protected
+ * Convert large hexadecimal number to decimal representation (string).
+ * (requires PHP bcmath extension)
+ * @param string $hex hexadecimal number to convert specified as a string
+ * @return string hexadecimal representation
*/
- protected function barcode_codabar($code) {
- $chr = array(
- '0' => '11111221',
- '1' => '11112211',
- '2' => '11121121',
- '3' => '22111111',
- '4' => '11211211',
- '5' => '21111211',
- '6' => '12111121',
- '7' => '12112111',
- '8' => '12211111',
- '9' => '21121111',
- '-' => '11122111',
- '$' => '11221111',
- ':' => '21112121',
- '/' => '21211121',
- '.' => '21212111',
- '+' => '11222221',
- 'A' => '11221211',
- 'B' => '12121121',
- 'C' => '11121221',
- 'D' => '11122211'
- );
-
- $bararray = array("code" => $code, "maxw" => 0, "maxh" => 1, "bcode" => array());
- $k = 0;
- $w = 0;
- $seq = "";
- $code = "A".strtoupper($code)."A";
- $len = strlen($code);
- for($i=0; $i < $len; $i++) {
- if (!isset($chr[$code{$i}])) {
- return false;
+ public function hex_to_dec($hex) {
+ $dec = 0;
+ $bitval = 1;
+ $len = strlen($hex);
+ for($pos = ($len - 1); $pos >= 0; --$pos) {
+ $dec = bcadd($dec, bcmul(hexdec($hex{$pos}), $bitval));
+ $bitval = bcmul($bitval, 16);
+ }
+ return $dec;
+ }
+
+ /**
+ * Intelligent Mail Barcode calculation of Frame Check Sequence
+ * @param string $code_arr array of hexadecimal values (13 bytes holding 102 bits right justified).
+ * @return int 11 bit Frame Check Sequence as integer (decimal base)
+ * @access protected
+ */
+ protected function imb_crc11fcs($code_arr) {
+ $genpoly = 0x0F35; // generator polynomial
+ $fcs = 0x07FF; // Frame Check Sequence
+ // do most significant byte skipping the 2 most significant bits
+ $data = hexdec($code_arr[0]) << 5;
+ for ($bit = 2; $bit < 8; ++$bit) {
+ if (($fcs ^ $data) & 0x400) {
+ $fcs = ($fcs << 1) ^ $genpoly;
+ } else {
+ $fcs = ($fcs << 1);
}
- $seq = $chr[$code{$i}];
- for($j=0; $j < 8; $j++) {
- if (($j % 2) == 0) {
- $t = true; // bar
+ $fcs &= 0x7FF;
+ $data <<= 1;
+ }
+ // do rest of bytes
+ for ($byte = 1; $byte < 13; ++$byte) {
+ $data = hexdec($code_arr[$byte]) << 3;
+ for ($bit = 0; $bit < 8; ++$bit) {
+ if (($fcs ^ $data) & 0x400) {
+ $fcs = ($fcs << 1) ^ $genpoly;
} else {
- $t = false; // space
+ $fcs = ($fcs << 1);
}
- $w = $seq{$j};
- $bararray["bcode"][$k] = array("t" => $t, "w" => $w, "h" => 1, "p" => 0);
- $bararray["maxw"] += $w;
- $k++;
+ $fcs &= 0x7FF;
+ $data <<= 1;
}
}
- return $bararray;
+ return $fcs;
}
-} // end of class
-
-//============================================================+
-// END OF FILE
-//============================================================+
+ /**
+ * Reverse unsigned short value
+ * @param int $num value to reversr
+ * @return int reversed value
+ * @access protected
+ */
+ protected function imb_reverse_us($num) {
+ $rev = 0;
+ for ($i = 0; $i < 16; ++$i) {
+ $rev <<= 1;
+ $rev |= ($num & 1);
+ $num >>= 1;
+ }
+ return $rev;
+ }
+
+ /**
+ * generate Nof13 tables used for Intelligent Mail Barcode
+ * @param int $n is the type of table: 2 for 2of13 table, 5 for 5of13table
+ * @param int $size size of table (78 for n=2 and 1287 for n=5)
+ * @return array requested table
+ * @access protected
+ */
+ protected function imb_tables($n, $size) {
+ $table = array();
+ $lli = 0; // LUT lower index
+ $lui = $size - 1; // LUT upper index
+ for ($count = 0; $count < 8192; ++$count) {
+ $bit_count = 0;
+ for ($bit_index = 0; $bit_index < 13; ++$bit_index) {
+ $bit_count += intval(($count & (1 << $bit_index)) != 0);
+ }
+ // if we don't have the right number of bits on, go on to the next value
+ if ($bit_count == $n) {
+ $reverse = ($this->imb_reverse_us($count) >> 3);
+ // if the reverse is less than count, we have already visited this pair before
+ if ($reverse >= $count) {
+ // If count is symmetric, place it at the first free slot from the end of the list.
+ // Otherwise, place it at the first free slot from the beginning of the list AND place $reverse ath the next free slot from the beginning of the list
+ if ($reverse == $count) {
+ $table[$lui] = $count;
+ --$lui;
+ } else {
+ $table[$lli] = $count;
+ ++$lli;
+ $table[$lli] = $reverse;
+ ++$lli;
+ }
+ }
+ }
+ }
+ return $table;
+ }
+
+} // end of class
+
+//============================================================+
+// END OF FILE
+//============================================================+
?>
diff --git a/lib/tcpdf/config/lang/eng.php b/lib/tcpdf/config/lang/eng.php
deleted file mode 100755
index b6a084c2db..0000000000
--- a/lib/tcpdf/config/lang/eng.php
+++ /dev/null
@@ -1,49 +0,0 @@
-
diff --git a/lib/tcpdf/config/tcpdf_config.php b/lib/tcpdf/config/tcpdf_config.php
index 0656c2eb9f..ee66d75127 100755
--- a/lib/tcpdf/config/tcpdf_config.php
+++ b/lib/tcpdf/config/tcpdf_config.php
@@ -1,247 +1,232 @@
-
- *
- * Moodle-specific changes:
- * Default values for K_PATH_MAIN and K_PATH_URL are automatically set for
- * the Moodle installation. K_PATH_CACHE set to Moodle datadir cache.
- * K_PATH_URL_CACHE can't be mapped in Moodle as datadir should not be
- * accessible directly. However, it doesn't seem to be used within the
- * library code.
- * K_IMAGES_PATH set to Moodle dirroot
- */
-
-if (empty($CFG)) {
- die("ERROR: The library can be used by Moodle script only.");
-}
-
-// If you define the constant K_TCPDF_EXTERNAL_CONFIG, the following settings will be ignored.
-
-if (!defined("K_TCPDF_EXTERNAL_CONFIG")) {
-
- // DOCUMENT_ROOT fix for IIS Webserver
- if ((!isset($_SERVER['DOCUMENT_ROOT'])) OR (empty($_SERVER['DOCUMENT_ROOT']))) {
- if(isset($_SERVER['SCRIPT_FILENAME'])) {
- $_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr($_SERVER['SCRIPT_FILENAME'], 0, 0-strlen($_SERVER['PHP_SELF'])));
- } elseif(isset($_SERVER['PATH_TRANSLATED'])) {
- $_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr(str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']), 0, 0-strlen($_SERVER['PHP_SELF'])));
- } else {
- // define here your DOCUMENT_ROOT path if the previous fails
- $_SERVER['DOCUMENT_ROOT'] = "/var/www";
- }
- }
-
- //// Automatic calculation for the following K_PATH_MAIN constant
- //$k_path_main = str_replace( '\\', '/', realpath(substr(dirname(__FILE__), 0, 0-strlen("config"))));
- //if (substr($k_path_main, -1) != '/') {
- // $k_path_main .= '/';
- //}
-
- /**
- * Installation path (/var/www/tcpdf/).
- * By default it is automatically calculated but you can also set it as a fixed string to improve performances.
- */
- //define ("K_PATH_MAIN", $k_path_main);
- define ('K_PATH_MAIN', $CFG->dirroot.'/lib/tcpdf/');
-
- //// Automatic calculation for the following K_PATH_URL constant
- //if (isset($_SERVER["HTTP_HOST"]) AND (!empty($_SERVER["HTTP_HOST"]))) {
- // if(isset($_SERVER["HTTPS"]) AND (!empty($_SERVER["HTTPS"])) AND strtolower($_SERVER['HTTPS'])!='off') {
- // $k_path_url = "https://";
- // } else {
- // $k_path_url = "http://";
- // }
- // $k_path_url .= $_SERVER["HTTP_HOST"];
- // $k_path_url .= str_replace( '\\', '/', substr($_SERVER["PHP_SELF"], 0, -24));
- //}
-
- /**
- * URL path to tcpdf installation folder (http://localhost/tcpdf/).
- * By default it is automatically calculated but you can also set it as a fixed string to improve performances..
- */
- //define ("K_PATH_URL", $k_path_url);
- define ('K_PATH_URL', $CFG->wwwroot.'/lib/tcpdf/');
-
- /**
- * path for PDF fonts
- * use K_PATH_MAIN."fonts/old/" for old non-UTF8 fonts
- */
- define ("K_PATH_FONTS", K_PATH_MAIN."fonts/");
-
- /**
- * cache directory for temporary files (full path)
- */
- //define ("K_PATH_CACHE", K_PATH_MAIN."cache/");
- define ("K_PATH_CACHE", $CFG->dataroot.'/cache/' );
-
- /**
- * cache directory for temporary files (url path)
- */
- //define ("K_PATH_URL_CACHE", K_PATH_URL."cache/");
- define ("K_PATH_URL_CACHE", K_PATH_URL);
-
- /**
- *images directory
- */
- //define ("K_PATH_IMAGES", K_PATH_MAIN."images/");
- define("K_PATH_IMAGES", $CFG->dirroot.'/');
-
- /**
- * blank image
- */
- //define ("K_BLANK_IMAGE", K_PATH_IMAGES."_blank.png");
- define ("K_BLANK_IMAGE", K_PATH_MAIN."images/_blank.png");
-
- /**
- * page format
- */
- define ("PDF_PAGE_FORMAT", "A4");
-
- /**
- * page orientation (P=portrait, L=landscape)
- */
- define ("PDF_PAGE_ORIENTATION", "P");
-
- /**
- * document creator
- */
- define ("PDF_CREATOR", "TCPDF");
-
- /**
- * document author
- */
- define ("PDF_AUTHOR", "TCPDF");
-
- /**
- * header title
- */
- define ("PDF_HEADER_TITLE", "TCPDF Example");
-
- /**
- * header description string
- */
- define ("PDF_HEADER_STRING", "by Nicola Asuni - Tecnick.com\nwww.tcpdf.org");
-
- /**
- * image logo
- */
- define ("PDF_HEADER_LOGO", "tcpdf_logo.jpg");
-
- /**
- * header logo image width [mm]
- */
- define ("PDF_HEADER_LOGO_WIDTH", 30);
-
- /**
- * document unit of measure [pt=point, mm=millimeter, cm=centimeter, in=inch]
- */
- define ("PDF_UNIT", "mm");
-
- /**
- * header margin
- */
- define ("PDF_MARGIN_HEADER", 5);
-
- /**
- * footer margin
- */
- define ("PDF_MARGIN_FOOTER", 10);
-
- /**
- * top margin
- */
- define ("PDF_MARGIN_TOP", 27);
-
- /**
- * bottom margin
- */
- define ("PDF_MARGIN_BOTTOM", 25);
-
- /**
- * left margin
- */
- define ("PDF_MARGIN_LEFT", 15);
-
- /**
- * right margin
- */
- define ("PDF_MARGIN_RIGHT", 15);
-
- /**
- * main font name
- */
- define ("PDF_FONT_NAME_MAIN", "dejavusans");
-
- /**
- * main font size
- */
- define ("PDF_FONT_SIZE_MAIN", 10);
-
- /**
- * data font name
- */
- define ("PDF_FONT_NAME_DATA", "dejavusans");
-
- /**
- * data font size
- */
- define ("PDF_FONT_SIZE_DATA", 8);
-
- /**
- * scale factor for images (number of points in user unit)
- */
- define ("PDF_IMAGE_SCALE_RATIO", 4);
-
- /**
- * magnification factor for titles
- */
- define("HEAD_MAGNIFICATION", 1.1);
-
- /**
- * height of cell repect font height
- */
- define("K_CELL_HEIGHT_RATIO", 1.25);
-
- /**
- * title magnification respect main font size
- */
- define("K_TITLE_MAGNIFICATION", 1.3);
-
- /**
- * reduction factor for small font
- */
- define("K_SMALL_RATIO", 2/3);
-}
-
-//============================================================+
-// END OF FILE
-//============================================================+
+
diff --git a/lib/tcpdf/config/tcpdf_config_alt.php b/lib/tcpdf/config/tcpdf_config_alt.php
deleted file mode 100644
index baf98c5357..0000000000
--- a/lib/tcpdf/config/tcpdf_config_alt.php
+++ /dev/null
@@ -1,227 +0,0 @@
-
diff --git a/lib/tcpdf/fonts/README-MOODLE.TXT b/lib/tcpdf/fonts/README-MOODLE.TXT
new file mode 100644
index 0000000000..cdf3a7859b
--- /dev/null
+++ b/lib/tcpdf/fonts/README-MOODLE.TXT
@@ -0,0 +1,6 @@
+This directory contains just selected set of original tcpdf fonts in order to
+keep the standard Moodle distribution lightweight. You may want to manually
+download tcpdf package and extract its fonts/ directory into your
+$CFG->dataroot/fonts/. In such case, pdflib.php will use this directory. In
+the future, we plan to have fonts downloadable in a same way as languages are.
+(TODO MDL-18663).
diff --git a/lib/tcpdf/fonts/almohanad.ctg.z b/lib/tcpdf/fonts/almohanad.ctg.z
deleted file mode 100644
index 8e9b577e4e757b151a2600f315264feb99db0a19..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2780
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
B9ccgn
diff --git a/lib/tcpdf/fonts/almohanad.php b/lib/tcpdf/fonts/almohanad.php
deleted file mode 100644
index e453fb5a78..0000000000
--- a/lib/tcpdf/fonts/almohanad.php
+++ /dev/null
@@ -1,101 +0,0 @@
-1093,'Descent'=>-509,'CapHeight'=>1093,'Flags'=>32,'FontBBox'=>'[-278 -507 1124 1093]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>600);
-$up=-136;
-$ut=64;
-$cw=array(
- 0=>0, 32=>139, 33=>185, 34=>308, 35=>278, 36=>278, 37=>556, 38=>463, 39=>154, 40=>185, 41=>185, 42=>278, 43=>317, 44=>139, 45=>185, 46=>139,
- 47=>154, 48=>278, 49=>278, 50=>278, 51=>278, 52=>278, 53=>278, 54=>278, 55=>278, 56=>278, 57=>278, 58=>185, 59=>185, 60=>317, 61=>317, 62=>317,
- 63=>278, 64=>517, 65=>401, 66=>371, 67=>401, 68=>402, 69=>371, 70=>339, 71=>432, 72=>430, 73=>214, 74=>278, 75=>424, 76=>369, 77=>524, 78=>401,
- 79=>432, 80=>339, 81=>432, 82=>396, 83=>309, 84=>371, 85=>401, 86=>401, 87=>556, 88=>401, 89=>401, 90=>371, 91=>185, 92=>154, 93=>185, 94=>323,
- 95=>278, 96=>185, 97=>278, 98=>309, 99=>247, 100=>309, 101=>247, 102=>185, 103=>278, 104=>309, 105=>154, 106=>185, 107=>309, 108=>154, 109=>463, 110=>309,
- 111=>278, 112=>309, 113=>309, 114=>247, 115=>216, 116=>185, 117=>309, 118=>278, 119=>401, 120=>278, 121=>278, 122=>247, 123=>219, 124=>122, 125=>219, 126=>289,
- 8364=>278, 1027=>339, 8218=>185, 1107=>254, 8222=>278, 8230=>556, 8224=>278, 8225=>278, 710=>185, 8240=>556, 352=>309, 8249=>185, 338=>556, 1036=>432, 381=>371, 1039=>432,
- 8216=>185, 8217=>185, 8220=>278, 8221=>278, 8226=>194, 8211=>278, 8212=>556, 732=>185, 8482=>556, 353=>216, 8250=>185, 339=>401, 1116=>297, 382=>247, 376=>401, 161=>185,
- 162=>278, 163=>278, 164=>278, 165=>278, 166=>122, 167=>278, 168=>185, 169=>415, 170=>167, 171=>278, 172=>317, 174=>415, 175=>185, 176=>222, 177=>317, 178=>167,
- 179=>167, 180=>185, 181=>309, 182=>300, 183=>139, 184=>185, 185=>167, 186=>183, 187=>278, 188=>417, 189=>417, 190=>417, 191=>278, 192=>401, 193=>401, 194=>401,
- 195=>401, 196=>401, 197=>401, 198=>556, 199=>401, 200=>371, 201=>371, 202=>371, 203=>371, 204=>216, 205=>216, 206=>216, 207=>216, 208=>401, 209=>401, 210=>432,
- 211=>432, 212=>432, 213=>432, 214=>432, 215=>317, 216=>432, 217=>401, 218=>401, 219=>401, 220=>401, 221=>401, 222=>339, 223=>309, 224=>278, 225=>278, 226=>278,
- 227=>278, 228=>278, 229=>278, 230=>401, 231=>247, 232=>247, 233=>247, 234=>247, 235=>247, 236=>154, 237=>154, 238=>154, 239=>154, 240=>278, 241=>309, 242=>278,
- 243=>278, 244=>278, 245=>278, 246=>278, 247=>317, 248=>278, 249=>309, 250=>309, 251=>309, 252=>309, 253=>278, 254=>309, 255=>278, 256=>401, 257=>278, 258=>401,
- 259=>278, 260=>401, 261=>278, 262=>401, 263=>247, 264=>401, 265=>247, 266=>401, 267=>247, 268=>401, 269=>247, 270=>401, 271=>309, 272=>401, 273=>309, 274=>371,
- 275=>247, 276=>371, 277=>247, 278=>371, 279=>247, 280=>371, 281=>247, 282=>371, 283=>247, 284=>432, 285=>278, 286=>432, 287=>278, 288=>432, 289=>278, 290=>432,
- 291=>278, 292=>432, 293=>309, 294=>432, 295=>309, 296=>216, 297=>154, 298=>216, 299=>154, 300=>216, 301=>154, 302=>216, 303=>154, 304=>216, 305=>154, 306=>490,
- 307=>270, 308=>278, 309=>185, 310=>432, 311=>309, 312=>297, 313=>371, 314=>154, 315=>371, 316=>154, 317=>371, 318=>154, 319=>371, 320=>293, 321=>371, 322=>154,
- 323=>401, 324=>309, 325=>401, 326=>309, 327=>401, 328=>309, 329=>391, 330=>401, 331=>309, 332=>432, 333=>278, 334=>432, 335=>278, 336=>432, 337=>278, 340=>401,
- 341=>247, 342=>401, 343=>247, 344=>401, 345=>247, 346=>309, 347=>216, 348=>309, 349=>216, 350=>309, 351=>216, 354=>371, 355=>185, 356=>371, 357=>185, 358=>371,
- 359=>185, 360=>401, 361=>309, 362=>401, 363=>309, 364=>401, 365=>309, 366=>401, 367=>309, 368=>401, 369=>309, 370=>401, 371=>309, 372=>556, 373=>401, 374=>401,
- 375=>278, 377=>371, 378=>247, 379=>371, 380=>247, 383=>185, 450=>317, 477=>247, 484=>432, 485=>278, 536=>309, 537=>216, 538=>371, 539=>185, 658=>282, 711=>185,
- 728=>185, 729=>185, 730=>185, 731=>185, 733=>185, 768=>0, 769=>0, 770=>0, 771=>0, 772=>0, 773=>0, 774=>0, 775=>0, 776=>0, 777=>0, 778=>0,
- 779=>0, 780=>0, 781=>0, 782=>0, 783=>0, 784=>0, 785=>0, 786=>0, 787=>0, 788=>0, 789=>0, 790=>0, 791=>0, 792=>0, 793=>0, 794=>0,
- 795=>0, 796=>0, 797=>0, 798=>0, 799=>0, 800=>0, 801=>0, 802=>0, 803=>0, 804=>0, 805=>0, 806=>0, 807=>0, 808=>0, 809=>0, 810=>0,
- 811=>0, 812=>0, 813=>0, 814=>0, 815=>0, 816=>0, 817=>0, 818=>0, 819=>0, 820=>0, 821=>0, 822=>0, 823=>0, 824=>0, 825=>0, 826=>0,
- 827=>0, 828=>0, 829=>0, 830=>0, 831=>0, 864=>0, 865=>0, 884=>111, 885=>111, 890=>0, 894=>185, 900=>100, 901=>183, 902=>401, 903=>139, 904=>451,
- 905=>532, 906=>316, 908=>451, 910=>501, 911=>451, 912=>183, 913=>401, 914=>371, 915=>339, 916=>422, 917=>371, 918=>371, 919=>432, 920=>432, 921=>216, 922=>432,
- 923=>401, 924=>524, 925=>401, 926=>361, 927=>432, 928=>451, 929=>339, 931=>361, 932=>371, 933=>401, 934=>482, 935=>401, 936=>482, 937=>451, 938=>0, 939=>401,
- 940=>336, 941=>244, 942=>336, 943=>183, 944=>306, 945=>336, 946=>306, 947=>306, 948=>306, 949=>244, 950=>275, 951=>336, 952=>306, 953=>183, 954=>338, 955=>275,
- 956=>336, 957=>275, 958=>275, 959=>306, 960=>336, 961=>306, 962=>244, 963=>306, 964=>244, 965=>306, 966=>367, 967=>275, 968=>397, 969=>397, 970=>183, 971=>306,
- 972=>306, 973=>306, 974=>397, 976=>306, 977=>306, 978=>401, 979=>401, 980=>401, 981=>367, 982=>336, 986=>283, 987=>237, 988=>339, 989=>261, 1024=>371, 1025=>371,
- 1026=>371, 1028=>401, 1029=>309, 1030=>216, 1031=>216, 1032=>278, 1033=>573, 1034=>573, 1035=>449, 1037=>432, 1038=>401, 1040=>401, 1041=>371, 1042=>371, 1043=>328, 1044=>432,
- 1045=>371, 1046=>615, 1047=>313, 1048=>429, 1049=>429, 1050=>424, 1051=>432, 1052=>524, 1053=>432, 1054=>432, 1055=>430, 1056=>339, 1057=>401, 1058=>371, 1059=>401, 1060=>444,
- 1061=>401, 1062=>429, 1063=>432, 1064=>618, 1065=>618, 1066=>482, 1067=>539, 1068=>350, 1069=>401, 1070=>619, 1071=>408, 1072=>278, 1073=>278, 1074=>279, 1075=>246, 1076=>309,
- 1077=>247, 1078=>417, 1079=>227, 1080=>319, 1081=>319, 1082=>297, 1083=>302, 1084=>376, 1085=>309, 1086=>278, 1087=>309, 1088=>309, 1089=>247, 1090=>274, 1091=>278, 1092=>458,
- 1093=>278, 1094=>309, 1095=>309, 1096=>454, 1097=>454, 1098=>340, 1099=>423, 1100=>284, 1101=>247, 1102=>439, 1103=>284, 1104=>247, 1105=>247, 1106=>309, 1108=>247, 1109=>216,
- 1110=>154, 1111=>154, 1112=>185, 1113=>440, 1114=>437, 1115=>309, 1117=>309, 1118=>278, 1119=>309, 1164=>339, 1165=>284, 1166=>339, 1167=>309, 1168=>339, 1169=>254, 1170=>339,
- 1171=>254, 1172=>339, 1173=>254, 1174=>615, 1175=>417, 1176=>322, 1177=>216, 1178=>432, 1179=>297, 1180=>432, 1181=>297, 1182=>432, 1183=>297, 1184=>537, 1185=>352, 1186=>432,
- 1187=>309, 1188=>563, 1189=>408, 1190=>432, 1191=>461, 1192=>401, 1193=>247, 1194=>401, 1195=>247, 1196=>371, 1197=>274, 1198=>401, 1199=>278, 1200=>401, 1201=>278, 1202=>401,
- 1203=>278, 1204=>581, 1205=>432, 1206=>432, 1207=>309, 1208=>432, 1209=>309, 1210=>432, 1211=>309, 1212=>367, 1213=>247, 1214=>367, 1215=>247, 1216=>216, 1217=>615, 1218=>417,
- 1219=>432, 1220=>297, 1223=>432, 1224=>309, 1227=>432, 1228=>309, 1232=>401, 1233=>278, 1234=>401, 1235=>278, 1236=>556, 1237=>401, 1238=>371, 1239=>247, 1240=>367, 1241=>247,
- 1242=>367, 1243=>247, 1244=>615, 1245=>417, 1246=>313, 1247=>227, 1248=>322, 1249=>216, 1250=>432, 1251=>309, 1252=>432, 1253=>309, 1254=>432, 1255=>278, 1256=>432, 1257=>278,
- 1258=>432, 1259=>278, 1260=>401, 1261=>247, 1262=>401, 1263=>278, 1264=>401, 1265=>278, 1266=>401, 1267=>278, 1268=>432, 1269=>309, 1272=>548, 1273=>423, 1488=>280, 1489=>280,
- 1490=>174, 1491=>280, 1492=>280, 1493=>158, 1494=>158, 1495=>280, 1496=>280, 1497=>158, 1498=>287, 1499=>280, 1500=>280, 1501=>280, 1502=>280, 1503=>156, 1504=>158, 1505=>280,
- 1506=>280, 1507=>292, 1508=>280, 1509=>273, 1510=>280, 1511=>305, 1512=>285, 1513=>299, 1514=>280, 1548=>195, 1563=>246, 1567=>340, 1569=>392, 1570=>306, 1571=>247, 1572=>447,
- 1573=>247, 1574=>602, 1575=>192, 1576=>635, 1577=>369, 1578=>635, 1579=>635, 1580=>548, 1581=>1173, 1582=>548, 1583=>363, 1584=>363, 1585=>439, 1586=>442, 1587=>875, 1588=>875,
- 1589=>1061, 1590=>1061, 1591=>811, 1592=>811, 1593=>549, 1594=>547, 1600=>389, 1601=>755, 1602=>574, 1603=>717, 1604=>555, 1605=>423, 1606=>532, 1607=>371, 1608=>454, 1609=>633,
- 1610=>643, 1611=>-19, 1612=>-26, 1613=>-20, 1614=>-19, 1615=>-18, 1616=>-19, 1617=>-19, 1618=>-15, 1632=>383, 1633=>383, 1634=>383, 1635=>383, 1636=>383, 1637=>383, 1638=>383,
- 1639=>383, 1640=>383, 1641=>383, 1642=>383, 1645=>398, 7936=>336, 7937=>336, 7938=>336, 7939=>336, 7940=>336, 7941=>336, 7942=>336, 7943=>336, 7944=>401, 7945=>401, 7946=>401,
- 7947=>401, 7948=>401, 7949=>401, 7950=>401, 7951=>401, 7952=>244, 7953=>244, 7954=>244, 7955=>244, 7956=>244, 7957=>244, 7960=>371, 7961=>371, 7962=>371, 7963=>371, 7964=>371,
- 7965=>371, 7968=>336, 7969=>336, 7970=>336, 7971=>336, 7972=>336, 7973=>336, 7974=>336, 7975=>336, 7976=>432, 7977=>432, 7978=>432, 7979=>432, 7980=>432, 7981=>432, 7982=>432,
- 7983=>432, 7984=>183, 7985=>183, 7986=>183, 7987=>183, 7988=>183, 7989=>183, 7990=>183, 7991=>183, 7992=>216, 7993=>216, 7994=>216, 7995=>216, 7996=>216, 7997=>216, 7998=>216,
- 7999=>216, 8000=>306, 8001=>306, 8002=>306, 8003=>306, 8004=>306, 8005=>306, 8008=>432, 8009=>432, 8010=>432, 8011=>432, 8012=>432, 8013=>432, 8016=>306, 8017=>306, 8018=>306,
- 8019=>306, 8020=>306, 8021=>306, 8022=>306, 8023=>306, 8025=>401, 8027=>401, 8029=>401, 8031=>401, 8032=>397, 8033=>397, 8034=>397, 8035=>397, 8036=>397, 8037=>397, 8038=>397,
- 8039=>397, 8040=>451, 8041=>451, 8042=>451, 8043=>451, 8044=>451, 8045=>451, 8046=>451, 8047=>451, 8048=>336, 8049=>336, 8050=>244, 8051=>244, 8052=>336, 8053=>336, 8054=>183,
- 8055=>183, 8056=>306, 8057=>306, 8058=>306, 8059=>306, 8060=>397, 8061=>397, 8064=>336, 8065=>336, 8066=>336, 8067=>336, 8068=>336, 8069=>336, 8070=>336, 8071=>336, 8072=>401,
- 8073=>401, 8074=>401, 8075=>401, 8076=>401, 8077=>401, 8078=>401, 8079=>401, 8080=>336, 8081=>336, 8082=>336, 8083=>336, 8084=>336, 8085=>336, 8086=>336, 8087=>336, 8088=>432,
- 8089=>432, 8090=>432, 8091=>432, 8092=>432, 8093=>432, 8094=>432, 8095=>432, 8096=>397, 8097=>397, 8098=>397, 8099=>397, 8100=>397, 8101=>397, 8102=>397, 8103=>397, 8104=>451,
- 8105=>451, 8106=>451, 8107=>451, 8108=>451, 8109=>451, 8110=>451, 8111=>451, 8112=>336, 8113=>336, 8114=>336, 8115=>336, 8116=>336, 8118=>336, 8119=>336, 8120=>401, 8121=>401,
- 8122=>401, 8123=>401, 8124=>401, 8125=>278, 8126=>0, 8127=>278, 8128=>278, 8129=>306, 8130=>336, 8131=>336, 8132=>336, 8134=>336, 8135=>336, 8136=>371, 8137=>371, 8138=>432,
- 8139=>432, 8140=>432, 8141=>278, 8142=>278, 8143=>278, 8144=>183, 8145=>183, 8146=>183, 8147=>183, 8150=>183, 8151=>183, 8152=>216, 8153=>216, 8154=>216, 8155=>216, 8157=>278,
- 8158=>278, 8159=>278, 8160=>306, 8161=>306, 8162=>306, 8163=>306, 8164=>306, 8165=>306, 8166=>306, 8167=>306, 8168=>401, 8169=>401, 8170=>401, 8171=>401, 8172=>339, 8173=>306,
- 8174=>306, 8175=>278, 8178=>397, 8179=>397, 8180=>397, 8182=>397, 8183=>397, 8184=>432, 8185=>432, 8186=>451, 8187=>451, 8188=>451, 8189=>278, 8190=>278, 8208=>185, 8209=>185,
- 8219=>185, 8223=>278, 8227=>311, 8241=>1011, 8248=>261, 8251=>404, 8253=>386, 8255=>529, 8256=>529, 8257=>188, 8258=>517, 8259=>185, 8260=>93, 8261=>184, 8262=>184, 8267=>300,
- 8308=>167, 8309=>556, 8321=>167, 8322=>167, 8323=>167, 8324=>167, 8352=>394, 8353=>401, 8354=>435, 8355=>339, 8356=>278, 8357=>463, 8358=>401, 8359=>389, 8361=>556, 8470=>530,
- 8471=>415, 8479=>401, 8483=>401, 8486=>451, 8487=>451, 8494=>306, 8498=>339, 8543=>417, 8706=>274, 8710=>340, 8721=>396, 8722=>317, 8730=>305, 8734=>418, 8800=>317, 8804=>317,
- 8805=>317, 9674=>274, 12353=>556, 12354=>556, 12355=>556, 12356=>556, 12357=>556, 12358=>556, 12359=>556, 12360=>556, 12361=>556, 12362=>556, 12363=>556, 12364=>556, 12365=>556, 12366=>556,
- 12367=>556, 12368=>556, 12369=>556, 12370=>556, 12371=>556, 12372=>556, 12373=>556, 12374=>556, 12375=>556, 12376=>556, 12377=>556, 12378=>556, 12379=>556, 12380=>556, 12381=>556, 12382=>556,
- 12383=>556, 12384=>556, 12385=>556, 12386=>556, 12387=>556, 12388=>556, 12389=>556, 12390=>556, 12391=>556, 12392=>556, 12393=>556, 12394=>556, 12395=>556, 12396=>556, 12397=>556, 12398=>556,
- 12399=>556, 12400=>556, 12401=>556, 12402=>556, 12403=>556, 12404=>556, 12405=>556, 12406=>556, 12407=>556, 12408=>556, 12409=>556, 12410=>556, 12411=>556, 12412=>556, 12413=>556, 12414=>556,
- 12415=>556, 12416=>556, 12417=>556, 12418=>556, 12419=>556, 12420=>556, 12421=>556, 12422=>556, 12423=>556, 12424=>556, 12425=>556, 12426=>556, 12427=>556, 12428=>556, 12429=>556, 12430=>556,
- 12431=>556, 12432=>556, 12433=>556, 12434=>556, 12435=>556, 12449=>556, 12450=>556, 12451=>556, 12452=>556, 12453=>556, 12454=>556, 12455=>556, 12456=>556, 12457=>556, 12458=>556, 12459=>556,
- 12460=>556, 12461=>556, 12462=>556, 12463=>556, 12464=>556, 12465=>556, 12466=>556, 12467=>556, 12468=>556, 12469=>556, 12470=>556, 12471=>556, 12472=>556, 12473=>556, 12474=>556, 12475=>556,
- 12476=>556, 12477=>556, 12478=>556, 12479=>556, 12480=>556, 12481=>556, 12482=>556, 12483=>556, 12484=>556, 12485=>556, 12486=>556, 12487=>556, 12488=>556, 12489=>556, 12490=>556, 12491=>556,
- 12492=>556, 12493=>556, 12494=>556, 12495=>556, 12496=>556, 12497=>556, 12498=>556, 12499=>556, 12500=>556, 12501=>556, 12502=>556, 12503=>556, 12504=>556, 12505=>556, 12506=>556, 12507=>556,
- 12508=>556, 12509=>556, 12510=>556, 12511=>556, 12512=>556, 12513=>556, 12514=>556, 12515=>556, 12516=>556, 12517=>556, 12518=>556, 12519=>556, 12520=>556, 12521=>556, 12522=>556, 12523=>556,
- 12524=>556, 12525=>556, 12526=>556, 12527=>556, 12528=>556, 12529=>556, 12530=>556, 12531=>556, 12532=>556, 12533=>556, 12534=>556, 63033=>278, 63034=>278, 63035=>278, 63036=>278, 63037=>278,
- 63038=>278, 63039=>278, 63040=>278, 63041=>278, 63171=>185, 63196=>278, 64256=>309, 64257=>309, 64258=>309, 64259=>463, 64260=>463, 64262=>402, 64606=>0, 64607=>0, 64608=>0, 64609=>0,
- 64610=>0, 64830=>467, 64831=>467, 65010=>814, 65152=>392, 65153=>306, 65154=>281, 65155=>247, 65156=>250, 65157=>447, 65158=>412, 65159=>247, 65160=>222, 65161=>602, 65162=>535, 65163=>360,
- 65164=>329, 65165=>192, 65166=>220, 65167=>635, 65168=>644, 65169=>338, 65170=>321, 65171=>369, 65172=>419, 65173=>635, 65174=>644, 65175=>345, 65176=>336, 65177=>635, 65178=>644, 65179=>393,
- 65180=>345, 65181=>548, 65182=>553, 65183=>637, 65184=>652, 65185=>548, 65186=>546, 65187=>637, 65188=>656, 65189=>548, 65190=>544, 65191=>637, 65192=>656, 65193=>363, 65194=>439, 65195=>363,
- 65196=>439, 65197=>440, 65198=>471, 65199=>439, 65200=>474, 65201=>875, 65202=>871, 65203=>608, 65204=>588, 65205=>875, 65206=>871, 65207=>609, 65208=>587, 65209=>1061, 65210=>1033, 65211=>794,
- 65212=>758, 65213=>1061, 65214=>1033, 65215=>794, 65216=>761, 65217=>811, 65218=>793, 65219=>659, 65220=>647, 65221=>811, 65222=>793, 65223=>659, 65224=>642, 65225=>549, 65226=>481, 65227=>512,
- 65228=>409, 65229=>547, 65230=>476, 65231=>512, 65232=>409, 65233=>755, 65234=>748, 65235=>416, 65236=>442, 65237=>574, 65238=>550, 65239=>416, 65240=>442, 65241=>717, 65242=>687, 65243=>883,
- 65244=>409, 65245=>555, 65246=>511, 65247=>338, 65248=>297, 65249=>423, 65250=>478, 65251=>489, 65252=>476, 65253=>532, 65254=>548, 65255=>336, 65256=>326, 65257=>371, 65258=>391, 65259=>524,
- 65260=>412, 65261=>454, 65262=>412, 65263=>633, 65264=>566, 65265=>643, 65266=>560, 65267=>357, 65268=>333, 65269=>623, 65270=>617, 65271=>603, 65272=>621, 65273=>576, 65274=>617, 65275=>576,
- 65276=>625);
-$enc='';
-$diff='';
-$file='almohanad.z';
-$ctg='almohanad.ctg.z';
-$originalsize=227760;
-?>
diff --git a/lib/tcpdf/fonts/almohanad.z b/lib/tcpdf/fonts/almohanad.z
deleted file mode 100644
index 27426a68f01cc1f1ecda64f9a9924f847fdb47ac..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 121292
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