Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authormattab <matthieu.aubry@gmail.com>2013-11-11 08:48:34 +0400
committermattab <matthieu.aubry@gmail.com>2013-11-11 08:48:34 +0400
commit750e5446d111163bf82cbf9a913c3e66c10e168c (patch)
tree0134f731d26dadd2670b3fc87b6bd56c4380621f /libs
parent58654ca0a92f0153a5b263861a73642debd6a8c6 (diff)
Refs #4288 removes useless files
Diffstat (limited to 'libs')
-rw-r--r--libs/tcpdf/CHANGELOG.TXT2682
-rw-r--r--libs/tcpdf/include/barcodes/datamatrix.php1149
-rw-r--r--libs/tcpdf/include/barcodes/pdf417.php996
-rw-r--r--libs/tcpdf/include/barcodes/qrcode.php2866
-rw-r--r--libs/tcpdf/tcpdf_barcodes_1d.php2287
-rw-r--r--libs/tcpdf/tcpdf_barcodes_2d.php332
6 files changed, 0 insertions, 10312 deletions
diff --git a/libs/tcpdf/CHANGELOG.TXT b/libs/tcpdf/CHANGELOG.TXT
deleted file mode 100644
index 9f7e056900..0000000000
--- a/libs/tcpdf/CHANGELOG.TXT
+++ /dev/null
@@ -1,2682 +0,0 @@
-6.0.044 (2013-11-10)
- - Bug #857 "Undefined offset error" was fixed.
- - The uniord method now uses a static cache to improve performances (thanks to Mathieu Masseboeuf for the sugegstion).
- - Two bugs in the TCPDF_FONTS class were fixed.
-
-6.0.043 (2013-10-29)
- - Bug #854 "CSS instruction display" was fixed.
-
-6.0.042 (2013-10-25)
- - Bug #852 "CMYK Colors Bug" was fixed.
-
-6.0.041 (2013-10-21)
- - Bug #851 "Problem with images in PDF. PHP timing out" was fixed.
-
-6.0.040 (2013-10-20)
- - Bug #849 "SVG import bug" was fixed.
-
-6.0.039 (2013-10-13)
- - Bug #843 "Wrong call in parser" was fixed.
- - Bug #844 "Wrong object type named" was fixed.
- - Bug #845 "Parsing error on obj ref prefixed by '000000'" was fixed.
-
-6.0.038 (2013-10-06)
- - Bug #841 "Division by zero warning at writeHTML a <li> tag" was fixed.
-
-6.0.037 (2013-09-30)
- - Method getAllSpotColors() was added to return all spot colors.
- - Method colorRegistrationBar() was extended to automatically print all spot colors and support individual spot colors.
- - The method registrationMarkCMYK() was added to print a registration mark for CMYK colors.
- - A bug related to page groups was fixed.
- - Gradient() method now supports CMYK equivalents of spot colors.
- - Example n. 56 was updated.
-
-6.0.036 (2013-09-29)
- - Methods for registration bars and crop marks were extended to support registration color (see example n. 56).
- - New default spot colors were added to tcpdf_colors.php, including the 'All' and 'None' special registration colors.
-
-6.0.035 (2013-09-25)
- - TCPDF_PARSER class was improved.
-
-6.0.034 (2013-09-24)
- - Bug #839 "Error in xref parsing in mixed newline chars" was fixed.
-
-6.0.033 (2013-09-23)
- - Bug fix related to PNG image transparency using GD library.
-
-6.0.032 (2013-09-23)
- - Bug #838 "Fatal error when imagick cannot handle the image, even though GD is available and can" was fixed.
-
-6.0.031 (2013-09-18)
- - Bug #836 "Optional EOL marker before endstream" was fixed.
- - Some additional controls were added to avoid "division by zero" error with badly formatted input.
-
-6.0.030 (2013-09-17)
- - Bug #835 "PDF417 and Cyrilic simbols" was fixed.
-
-6.0.029 (2013-09-15)
- - Constants K_TCPDF_PARSER_THROW_EXCEPTION_ERROR and K_TCPDF_PARSER_IGNORE_DECODING_ERRORS where removed in favor of a new configuration array in the TCPDF_PARSER class.
- - The TCPDF_PARSER class can now be configured using the new $cfg parameter.
-
-6.0.028 (2013-09-15)
- - A debug print_r was removed form tcpdf_parser.php.
- - TCPDF_FILTERS class now throws an exception in case of error.
- - TCPDF_PARSER class now throws an exception in case of error unless you define the constant K_TCPDF_PARSER_THROW_EXCEPTION_ERROR to false.
- - The constant K_TCPDF_PARSER_IGNORE_DECODING_ERRORS can be set to tru eto ignore decoding errors on TCPDF_PARSER.
-
-6.0.027 (2013-09-14)
- - A bug in tcpdf_parser wen parsing hexadecimal strings was fixed.
- - A bug in tcpdf_parser wen looking for statxref was fixed.
- - A bug on RC4 encryption was fixed.
-
-6.0.026 (2013-09-14)
- - A bug in tcpdf_parser wen decoding streams was fixed.
-
-6.0.025 (2013-09-04)
- - A pregSplit() bug was fixed.
- - Improved content loading from URLs.
- - Improved font path loading.
-
-6.0.024 (2013-09-02)
- - Bug #826 "addEmptySignatureAppearance issue" was fixed.
-
-6.0.023 (2013-08-05)
- - GNU Freefont fonts were updated.
- - Licensing and copyright information about fonts were improved.
- - PNG image support was improved.
-
-6.0.022 (2013-08-02)
- - fixing initialization problem for signature_appearance property.
-
-6.0.021 (2013-07-18)
- - The bug caused by the preg_split function on some PHP 5.2.x versions was fixed.
-
-6.0.020 (2013-06-04)
- - The method addTTFfont() was fixed (Bug item #813 Undefined offset).
-
-6.0.019 (2013-06-04)
- - The magic constant __DIR__ was replaced with dirname(__FILE__) for php 5.2 compatibility.
- - The exceptions raised by file_exists() function were suppressed.
-
-6.0.018 (2013-05-19)
- - The barcode examples were changed to automatically search for the barcode class path (in case the examples directory is not installed under the TCPDF root).
-
-6.0.017 (2013-05-16)
- - The command line tool tcpdf_addfont.php was improved.
- - The php logic was removed from configuration files that now contains only constant defines.
- - The tcpdf_autoconfig.php file was added to automatically set missing configuration values.
-
-6.0.016 (2013-05-15)
- - The tcpdf_addfont.php tool was improved (thanks to Remi Collet).
- - Constant K_PATH_IMAGES is now automatically set in configuration file.
-
-6.0.015 (2013-05-14)
- - Some unused vars were removed from AddFont() method.
- - Some directories were moved inside the examples directory.
- - All examples were updated to reflect the new default structure.
- - Source code were clean-up up to be more compatible with system packaging.
- - Files encodings and permissions were reset.
- - The command line tool tcpdf_addfont.php was added on the tools directory.
-
-6.0.014 (2013-04-13)
- - The signature of addTTFfont() method includes a new parameter to link existing fonts instead of copying and compressing them.
-
-6.0.013 (2013-04-10)
- - Add support for SVG dx and dy text/tspan attributes.
- - replace require() with require_once().
- - fix some minor typos on documentation.
- - fix a problem when deleting all pages.
-
-6.0.012 (2013-04-24)
- - An error condition in addHtmlLink() method was fixed (bug #799).
-
-6.0.011 (2013-04-22)
- - Minor documentation changes.
-
-6.0.010 (2013-04-03)
- - The method Rect() was fixed to print borders correctly.
-
-6.0.009 (2013-04-02)
- - Adding back some files that were not properly committed on the latest release.
-
-6.0.008 (2013-04-01)
- - Duplicated encoding maps was removed from tcpdf_font_data.php.
- - Fixing bug on AddTTFFont().
-
-6.0.007 (2013-03-29)
- - HTML/CSS font size conversion were improved.
-
-6.0.006 (2013-03-27)
- - Bug related to SVG and EPS files on xobjects were fixed.
-
-6.0.005 (2013-03-26)
- - Default font path was fixed.
-
-6.0.004 (2013-03-21)
- - Return value of addTTFfont() method was fixed.
-
-6.0.003 (2013-03-20)
- - A bug related to non-unicode mode was fixed.
-
-6.0.002 (2013-03-18)
- - _getFIXED call on tcpdf_fonts.php was fixed.
-
-6.0.001 (2013-03-18)
- - Fixed $uni_type call on tcpdf.php.
-
-6.0.000 (2013-03-17)
- - IMPORTANT: PHP4 support has been removed starting from this version.
- - Several TCPDF methods and vars were moved to new class files: tcpdf_static.php, tcpdf_colors.php, tcpdf_images.php, tcpdf_font_data.php, tcpdf_fonts.php.
- - Files htmlcolors.php, spotcolors.php, unicode_data.php and ecodings_maps.php were removed.
- - Barcode classes were renamed and new barcode examples were added.
- - Class TCPDF_PARSER was improved.
-
-********************************************************************************
-
-5.9.209 (2013-03-15)
- - Image method was improved.
-
-5.9.208 (2013-03-15)
- - objclone fuction was patched to support old imagick extensions.
- - tcpdf_parser was improved to support Cross-Reference Streams and large streams.
-
-5.9.207 (2013-03-04)
- - Datamatrix class was fixed (a debug echo was removed).
-
-5.9.206 (2013-02-22)
- - Bug item #754 "PNG with alpha channel becomes gray scale" was fixed.
- - Minor documentation fixes.
-
-5.9.205 (2013-02-06)
- - The constant K_TCPDF_THROW_EXCEPTION_ERROR was added on configuration file to change the behavior of Error() method.
- - PDF417 barcode bug was fixed.
-
-5.9.204 (2013-01-23)
- - The method Bookmark() was extended to include named destinations, URLs, internal links or embedded files (see example n. 15).
- - automatic path calculation on configuration file was fixed.
- - Error() method was extended to throw new Exception if PHP > 5.
-
-5.9.203 (2013-01-22)
- - Horizontal position of radiobuttons and checkboxes was adjusted.
-
-5.9.202 (2012-12-16)
- - Vertical space problem after table was fixed.
-
-5.9.201 (2012-12-10)
- - First 256 chars are now always included on font subset to overcome a problem reported on the forum.
-
-5.9.200 (2012-12-05)
- - Bug item #768 "Rowspan with Pagebreak error" was fixed.
- - Page regions now works also with limited MultiCell() cells.
-
-5.9.199 (2012-11-29)
- - Internal setImageBuffer() method was improved.
-
-5.9.198 (2012-11-19)
- - Datamatrix EDIFACT mode was fixed.
-
-5.9.197 (2012-11-06)
- - Bug item #756 "TCPDF 5.9.196 shows line on top of all PDFs" was fixed.
-
-5.9.196 (2012-11-02)
- - Several methods were improved to avoid output when the context is out of page.
- - Bug item #755 "remove cached files before unsetting" was fixed.
-
-5.9.195 (2012-10-24)
- - Method _putfonts() was improved.
-
-5.9.194 (2012-10-23)
- - Text alignment on TextField() method was fixed.
-
-5.9.193 (2012-09-25)
- - Support for named destinations on HTML links was added (i.e.: <a href="#destinationname">link to named destination</a>).
-
-5.9.192 (2012-09-24)
- - A problem on the releasing process was fixed.
-
-5.9.191 (2012-09-24)
- - SVG image naow support svg and eps images.
-
-5.9.190 (2012-09-23)
- - "page" word translation is now set to empty if not defined.
- - Tooltip feature was added on the radiobutton annotation.
-
-5.9.189 (2012-09-18)
- - Bug item #3568969 "ini_get safe_mode error" was fixed.
-
-5.9.188 (2012-09-15)
- - A datamatrix barcode bug was fixed.
-
-5.9.187 (2012-09-14)
- - Subset feature was extended to include the first 256 characters.
-
-5.9.186 (2012-09-13)
- - barcodes.php file was resynced.
- - Methods SetAbsX, SetAbsY, SetAbsXY where added to set the absolute pointer coordinates.
- - Method getCharBBox were added to get single character bounding box.
- - Signature of addTTFfont method was changed ($addcbbox paramter was added).
-
-5.9.185 (2012-09-12)
- - Method _putfontwidths() was fixed.
-
-5.9.184 (2012-09-11)
- - A problem with EAN barcodes was fixed.
-
-5.9.183 (2012-09-07)
- - A problem with font names normalization was fixed.
-
-5.9.182 (2012-09-05)
- - Bug item #3564982 "Infinite loop in Write() method" was fixed.
-
-5.9.181 (2012-08-31)
- - composer.json file was added.
- - Bug item #3563369 "Cached images are not unlinked some time" was fixed.
-
-5.9.180 (2012-08-22)
- - Bug item #3560493 "Problems with nested cells in HTML" was fixed.
-
-5.9.179 (2012-08-04)
- - SVG 'use' tag was fixed for 'circle' and 'ellipse' shift problem.
- - Alpha status is now correctly stored and restored by getGraphicVars() and SetGraphicVars() methods.
-
-5.9.178 (2012-08-02)
- - SVG 'use' tag was fixed for 'circle' and 'ellipse'.
-
-5.9.177 (2012-08-02)
- - An additional control on annotations was fixed.
-
-5.9.176 (2012-07-25)
- - A bug related to stroke width was fixed.
- - A problem related to font spacing in HTML was fixed.
-
-5.9.175 (2012-07-25)
- - The problem of missing letter on hyphen break was fixed.
-
-5.9.174 (2012-07-25)
- - The problem of wrong filename when downloading PDF from an Android device was fixed.
- - The method setHeaderData() was extended to set text and line color for header (see example n. 1).
- - The method setFooterData() was added to set text and line color for footer (see example n. 1).
- - The methods setTextShadow() and getTextShadow() were added to set text shadows (see example n. 1).
- - The GetCharWidth() method was fixed for negative character spacing.
- - A 'none' border mode is now correctly recognized.
- - Break on hyphen problem was fixed.
-
-5.9.173 (2012-07-23)
- - Some additional control wher added on barcode methods.
- - The option CURLOPT_FOLLOWLOCATION on Image method is now disabled if PHP safe_mode is on or open_basedir is set.
- - Method Bookmark() was extended to include X parameter.
- - Method setDestination() was extended to include X parameter.
- - A problem with Thai language was fixed.
-
-5.9.172 (2012-07-02)
- - A PNG color profile issue was fixed.
-
-5.9.171 (2012-07-01)
- - Some SVG rendering problems were fixed.
-
-5.9.170 (2012-06-27)
- - Bug #3538227 "Numerous errors inserting shared images" was fixed.
-
-5.9.169 (2012-06-25)
- - Some SVG rendering problems were fixed.
-
-5.9.168 (2012-06-22)
- - Thai language rendering was fixed.
-
-5.9.167 (2012-06-22)
- - Thai language rendering was fixed and improved.
- - Method isCharDefined() was improved.
- - Protected method replaceChar() was added.
- - Font "kerning" word was corrected to "tracking".
-
-5.9.166 (2012-06-21)
- - Array to string conversion on file_id creation was fixed.
- - Thai language rendering was fixed (thanks to Atsawin Chaowanakritsanakul).
-
-5.9.165 (2012-06-07)
- - Some HTML form related bugs were fixed.
-
-5.9.164 (2012-06-06)
- - A bug introduced on the latest release was fixed.
-
-5.9.163 (2012-06-05)
- - Method getGDgamma() was changed.
- - Rendering performances of PNG images with alpha channel were improved.
-
-5.9.162 (2012-05-11)
- - A bug related to long text on TD cells was fixed.
-
-5.9.161 (2012-05-09)
- - A bug on XREF table was fixed (Bug ID: 3525051).
- - Deprecated Imagick:clone was replaced.
- - Method objclone() was fixed for PHP4.
-
-5.9.160 (2012-05-03)
- - A bug on tcpdf_parser.php was fixed.
-
-5.9.159 (2012-04-30)
- - Barcode classes were updated to fix PNG export Bug (ID: 3522291).
-
-5.9.158 (2012-04-22)
- - Some SVG-related bugs were fixed.
-
-5.9.157 (2012-04-16)
- - Some SVG-related bugs were fixed.
-
-5.9.156 (2012-04-10)
- - Bug item #3515885 "TOC and booklet: left and right page exchanged".
- - SetAutoPageBreak(false) now works also in multicolumn mode.
-
-5.9.155 (2012-04-02)
- - Bug item #3512596 "font import problems" was fixed.
- - Method addTTFfont() was modified to extract only specified Platform ID and Encoding ID (check the source code documentation).
- - All fonts were updated.
- - Bug item #3513867 "booklet and setHeaderTemplateAutoreset: header shifted left" was fixed.
- - Bug item #3513749 "TCPDF Superscript/Subscript" was fixed.
-
-5.9.154 (2012-03-29)
- - A debug echo was removed.
-
-5.9.153 (2012-03-28)
- - A bug on font conversion was fixed.
- - All fonts were updated.
- - Method isCharDefined() was added to find if a character is defined on the selected font.
- - Method replaceMissingChars() was added to automatically replace missing chars on selected font.
- - SetFont() method was fixed.
-
-5.9.152 (2012-03-23)
- - The following overprint methods were added: setOverprint(), getOverprint().
- - Signature of setAlpha() method was changed and method getAlpha() was added.
- - stroke-opacity support was added on SVG.
- - The following date methods were added: setDocCreationTimestamp(), setDocModificationTimestamp(), getDocCreationTimestamp(), getDocModificationTimestamp(), getFormattedDate(), getTimestamp().
- - Signature of _datestring() method was changed.
- - Method getFontBBox() was added.
- - Method setPageBoxTypes() was aded.
-
-5.9.151 (2012-03-22)
- - Bug item #3509889 "Transform() distorts PDF" was fixed.
- - Precision of real number were extended.
- - ComboBox and ListBox methods were fixed.
- - Bulgarian language file was added.
- - addTOC() method was improved to include bookmark color and font style.
-
-5.9.150 (2012-03-16)
- - A bug related to form fields in PDF/A mode was fixed.
-
-5.9.149 (2012-02-21)
- - Bug item #3489933 "SVG Parser treats tspan like text" was fixed.
-
-5.9.148 (2012-02-17)
- - Bug item #3488600 "Multiple radiobutton sets get first set value" was fixed.
-
-5.9.147 (2012-02-14)
- - A problem with SVG gradients has been fixed.
-
-5.9.146 (2012-02-12)
- - Bug item #3486880 "$filehash undefine error" was fixed.
- - The default font is now the one specified at PDF_FONT_NAME_MAIN constant.
-
-5.9.145 (2012-01-28)
- - Japanese language file was added.
- - TCPDF license and README.TXT files were updated.
-
-5.9.144 (2012-01-12)
- - HTML output on barcode classes was improved.
-
-5.9.143 (2012-01-08)
- - Bug item #3471057 "setCreator() has no effect" was fixed.
-
-5.9.142 (2011-12-23)
- - Source code documentation was updated.
-
-5.9.141 (2011-12-14)
- - Some minor bugs were fixed.
-
-5.9.140 (2011-12-13)
- - SVG now supports embedded images encoded as base64.
-
-5.9.139 (2011-12-11)
- - Spot color methods were fixed.
-
-5.9.138 (2011-12-10)
- - cropMark() method was improved (check source code documentation).
- - Example n. 56 was updated.
- - Bug item #3452390 "Check Box still not ticked when set to true" was fixed.
-
-5.9.137 (2011-12-01)
- - Bug item #3447005 "Background color and border of Form Elements is printed" was fixed.
- - Color support for Form elements was improved.
-
-5.9.136 (2011-11-27)
- - Bug item #3443387 "SetMargins with keep option does not work for top margin" was fixed.
-
-5.9.135 (2011-11-04)
- - Bug item #3433406 "Double keywords in description" was fixed.
-
-5.9.134 (2011-10-29)
- - The default value for $defcol parameter on convertHTMLColorToDec() method was fixed.
- - Deafult HTTP headers were changed to avoid browser caching.
- - Some deprecated syntax were replaced.
-
-5.9.133 (2011-10-26)
- - Bug item #3428446 "copyPage method not working when diskcache enabled" was fixed.
-
-5.9.132 (2011-10-20)
- - Bug item #3426167 "bug in function convertHTMLColorToDec()" was fixed.
-
-5.9.131 (2011-10-13)
- - An error message was added to ImagePngAlpha() method.
-
-5.9.130 (2011-10-12)
- - Now you can set image data strings on HTML img tag by encoding the image binary data in this way: $imgsrc = '@'.base64_encode($imgdata);
-
-5.9.129 (2011-10-07)
- - Core fonts metrics was fixed (replace all helvetica and times php files on fonts folder).
- - Form fields support was improved and some problems were fixed (check the example n. 14).
- - Bug item #3420249 "Issue with booklet and MultiCell" was fixed.
-
-5.9.128 (2011-10-06)
- - Method addTTFfont() was improved (check the source code documentation).
- - Method setExtraXMP() to set custom XMP data was added.
-
-5.9.127 (2011-10-04)
- - Readonly mode option was activated for radiobuttons.
-
-5.9.126 (2011-10-03)
- - Bug item #3417989 "Graphics State operator in form XObject fails to render" was fixed.
- - Xobjects problems with transparency, gradients and spot colors were fixed.
-
-5.9.125 (2011-10-03)
- - Support for 8-digit CMYK hexadecimal color representation was added (to be used with XHTML and SVG).
- - Spot colors support was improved (check example n. 37).
- - Color methods were improved.
-
-5.9.124 (2011-10-02)
- - Core fonts were updated.
-
-5.9.123 (2011-10-02)
- - The method addTTFfont() wad added to automatically convert TTF fonts (check the new fonts guide at http://www.tcpdf.org).
- - Old font utils were removed.
- - All fonts were updated and new arabic fonts were added (almohanad were removed and replaced by aefurat and aealarabiya).
- - The file unicode_data.php was updated.
- - The file encodings_maps.php was added.
- - PDF/A files are now compressed to save space.
- - XHTML input form fields now support text-alignment attribute.
-
-5.9.122 (2011-09-29)
- - PDF/A-1b compliance was improved to pass some online testing.
-
-5.9.121 (2011-09-28)
- - This version includes support for PDF/A-1b format (the class constructor signature was changed - see example n. 65).
- - Method setSRGBmode() was added to force sRGB_IEC61966-2.1 black scaled ICC color profile for the whole document (file sRGB.icc was added).
- - 14 new fonts were added to allow embedding core fonts (for PDF/A compliance).
- - Font utils were fixed.
-
-5.9.120 (2011-09-22)
- - This version includes a fix for _getTrueTypeFontSubset() method.
-
-5.9.119 (2011-09-19)
- - This version includes a fix for extra page numbering on TOC.
-
-5.9.118 (2011-09-17)
- - This version includes some changes that allows you to add a bookmark for a page that do not exist.
-
-5.9.117 (2011-09-15)
- - TCPDFBarcode and TCPDF2DBarcode classes were extended to include a method for exporting barcodes as PNG images.
-
-5.9.116 (2011-09-14)
- - Datamatrix class was improved and documentation was fixed.
-
-5.9.115 (2011-09-13)
- - Datamatrix ECC200 barcode support was added (a new datamatrix.php file was added) - check example n. 50.
- - getBarcodeHTML() method was added on TCPDFBarcode and TCPDF2DBarcode classes to return an HTML representation of the barcode.
- - cURL options on Image() method were improved.
- - A bug on write2DBarcode() was fixed.
-
-5.9.114 (2011-09-04)
- - A bug related to column position was fixed.
-
-5.9.113 (2011-08-24)
- - This release include two new experimental files for parsing an existing PDF document (the integration with TCPDF is under development).
-
-5.9.112 (2011-08-18)
- - A newline character was added after the 'trailer' keyword for compatibility with some parsers.
- - Support for layers was improved.
-
-5.9.111 (2011-08-17)
- - Barcode CODE 39 default gap was restored at 1.
-
-5.9.110 (2011-08-17)
- - Barcode CODE 39 was fixed.
-
-5.9.109 (2011-08-12)
- - Method getNumLines() was fixed.
- - A bug related to page break in multi-column mode was fixed.
-
-5.9.108 (2011-08-09)
- - A bug on PHP4 version was fixed.
-
-5.9.107 (2011-08-08)
- - This version includes a minor bugfix.
-
-5.9.106 (2011-08-04)
- - This version includes transparency groups: check the new parameter on startTemplate() method and example 62.
-
-5.9.105 (2011-08-04)
- - Bug item #3386153 "Check Box not ticked when set to true" was fixed.
-
-5.9.104 (2011-08-01)
- - Bug item #3383698 "imagemagick, resize and dpi" was fixed.
-
-5.9.103 (2011-07-16)
- - Alignment of XHTML lines was improved.
- - Spell of the "length" word was fixed.
-
-5.9.102 (2011-07-13)
- - Methods startLayer() and endLayer() were added to support arbitrary PDF layers.
- - Some improvements/fixes for images were added (thanks to Brendan Abbott).
-
-5.9.101 (2011-07-07)
- - Support for JPEG and PNG ICC Color Profiles was added.
- - Method addEmptySignatureAppearance() was added to add empty signature fields (see example n. 52).
- - Bug item #3354332 "Strange line spacing with reduced font-size in writeHTML" was fixed.
-
-5.9.100 (2011-06-29)
- - An SVG bug has been fixed.
-
-5.9.099 (2011-06-27)
- - Bug item #3335045 "Font freesans seems somehow corrupted in footer" was fixed.
-
-5.9.098 (2011-06-23)
- - The Named Destination feature was fixed.
-
-5.9.097 (2011-06-23)
- - The method setHtmlVSpace() now can be used also for tags: div, li, br, dt and dd.
- - The Named Destination feature was added (check the example n. 15) - thanks to Christian Deligant.
-
-5.9.096 (2011-06-19)
- - Bug item #3322234 "Surrogate pairs codes in arrUTF8ToUTF16BE" was fixed.
-
-5.9.095 (2011-06-18)
- - Numbers alignment for Table-Of-Content methods was improved and fixed.
- - Font subsetting was fixed to include all parts of composite fonts.
-
-5.9.094 (2011-06-17)
- - Bug item #3317898 "Page Group numbering broken in 5.9.093" was fixed.
-
-5.9.093 (2011-06-16)
- - Method setStartingPageNumber() was added to set starting page number (for automatic page numbering).
-
-5.9.092 (2011-06-15)
- - Method _putpages() was improved.
- - Bug item #3316678 "Memory overflow when use Rotate and SetAutoPageBreak" was fixed.
- - Right alignment of page numbers was improved.
-
-5.9.090 (2011-06-14)
- - Methods AliasNbPages() and AliasNumPage() were re-added as deprecated for backward compatibility.
-
-5.9.089 (2011-06-13)
- - Example n. 8 was updated.
- - Method sendOutputData() was changed to remove default compression (it was incompatible with some server settings).
- - Bugs related to page group numbers were fixed.
- - Method copyPage() was fixed.
- - Method Image() was improved to include support for alternative and external images.
-
-5.9.088 (2011-06-01)
- - Method getAutoPageBreak() was added (see example n. 51).
- - Example n. 51 (full page background) was updated.
-
-5.9.087 (2011-06-01)
- - Method sendOutputData() was improved to include deflate encoding.
- - Barcode classes on PHP 4 version were fixed.
-
-5.9.086 (2011-05-31)
- - Font files were updated (the ones on the previous release were broken).
- - The script fonts/utils/makeallttffonts.php was updated and fixed.
- - Output() method was improved to use compression when available.
-
-5.9.085 (2011-05-31)
- - TCPDFBarcode class (barcodes.php) now includes getBarcodeSVG() and getBarcodeSVGcode() methods to get SVG image representation of the barcode.
- - TCPDF2DBarcode class (2dbarcodes.php) now includes getBarcodeSVG() and getBarcodeSVGcode() methods to get SVG image representation of the barcode.
-
-5.9.084 (2011-05-29)
- - Font files were updated.
- - The file fonts/utils/makeallttffonts.php was updated.
- - Bug item# 3308774 "Problems with font subsetting" was fixed.
-
-5.9.083 (2011-05-24)
- - Bug item #3308387 "line height & SetCellHeightRatio" was fixed.
-
-5.9.082 (2011-05-22)
- - Bug item #3305592 "Setting fill color <> text color breaks text clipping" was fixed.
-
-5.9.081 (2011-05-18)
- - Method resetHeaderTemplate() was added to reset the xobject template used by Header() method.
- - Method setHeaderTemplateAutoreset() was added to automatically reset the xobject template used by Header() method at each page.
-
-5.9.080 (2011-05-17)
- - A problem related to file path calculation for images was fixed.
- - A problem related to unsupressed getimagesize() error was fixed.
-
-5.9.079 (2011-05-16)
- - Footer() method was changed to use C128 barcode as default (instead of the previous C128B).
-
-5.9.078 (2011-05-12)
- - Bug item #3300878 "wrong rendering for html bullet list in some case" was fixed.
- - Bug item #3301017 "Emphasized vs. font-weight" was fixed.
- - Barcode Code 128 was improved to include AUTO mode (automatically switch between A, B and C modes).
- - Examples n. 27 and 49 were updated.
-
-5.9.077 (2011-05-07)
- - Bug item #3298591 "error code93" was fixed.
- - SetLineStyle() function was improved.
-
-5.9.076 (2011-05-06)
- - Bug item #3298264 "codebar 93 error" was fixed.
-
-5.9.075 (2011-05-02)
- - Table header alignment when using WriteHTMLCell() or MultiCell() was fixed.
-
-5.9.074 (2011-04-28)
- - Bug item #3294306 "CSS classes not work in <thead> table section" was fixed.
-
-5.9.073 (2011-04-27)
- - A bug related to character entities on HTML cells was fixed.
-
-5.9.072 (2011-04-26)
- - Method resetColumns() was added to remove multiple columns and reset page margins (example n. 10 was updated).
-
-5.9.071 (2011-04-19)
- - Bug #3288574 "<br/> trouble" was fixed.
-
-5.9.069 (2011-04-19)
- - Bug #3288763 "HTML-Table: non-breaking table rows: Bug" was fixed.
-
-5.9.068 (2011-04-15)
- - Bookmark, addTOC and addHTMLTOC methods were improved to include font style and color (Examples 15, 49 and 59 were updated).
- - Default $_SERVER['DOCUMENT_ROOT'] value on tcpdf_config.php file was changed.
-
-5.9.067 (2011-04-10)
- - Performances were drastically improved (PDF documents are now created more quickly).
-
-5.9.066 (2011-04-09)
- - A bug related to digital signature + encryption was fixed.
- - A bug related to encryption + xobject templates was fixed.
-
-5.9.065 (2011-04-08)
- - Bug item #3280512 "Text encoding iso-8859-2 crashes" was fixed.
-
-5.9.064 (2011-04-05)
- - A bug related to character entities on HTML cells was fixed.
-
-5.9.063 (2011-04-01)
- - Bug item #3267235 "WriteHTML() and image that doesn't fit on the page" was fixed.
-
-5.9.062 (2011-03-23)
- - Bug item #3232650 "Using Write if there are pageRegions active creates error" was fixed.
- - Bug item #3221891 "text input borders" was fixed.
- - Bug item #3228958 "Adobe Reader 9.4.2 crash" was fixed.
-
-5.9.061 (2011-03-15)
- - Bug item #3213488 "wrong function call in function Write" was fixed.
- - Bug item #3203007 "list element with black background" was fixed.
-
-5.9.060 (2011-03-08)
- - addTOC() method was fixed for text alignment problems.
-
-5.9.059 (2011-02-27)
- - Default Header() method was improved to reduce document size.
-
-5.9.058 (2011-02-25)
- - Image() method was improved to cache images with transparency layers (thanks to Korneliusz Jarzębski for reporting this problem).
-
-5.9.057 (2011-02-24)
- - A problem with image caching system was fixed (thanks to Korneliusz Jarzębski for reporting this problem).
-
-5.9.056 (2011-02-22)
- - A bug on fixHTMLCode() method was fixed.
- - Automatic line break for HTML was fixed.
-
-5.9.055 (2011-02-17)
- - Another bug related to HTML table page break was fixed.
-
-5.9.054 (2011-02-16)
- - A bug related to HTML table page break was fixed.
-
-5.9.053 (2011-02-16)
- - Support for HTML attribute display="none" was added.
-
-5.9.052 (2011-02-15)
- - A bug related to HTML automatic newlines was fixed.
-
-5.9.051 (2011-02-12)
- - "Commas at beginning of new lines" problem was fixed.
-
-5.9.050 (2011-02-11)
- - Bug #3177606 "SVG Bar chart error" was fixed.
-
-5.9.049 (2011-02-03)
- - Bug #3170777 "TCPDF creates a new page after a single line in writeHTML" was fixed.
-
-5.9.048 (2011-02-02)
- - No changes. Just released to override previous release that was not uploaded correctly.
-
-5.9.047 (2011-01-28)
- - Bug #3167115 "PDF error in <table> (example 48)" was fixed (was introduced in 5.8.046).
-
-5.9.046 (2011-01-18)
- - PDF view/print layers are now automatically turned off if not used (see setVisibility() method).
-
-5.9.045 (2011-01-17)
- - HTML list support were improved.
-
-5.9.044 (2011-01-15)
- - Bug #3158422 "writeHTMLCell Loop" was fixed.
- - Some HTML image alignment problems were fixed.
-
-5.9.043 (2011-01-14)
- - Bug #3158178 "PHP Notice" was fixed.
- - Bug #3158193 "Endless loop in writeHTML" was fixed.
- - Bug #3157764 "SVG Pie chart incorrectly rendered2".
-
-5.9.042 (2011-01-14)
- - Some problems of the PHP4 version were fixed.
-
-5.9.041 (2011-01-13)
- - A problem with SVG elliptical arc path was fixed (ref. bug #3156574).
- - A problem related to font weight on HTML table headers was fixed.
-
-5.9.040 (2011-01-12)
- - A bug related to empty pages after table was fixed.
-
-5.9.039 (2011-01-12)
- - Bug item #3155759 "openssl_random_pseudo_bytes() slow under Windows" was fixed.
-
-5.9.038 (2011-01-11)
- - Minor bugs were fixed.
-
-5.9.037 (2011-01-09)
- - An alignment problem for HTML texts was fixed.
-
-5.9.036 (2011-01-07)
- - A bug related to HTML tables on header was fixed.
-
-5.9.035 (2011-01-03)
- - A problem related to HTML table border alignment was fixed.
- - Bug #2996366 "FastCGI and Header Problems" was fixed.
-
-5.9.034 (2010-12-19)
- - DejaVu and GNU Free fonts were updated.
-
-5.9.033 (2010-12-18)
- - Source code documetnation was improved.
-
-5.9.032 (2010-12-18)
- - Default font stretching and spacing values are now inherited by HTML methods.
-
-5.9.031 (2010-12-16)
- - Source code documentation errors were fixed.
-
-5.9.030 (2010-12-16)
- - Several source code documentation errors were fixed.
- - Source code style was changed for Doxygen.
- - Source code documentation was moved online to http://www.tcpdf.org
-
-5.9.029 (2010-12-04)
- - The $fitbox parameter on Image() method was extended to specify image alignment inside the box (check the example n. 9).
-
-5.9.028 (2010-12-03)
- - Font utils makefont.php and makeallttffonts.php were updated.
-
-5.9.027 (2010-12-01)
- - Spot Colors are now better integrated with HTML mode.
- - Method SetDocInfoUnicode() was added to turn on/off Unicode mode for document information dictionary (meta tags) - check the example n. 19.
-
-5.9.026 (2010-12-01)
- - A problem with mixed text directions on HTML was fixed.
-
-5.9.025 (2010-12-01)
- - The AddSpotColor() now automatically fills the spotcolor array (defined on spotcolors.php file).
-
-5.9.024 (2010-11-30)
- - Bug item #3123612 "SVG not use gradientTransform in percentage mode" was fixed.
-
-5.9.023 (2010-11-25)
- - A potential bug on SVG transcoder was fixed.
-
-5.9.022 (2010-11-21)
- - Method ImageEPS includes support for EPS/AI Spot colors.
- - Method ImageEPS includes a new parameter $fixoutvals to remove values outside the bounding box.
-
-5.9.021 (2010-11-20)
- - Support for custom bullet points images was added (check the example n.6)
- - Examples n. 6 and 61 were update (check the comments inside).
-
-5.9.020 (2010-11-19)
- - A problem related to additional page when using multicolumn mode was fixed.
-
-5.9.019 (2010-11-19)
- - An SVG bug was fixed.
- - ImageSVG() and ImageEPS() methods now accepts image data streams (put the string on the $file parameter preceded by '@' character).
- - Option 'E' was added to the $dest parameter of Output() method to return the document as base64 mime multi-part email attachment (RFC 2045).
-
-5.9.018 (2010-11-19)
- - An SVG bug was fixed.
-
-5.9.017 (2010-11-16)
- - Tagline color was set to transparent.
- - The method fixHTMLCode() was added to automatically clean up HTML code (requires HTML Tidy).
-
-5.9.016 (2010-11-16)
- - Bug item #3109705 "list item page break hanging bullet" was fixed.
-
-5.9.015 (2010-11-16)
- - Bug item affecting QRCode was fixed.
- - Some bugs affecting HTML lists were fixed.
- - ImageSVG() and fitBlock() methods were improved to handle some SVG problems.
- - Some problems with PHP4 compatibility were fixed.
-
-5.9.014 (2010-11-15)
- - Bug item #3109464 "QRCode error" was fixed.
-
-5.9.013 (2010-11-15)
- - Bug item #3109257 "Problem with interlaced GIFs and PNGs" was fixed.
- - Image function now accepts image data streams (check example n. 9).
-
-5.9.012 (2010-11-12)
- - Method getTCPDFVersion() was added.
- - PDF_PRODUCER constant was removed.
- - Method convertHTMLColorToDec() was improved.
- - HTML colors now support spot color names defined on the new spotcolors.php file.
- - The default method Header() was improved to support SVG and EPS/AI images.
- - A bug on SVG importer was fixed.
-
-5.9.011 (2010-11-02)
- - Bug item #3101486 "Bug Fix for image loading" was fixed.
-
-5.9.010 (2010-10-27)
- - Support for CSS properties 'border-spacing' and 'padding' for tables were added.
- - Several language files were added.
-
-5.9.009 (2010-10-21)
- - HTML text alignment was improved to include the case of RTL text on LTR direction and LTR text on RTL direction.
-
-5.9.008 (2010-10-21)
- - Bug item #3091502 "Bookmark oddity" was fixed.
- - HTML internal links now accepts page number and Y position.
- - The method write1DBarcode() was improved to accept separate horizontal and vertical padding (see example n. 27).
-
-5.9.007 (2010-10-20)
- - Method adjustCellPadding() was fixed to handle bad input.
-
-5.9.006 (2010-10-19)
- - Support for AES 256 bit encryption was added (see example n. 16).
- - Method getNumLines() was fixed for the empty string case.
-
-5.9.005 (2010-10-18)
- - Method addPageRegion() was changed to accept regions starting exactly from the top of the page.
-
-5.9.004 (2010-10-18)
- - A bug related to annotations was fixed.
- - The file unicode_data.php was canged to encapsulate all data in a class.
- - The file htmlcolors.php was changed to remove the global variable.
-
-5.9.003 (2010-10-15)
- - Support for no-write page regions was added. Check the example n. 64 and new methods setPageRegions(), addPageRegion(), getPageRegions(), removePageRegion().
- - A bug on Right-To-Left alignment was fixed.
-
-5.9.002 (2010-10-08)
- - Cell method was improved to preserve the font stretching and spacing values when using the $stretch parameter (see example n. 4).
-
-5.9.001 (2010-10-07)
- - The problem of blank page for nobr table higher than a single page was fixed.
-
-5.9.000 (2010-10-06)
- - Support for text stretching and spacing (tracking) was added, see example n. 63 and methods setFontStretching(), getFontStretching(), setFontSpacing(), getFontSpacing().
- - Support for CSS properties 'font-stretch' and 'letter-spacing' was added (see example n. 63).
- - The cMargin state was replaced by cell_padding array that can be set/get using setCellPadding() and getCellPadding() methods.
- - Methods getCellPaddings() and setCellPaddings() were added to fine tune cell paddings (see example n. 5).
- - Methods getCellMargins() and setCellMargins() were added to fine tune cell margins (see example n. 5).
- - Method write1DBarcode() was improved to permit custom labels (see example n. 27).
- - Method ImagePngAlpha() now includes support for ImageMagick to improve performances.
- - XObject Template support was extended to support Multicell(), writeHTML() and writeHTMLCell() methods.
- - The signature of getNumLines() and getStringHeight() methods is changed.
- - Example n. 57 was updated.
-
-// -------------------------------------------------------------------
-
-5.8.034 (2010-09-27)
- - A bug related to SetFont on XObject templates was fixed.
-
-5.8.033 (2010-09-25)
- - A problem with Footer() and multiple columns was fixed.
-
-5.8.032 (2010-09-22)
- - Bug #3073165 "Issues with changes to addHTMLVertSpace()" was fixed.
-
-5.8.031 (2010-09-20)
- - Bug #3071961 "Spaces in HTML" was fixed.
-
-5.8.030 (2010-09-17)
- - SVG support was improved and some bugs were fixed.
-
-5.8.029 (2010-09-16)
- - A problem with HTML borders was fixed.
-
-5.8.028 (2010-09-13)
- - Bug #3065224 "mcrypt_create_iv error on TCPDF 5.8.027 on PHP 5.3.2" was fixed.
-
-5.8.027 (2010-09-13)
- - Bug #3065118 "mcrypt_decrypt error on TCPDF 5.8.026 on PHP 5.3.2" was fixed.
-
-5.8.026 (2010-09-13)
- - A bug on addHTMLTOC() method was fixed. Note: be sure that the #TOC_PAGE_NUMBER# template has enough width to be printed correctly.
-
-5.8.025 (2010-09-09)
- - Bug #3062692 "Textarea inside a table" was fixed.
-
-5.8.024 (2010-09-08)
- - Bug #3062005 "Undefined variable: ann_obj_id" was fixed.
-
-5.8.023 (2010-08-31)
- - Forms bug added on version 5.8.019 was fixed.
-
-5.8.022 (2010-08-31)
- - Bug #3056632 "SVG rendered vertically flipped" was fixed.
-
-5.8.021 (2010-08-30)
- - A new CID-0 'chinese' font was added for traditional Chinese.
- - Bug #3054287 'Inner tags are ignored due to "align" attribute' was fixed.
-
-5.8.020 (2010-08-26)
- - CSS "catch-all" class selector is now supported.
-
-5.8.019 (2010-08-26)
- - XObject Templates now includes support for links and annotations.
- - A problem related to link alignment on cell was fixed.
- - A problem related to SVG styles was fixed.
-
-5.8.018 (2010-08-25)
- - Method getNumberOfColumns() was added.
- - A problem related to table header was fixed.
- - Method getSVGTransformMatrix() was fixed to apply SVG transformations in the correct order.
- - SVG support was improved and several bugs were fixed.
-
-5.8.017 (2010-08-25)
- - This version includes support for XObject Templates (see the new example n. 62).
- - Methods starttemplate(), endTemplate() and printTemplate() were added (see the new example n. 62).
-
-5.8.016 (2010-08-24)
- - Alignment problem on write2DBarcode was fixed.
-
-5.8.015 (2010-08-24)
- - A problem arised with the latest bugfix was fixed.
-
-5.8.014 (2010-08-23)
- - Method _getxobjectdict() was added for better compatibility with external extensions.
- - A bug related to radiobuttons was fixed.
- - Bug #3051509 "new line after punctuation marks" was fixed (partially).
-
-5.8.013 (2010-08-23)
- - SVG support for 'direction' property was added.
- - A problem on default width calculation for linear barcodes was fixed.
- - New option was added to write1DBarcode() method to improve alignments (see example n. 27).
- - Bug #3050896 "Nested HTML tables: styles are not applied" was fixed.
- - Method _putresourcedict() was improved to include external XObject templates.
-
-5.8.012 (2010-08-22)
- - Support for SVG 'text-anchor' property was added.
-
-5.8.011 (2010-08-21)
- - Method write1DBarcode() was improved to be backward compatible (check the new example n. 27).
- - Support for CSS width and height properties on images were added.
-
-5.8.010 (2010-08-20)
- - Documentation of unhtmlentities() was fixed.
- - The 'fitwidth' option was added and border color problem was fixed on write1DBarcode() method (check the example n. 27).
-
-5.8.009 (2010-08-20)
- - Internal object numbering was improved.
- - Some errors in object encryption were fixed.
-
-5.8.008 (2010-08-19)
- - Method write1DBarcode() was changed, check the example n. 27.
- - Method Footer() was changed to account for barcode changes.
- - Automatic calculation of K_PATH_URL constant was fixed on configuration file.
- - Method setEqualColumns() was fixed for $width=0 case.
- - Method AddTOC() was fixed for multipage and multicolumn modes.
- - Better support for SVG "font-family" property.
- - A problem on default Page Zoom mode was fixed.
- - Several Annotation bugs were fixed.
-
-5.8.007 (2010-08-18)
- - A bug affecting HTML tables was fixed.
- - Bug #3047500 "SVG not rendering paths properly" was fixed.
-
-5.8.006 (2010-08-17)
- - A bug affecting HTML table nesting was fixed.
-
-5.8.005 (2010-08-17)
- - A bug affecting the HTML 'select' tag in certain conditions was fixed.
-
-5.8.004 (2010-08-17)
- - Better support for HTML "font-family" property.
- - A bug related to HTML multicolumn was fixed.
-
-5.8.003 (2010-08-16)
- - Better support for HTML "font-family" property.
-
-5.8.002 (2010-08-14)
- - HTML alignments were improved
- - IMPORTANT: Default regular expression to find spaces has been changed to exclude the non-breaking-space (160 DEC- A0 HEX). If you are using setSpacesRE() method, please read the new documentation.
- - Example n. 1 was updated.
-
-5.8.001 (2010-08-12)
- - Bug #3043650 "subsetchars incorrectly cached" was fixed.
-
-5.8.000 (2010-08-11)
- - A control to avoid bookmarking page 0 was added.
- - addTOC() method now includes support for multicolumn mode.
- - Support for tables in multicolumn mode was improved.
- - Example n.10 was updated.
- - All trimming functions were replaced with stringLeftTrim(), stringRightTrim() and stringTrim().
- - HTML alignments were improved.
-
-------------------------------------------------------------
-
-5.7.003 (2010-08-08)
- - Bug #3041263 "php source ending is bad" was fixed (all PHP files were updated, including fonts).
-
-5.7.002 (2010-08-06)
- - Methods copyPage(), movePage() and deletePage() were changed to account for internal markings.
-
-5.7.001 (2010-08-05)
- - Bug #3040105 "Broken PDF when using TOC (example 45)" was fixed.
-
-5.7.000 (2010-08-03)
- - CSS borders are now supported for HTML tables and other block tags (see example n. 61);
- - Cell borders were improved (see example n. 57);
- - Minor bugs were fixed.
-
-------------------------------------------------------------
-
-5.6.000 (2010-07-31)
- - A bug with object IDs was fixes.
- - Performances were improved.
-
-------------------------------------------------------------
-
-5.5.015 (2010-07-29)
- - Automatic fix for unclosed self-closing tag.
- - Support for deprecated 's' and 'strike' tags was added.
- - Empty list items problem was fixed.
-
-5.5.014 (2010-07-15)
- - Support for external images was improved.
-
-5.5.013 (2010-07-14)
- - Bug #3029338 "FI and FO output destination filename bug" was fixed (previous fix was wrong).
-
-5.5.012 (2010-07-14)
- - Bug #3029310 "Font baseline inconsistencies with line-height and font-size" was fixed.
- - Bug #3029338 "FI and FO output destination filename bug" was fixed.
-
-5.5.011 (2010-07-09)
- - Support for multiple CSS classes was added.
- - The method getColumn() was added to return the current column number.
- - Some regular Expressions were fixed to be more compatible with UTF-8.
-
-5.5.010 (2010-07-06)
- - Bug item #3025772 "Borders in all image functions are still flawed" was fixed.
-
-5.5.009 (2010-07-05)
- - A problem related to last page footer was fixed.
- - Image alignments and fit-on-page features were improved.
-
-5.5.008 (2010-07-02)
- - A problem on table header alignment in booklet mode was fixed.
- - Default graphic vars are now applied for setHeader();
-
-5.5.007 (2010-07-02)
- - Attribute "readonly" was added to input and textarea form fields.
- - Vertical alignment feature was added on MultiCell() method only for simple text mode (see example n. 5).
- - Text-Fit feature was added on MultiCell() method only for simple text mode (see example n. 5).
-
-5.5.006 (2010-06-29)
- - getStringHeight() and getNumLines() methods were fixed.
-
-5.5.005 (2010-06-28)
- - Bug #3022170 "getFontDescent() does not return correct descent value" was fixed.
- - Some problems with multicolumn mode were fixed.
-
-5.5.004 (2010-06-27)
- - Bug #3021803 "SVG Border" was fixed.
-
-5.5.003 (2010-06-26)
- - On Write() method, blank lines at the beginning of a page or column are now automatically removed.
-
-5.5.002 (2010-06-24)
- - ToUnicode Identity-H name was replaced with a full CMap (to avoid preflight syntax error).
- - Bug #3020638 "str_split() not available in php4" was fixed.
- - Bug #3020665 "file_get_contents() too many parameters for php4" was fixed.
-
-5.5.001 (2010-06-23)
- - A problem on image streams was fixed.
-
-5.5.000 (2010-06-22)
- - Several PDF syntax errors (and related bugs) were fixed.
- - Bug #3019090 "/Length values are wrong if AES encryption is used" was fixed.
-
-------------------------------------------------------------
-
-5.4.003 (2010-06-19)
- - A problem related to page boxes was fixed.
- - Bug #3016920 "Font subsetting issues when editing pdf" was partially fixed (Note that flattening transparency layers is currently incompatible with TrueTypeUnicode fonts).
-
-5.4.002 (2010-06-18)
- - A problem related with setProtection() method was fixed.
-
-5.4.001 (2010-06-18)
- - A problem related with setProtection() method was fixed.
-
-5.4.000 (2010-06-18)
- - The method setSignatureAppearance() was added, check the example n. 52.
- - Several problems related to font subsetting were fixed.
-
-------------------------------------------------------------
-
-5.3.010 (2010-06-15)
- - Previous release was corrupted.
-
-5.3.009 (2010-06-15)
- - Bug #3015934 "Bullets don't display correctly" was fixed.
-
-5.3.008 (2010-06-13)
- - This version fixes some problems of SVG rasterization.
-
-5.3.007 (2010-06-13)
- - This version improves SVG support.
-
-5.3.006 (2010-06-10)
- - This version includes a change in uniqid calls for backward compatibility with PHP4.
-
-5.3.005 (2010-06-09)
- - The method getPageSizeFromFormat() was changed to include all standard page formats (includes 281 page formats + variation).
-
-5.3.004 (2010-06-08)
- - Bug #3013291 "HTML table cell width" was fixed.
- - Bug #3013294 "HTML table cell alignment" was fixed.
- - The columns widths of HTML tables are now inherited from the first row.
-
-5.3.003 (2010-06-08)
- - Bug #3013102 "HTML table header misaligned after page break" was fixed.
-
-5.3.002 (2010-06-07)
- - The methods setFontSubsetting() and setFontSubsetting() were added to control the default font subsetting mode (see example n. 1).
- - Bug #3012596 "Whitespace should not appeared after use Thai top characters" was fixed.
- - Examples n. 1, 14, and 54 were updated.
-
-5.3.001 (2010-06-06)
- - Barcode PDF417 was improved to support Macro Code Blocks (see example n. 50).
-
-5.3.000 (2010-06-05)
- - License was changed to GNU-LGPLv3 (see the updated LICENSE.TXT file).
- - PDF417 barcode support was added (check the example n. 50).
- - The method write2DBarcode() was improved (some parameters were added and other changed - check example n. 50).
-
-------------------------------------------------------------
-
-5.2.000 (2010-06-02)
- - IMPORTANT: Support for font subsetting was added by default to reduce the size of documents using large unicode font files.
- If you embed the whole font in the PDF, the person on the other end can make changes to it even if he didn't have your font.
- If you subset the font, file size of the PDF will be smaller but the person who receives your PDF would need to have your same font in order to make changes to your PDF.
- - The signature of the SetFont() and AddFont() methods were changed to include the font subsetting option (subsetting is applied by default).
- - Examples 14 and 54 were updated.
-
-------------------------------------------------------------
-
-5.1.002 (2010-05-27)
- - Bug #3007818 "SetAutoPageBreak fails with MultiCell" was fixed.
- - A bug related to MultiCell() minimun height was fixed.
-
-5.1.001 (2010-05-26)
- - The problem of blank page after table was fixed.
-
-5.1.000 (2010-05-25)
- - This version includes support for CSS (Cascading Style Sheets) (see example n. 61).
- - The convertHTMLColorToDec() method was improved.
-
-------------------------------------------------------------
-
-5.0.014 (2010-05-21)
- - A problem on color and style of HTML links was fixed.
- - A bug relative to gradients was fixed.
- - The getStringHeight() method was added and getNumLines() method was improved.
- - All examples were updated.
-
-5.0.013 (2010-05-19)
- - A bug related to page-breaks and table cells was fixed.
-
-5.0.012 (2010-05-19)
- - Page orientation bug was fixed.
- - The access to method setPageFormat() was changed to 'protected' because it is not intended to be directly called.
-
-5.0.011 (2010-05-19)
- - Page orientation bug was fixed.
- - Bug #3003966 "Multiple columns and nested lists" was fixed.
-
-5.0.010 (2010-05-17)
- - The methods setPageFormat(), setPageOrientation() and related methods were extended to include page boxes, page rotations and page transitions.
- - The method setPageBoxes() was added to set page boundaries (MediaBox, CropBox, BleedBox, TrimBox, ArtBox);
- - A bug relative to underline, overline and linethrough was fixed.
-
-5.0.009 (2010-05-16)
- - Bug #3002381 "Multiple columns and nested lists" was fixed.
-
-5.0.008 (2010-05-15)
- - Bug "Columns WriteHTML and Justification" was fixed.
-
-5.0.007 (2010-05-14)
- - Bug #3001347 "Bug when using WriteHTML with setEqualColumns()" was fixed.
- - Bug #3001505 "problem with sup and sub tags at the beginning of a line" was fixed.
-
-5.0.006 (2010-05-13)
- - Length of hr tag was fixed.
- - An error on 2d barcode method was fixed.
-
-5.0.005 (2010-05-12)
- - WARNING: The logic of permissions on the SetProtection() method has been inverted and extended (see example 16). Now you have to specify the features you want to block.
- - SetProtection() method was extended to support RSA and AES 128 encryption and public-keys (see example 16).
- - Bug #2999489 "setEqualColumns() and TOC uses wrong columns" was fixed (see the example 10).
-
-5.0.004 (2010-05-10)
- - HTML line alignment when using sub and sup tags was fixed.
-
-5.0.003 (2010-05-07)
- - Horizontal alignment was fixed for images and barcodes. Now the X coordinate is always relative to the left margin. Use GetAbsX() instead of GetX() to get the X relative to left margin.
- - Header() method was changed to account for new image alignment rules.
-
-5.0.002 (2010-05-06)
- - Bookmark() and related methods were fixed to accept HTML code.
- - A problem on HTML links was fixed.
-
-5.0.001 (2010-05-06)
- - Protected method _putstream was re-added for backward compatibility.
- - The following method were added to display HTML Table Of Content (see example n. 59):
- addTOCPage(), endTOCPage(), addHTMLTOC().
-
-5.0.000 (2010-05-05)
- - Method ImageSVG() was added to embedd SVG images (see example n. 58). Note that not all SVG images are supported.
- - Method setRasterizeVectorImages() was added to enable/disable rasterization for vector images via ImageMagick library.
- - Method RoundedRectXY() was added.
- - Method PieSectorXY() was added.
- - Gradient() method is now public and support new features.
- - Shading to transparency is now supported.
- - Image alignments were fixed.
- - Support for dynamic images were improved.
- - PDF_IMAGE_SCALE_RATIO has been changed to 1.25 for better compatibility with SVG.
- - RAW and RAW2 modes were added to 2D Barcodes (see example n. 50).
- - Automatic padding feature was added on barcodes (see examples n. 27 and 50).
- - Bug #2995003 "Reproduced thead bug" was fixed.
- - The Output() method now accepts FI and FD destinations to save the document on server before sending it to the client.
- - Ellipse() method was improved and fixed (see page 2 of example n. 12).
-
-------------------------------------------------------------
-
-4.9.018 (2010-04-21)
- - Bug item #2990356 "Current font size not respected with more than two HTML <p>" was fixed.
-
-4.9.017 (2010-04-21)
- - Bug item #2990224 "Different behaviour for equivalent HTML strings" was fixed.
- - Bug item #2990314 "Dash is not appearing with SHY character" was fixed.
-
-4.9.016 (2010-04-20)
- - An error on htmlcolors.php was fixed.
- - getImageFileType() method was improved.
- - GIF images with transparency are now better supported.
- - Automatic page orientation was improved.
-
-4.9.015 (2010-04-20)
- - A new method copyPage() was added to clone pages (see example n. 44).
- - Support for text overline was added.
- - Underline and linethrough methods were fixed.
- - Bug #2989058 "SHY character causes unnecessary word-wrapping" was fixed.
-
-4.9.014 (2010-04-18)
- - Bug item #2988845 was fixed.
-
-4.9.013 (2010-04-15)
- - Image() and ImageEPS() methods were fixed and improved; $fitonpage parameter was added.
-
-4.9.012 (2010-04-12)
- - The hyphenateText() method was added to automatically hyphenate text (see example n. 46).
-
-4.9.011 (2010-04-07)
- - Vertical alignments for Cell() method were improved (see example n. 57).
-
-4.9.010 (2010-04-06)
- - Signature of Cell() method now includes new parameters for vertical alignment (see example n. 57).
- - Text() method was extended to include all Cell() parameters.
- - HTML line alignment procedure was changed to fix some bugs.
-
-4.9.009 (2010-04-05)
- - Text() method was fixed for backward compatibility.
-
-4.9.008 (2010-04-03)
- - Additional line space after table header was removed.
- - Support for HTML lists in multicolumn mode was added.
- - The method setTextRenderingMode() was added to set text rendering modes (see the example n. 26).
- - The following HTML attributes were added to set text rendering modes (see the example n. 26): stroke, strokecolor, fill.
-
-4.9.007 (2010-04-03)
- - Font Descent computation was fixed (patch #2981441).
-
-4.9.006 (2010-04-02)
- - The constant K_TCPDF_CALLS_IN_HTML was added on configuration file to enable/disable the ability to call TCPDF methods in HTML.
- - The usage of tcpdf tag in HTML mode was changed to remove the possible security flaw offered by the eval() function (thanks to Matthias Hecker for spotting this security problem). See the new example n. 49 for further information.
-
-4.9.005 (2010-04-01)
- - Bug# 2980354 "Wrong File attachment description with security" was fixed.
- - Several problems with HTML line alignment were fixed.
- - The constant K_THAI_TOPCHAR was added on configuration file to enable/disable the special procedure used to avoid the overlappind of symbols on Thai language.
- - A problem with font name directory was fixed.
- - A bug on _destroy() method was fixed.
-
-4.9.004 (2010-03-31)
- - Patch #979681 "GetCharWidth - default character width" was applied (bugfix).
-
-4.9.003 (2010-03-30)
- - Problem of first <br /> on multiple columns was fixed.
- - HTML line alignment was fixed.
- - A QR-code bug was fixed.
-
-4.9.002 (2010-03-29)
- - Patch #2978349 "$ignore_min_height is ignored in function Cell()" was applied.
- - Bug #2978607 "2D Barcodes are wrong" was fixed.
- - A problem with HTML block tags was fixed.
- - Artificial italic for CID-0 fonts was added.
- - Several multicolumn bugs were fixed.
- - Support for HTML tables on multicolumn was added.
-
-4.9.001 (2010-03-28)
- - QR Code minor bug was fixed.
- - Multicolumn mode was added (see the new example n. 10).
- - The following methods were added: setEqualColumns(), setColumnsArray(), selectColumn().
- - Thai diacritics support were changed (note that this is incompatible with html justification).
-
-4.9.000 (2010-03-27)
- - QR Code (2D barcode) support was added (see example n. 50).
- - The following methods were added to print crop and registration marks (see example n. 56): colorRegistrationBar(), cropMark(), registrationMark().
- - Limited support for CSS line-height property was added.
- - Gradient method now supports Gray, RGB and CMYK space color.
- - Example n. 51 was updated.
- - Vertical alignment of font inside cell was fixed.
- - Support for multiple Thai diacritics was added.
- - Bug item #2974929 "Duplicate case values" was fixed.
- - Bug item #2976729 "File attachment not working with security" was fixed.
-
-------------------------------------------------------------
-
-4.8.039 (2010-03-20)
- - Problems related to custom locale settings were fixed.
- - Problems related to HTML on Header and Footer were fixed.
-
-4.8.038 (2010-03-13)
- - Various bugs related to page-break in HTML mode were fixed.
- - Bug item #2968974 "Another <thead> pagebreak problem" was fixed.
- - Bug item #2969276 "justification problem" was fixed.
- - Bug item #2969289 "bug when using justified text and custom headers" was fixed.
- - Images are now automatically resized to be contained on the page.
- - Some HTML line alignments were fixed.
- - Signature of AddPage() and SetMargins() methods were changed to include an option to set default page margins.
-
-4.8.037 (2010-03-03)
- - Bug item #2962068 was fixed.
- - Bug item #2967017 "Problems with <thead> and pagebreaks" was fixed.
- - Bug item #2967023 "table header lost with pagebreak" was fixed.
- - Bug item #2967032 "Header lost with nested tables" was fixed.
-
-4.8.036 (2010-02-24)
- - Automatic page break for HTML images was improved.
- - Example 10 was updated.
- - Japanese was removed from example 8 because the freeserif font doesn't contain japanese (you can display it using arialunicid0 font).
-
-4.8.035 (2010-02-23)
- - Automatic page break for HTML images was added.
- - Support for multicolumn HTML was added (example 10 was updated).
-
-4.8.034 (2010-02-17)
- - Language files were updated.
-
-4.8.033 (2010-02-12)
- - A bug related to protection mode with links was fixed.
-
-4.8.032 (2010-02-04)
- - A bug related to $maxh parameter on Write() and MultiCell() was fixed.
- - Support for body tag was added.
-
-4.8.031 (2010-01-30)
- - Bug item #2941589 "paragraph justify not working on some non-C locales" was fixed.
-
-4.8.030 (2010-01-27)
- - Some text alignment cases were fixed.
-
-4.8.029 (2010-01-27)
- - Bug item #2941057 "TOC Error in PDF File Output" was fixed.
- - Some text alignment cases were fixed.
-
-4.8.028 (2010-01-26)
- - Text alignment for RTL mode was fixed.
-
-4.8.027 (2010-01-25)
- - Bug item #2938412 "Table related problems - thead, nobr, table width" was fixed.
-
-4.8.026 (2010-01-19)
- - The misspelled word "lenght" was replaced with "length" in some variables and comments.
-
-4.8.025 (2010-01-18)
- - addExtGState() method was improved to reuse existing ExtGState objects.
-
-4.8.024 (2010-01-15)
- - Justification mode for HTML was fixed (Bug item #2932470).
-
-4.8.023 (2010-01-15)
- - Bug item #2932470 "Some HTML entities breaks justification" was fixed.
-
-4.8.022 (2010-01-14)
- - Source code documentation was fixed.
-
-4.8.021 (2010-01-03)
- - A Bug relative to Table Of Content index was fixed.
-
-4.8.020 (2009-12-21)
- - Bug item #2918545 "Display problem of the first row of a table with larger font" was fixed.
- - A Bug relative to table rowspan mode was fixed.
-
-4.8.019 (2009-12-16)
- - Bug item #2915684 "Image size" was fixed.
- - Bug item #2914995 "Image jpeg quality" was fixed.
- - The signature of the Image() method was changed (check the documentation for the $resize parameter).
-
-4.8.018 (2009-12-15)
- - Bug item #2914352 "write error" was fixed.
-
-4.8.017 (2009-11-27)
- - THEAD problem when table is used on header/footer was fixed.
- - A first line alignment on HTML justification was fixed.
- - Method getImageFileType() was added.
- - Images with unknown extension and type are now supported via ImageMagick PHP extension.
-
-4.8.016 (2009-11-21)
- - Document Information Dictionary was fixed.
- - CSS attributes 'page-break-before', 'page-break-after' and 'page-break-inside' are now supported.
- - Problem of unclosed last page was fixed.
- - Problem of 'thead' unnecessarily repeated on the next page was fixed.
-
-4.8.015 (2009-11-20)
- - A problem with some PNG transparency images was fixed.
- - Bug #2900762 "Sort issues in Bookmarks" was fixed.
- - Text justification was fixed for various modes: underline, strikeout and background.
-
-4.8.014 (2009-11-04)
- - Bug item #2891316 "writeHTML, underlining replacing spaces" was fixed.
- - The handling of temporary RTL text direction mode was fixed.
-
-4.8.013 (2009-10-26)
- - Bug item #2884729 "Problem with word-wrap and hyphen" was fixed.
-
-4.8.012 (2009-10-23)
- - Table cell alignments for RTL booklet mode were fixed.
- - Images and barcode alignments for booklet mode were fixed.
-
-4.8.011 (2009-10-22)
- - DejaVu fonts were updated to latest version.
-
-4.8.010 (2009-10-21)
- - Bookmark for TOC page was added.
- - Signature of addTOC() method is changed.
- - Bookmarks are now automatically sorted by page and Y position.
- - Example n. 45 was updated.
- - Example n. 55 was added to display all charactes available on core fonts.
-
-4.8.009 (2009-09-30)
- - Compatibility with PHP 5.3 was improved.
- - All examples were updated.
- - Index file for examples was added.
-
-4.8.008 (2009-09-29)
- - Example 49 was updated.
- - Underline and linethrough now works with cell stretching mode.
-
-4.8.007 (2009-09-23)
- - Infinite loop problem caused by nobr attribute was fixed.
-
-4.8.006 (2009-09-23)
- - Bug item #2864522 "No images if DOCUMENT_ROOT=='/'" was fixed.
- - Support for text-indent CSS attribute was added.
- - Method rollbackTransaction() was changed to support self-reassigment of previous object (check source code documentation).
- - Support for the HTML "nobr" attribute was added to avoid splitting a table or a table row on two pages (i.e.: <tr nobr="true">...</tr>).
-
-4.8.005 (2009-09-17)
- - A bug relative to multiple transformations and annotations was fixed.
-
-4.8.004 (2009-09-16)
- - A bug on _putannotsrefs() method was fixed.
-
-4.8.003 (2009-09-15)
- - Bug item #2858754 "Division by zero" was fixed.
- - A bug relative to HTML list items was fixed.
- - A bug relative to form fields on multiple pages was fixed.
- - PolyLine() method was added (see example n. 12).
- - Signature of Polygon() method was changed.
-
-4.8.002 (2009-09-12)
- - A problem related to CID-0 fonts offset was fixed: if the $cw[1] entry on the CID-0 font file is not defined, then a CID keys offset is introduced.
-
-4.8.001 (2009-09-09)
- - The appearance streams (AP) for anotations form fields was fixed (see examples n. 14 and 54).
- - Radiobuttons were fixed.
-
-4.8.000 (2009-09-07)
- - This version includes some support for Forms fields (see example n. 14) and XHTML forms (see example n. 54).
- - The following methods were changed to work without JavaScript: TextField(), RadioButton(), ListBox(), ComboBox(), CheckBox(), Button().
- - Support for Widget annotations was improved.
- - Alignment of annotation objects was fixed (examples 36 and 41 were updated).
- - addJavascriptObject() method was added.
- - Signature of Image() method was changed.
- - htmlcolors.php file was updated.
-
-------------------------------------------------------------
-
-4.7.003 (2009-09-03)
- - Support for TCPDF methods on HTML was improved (see example n. 49).
-
-4.7.002 (2009-09-02)
- - Bug item #2848892 "writeHTML + table: Gaps between rows" was fixed.
- - JavaScript support was fixed (see example n. 53).
-
-4.7.001 (2009-08-30)
- - The Polygon() and Arrow() methods were fixed and improved (see example n. 12).
-
-4.7.000 (2009-08-29)
- - This is a major release.
- - Some procedures were internally optimized.
- - The problem of mixed signature and annotations was fixed (example n. 52).
-
-4.6.030 (2009-08-29)
- - IMPORTANT: percentages on table cell widths are now relative to the full table width (as in standard HTML).
- - Various minor bugs were fixed.
- - Example n. 52 (digital signature) was updated.
-
-4.6.029 (2009-08-26)
- - PHP4 version was fixed.
-
-4.6.028 (2009-08-25)
- - Signature algorithm was finally fixed (see example n. 52).
-
-4.6.027 (2009-08-24)
- - TCPDF now supports unembedded TrueTypeUnicode Fonts (just comment the $file entry on the fonts' php file.
-
-4.6.026 (2009-08-21)
- - Bug #2841693 "Problem with MultiCell and ishtml and justification" was fixed.
- - Signature functions were improved but not yet fixed (tcpdf.crt and example n. 52 were updated).
-
-4.6.025 (2009-08-17)
- - Carriage returns (\r) were removed from source code.
- - Problem related to set_magic_quotes_runtime() depracated was fixed.
-
-4.6.024 (2009-08-07)
- - Bug item #2833556 "justification using other units than mm" was fixed.
- - Documentation was fixed/updated.
-
-4.6.023 (2009-08-02)
- - Bug item #2830537 "MirrorH can show mask for transparent PNGs" was fixed.
-
-4.6.022 (2009-07-24)
- - A bug relative to single line printing when using WriteHTMLCell() was fixed.
- - Signature support were improved but is still experimental.
- - Fonts Free and Dejavu were updated to latest versions.
-
-4.6.021 (2009-07-20)
- - Bug item #2824015 "XHTML Ampersand &amp; in hyperlink bug" was fixed.
- - Bug item #2824036 "Image as hyperlink in table, text displaced at page break" was fixed.
- - Links alignment on justified text was fixed.
- - Unicode "\u" modifier was added to re_spaces variable by default.
-
-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 <pre> 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.
- - <tcpdf> 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 <br /> 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 "<a name="...">...</a>" 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 <p align="center"> 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 &nbsp; 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.
-
-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.
-
-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 (<pre> and <tt> 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.
-
-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.
-
-4.2.006 (2008-11-06)
- - A bug relative to HTML justification was fixed.
-
-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.
-
-4.2.004 (2008-11-04)
- - Bug item n. 2217039 "filename handling improvement" was fixed.
-
-4.2.003 (2008-10-31)
- - Font style bug was fixed.
-
-4.2.002 (2008-10-31)
- - Bug item #2210922 (htm element br not work) was fixed.
- - Write() function was improved to support margin changes.
-
-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.
-
-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.: <a href="#23">link to page 23</a>).
- - Justification alignment is now supported on HTML (see example n. 39).
- - example_006.php was updated.
-
-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.
-
-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 <u> & <b>" 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 <hr> 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 <li>.
- - 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 <img> 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 </ul>, </ol> and </p> 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 <strong> and <em> 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 <strong> 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.
-
-EOF --------------------------------------------------------
diff --git a/libs/tcpdf/include/barcodes/datamatrix.php b/libs/tcpdf/include/barcodes/datamatrix.php
deleted file mode 100644
index 775e5cb15e..0000000000
--- a/libs/tcpdf/include/barcodes/datamatrix.php
+++ /dev/null
@@ -1,1149 +0,0 @@
-<?php
-//============================================================+
-// File name : datamatrix.php
-// Version : 1.0.004
-// Begin : 2010-06-07
-// Last Update : 2013-02-04
-// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
-// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
-// -------------------------------------------------------------------
-// Copyright (C) 2010-2012 Nicola Asuni - Tecnick.com LTD
-//
-// This file is part of TCPDF software library.
-//
-// TCPDF 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 3 of the
-// License, or (at your option) any later version.
-//
-// TCPDF 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 TCPDF. If not, see <http://www.gnu.org/licenses/>.
-//
-// See LICENSE.TXT file for more information.
-// -------------------------------------------------------------------
-//
-// DESCRIPTION :
-//
-// Class to create DataMatrix ECC 200 barcode arrays for TCPDF class.
-// DataMatrix (ISO/IEC 16022:2006) is a 2-dimensional bar code.
-//============================================================+
-
-/**
-* @file
-* Class to create DataMatrix ECC 200 barcode arrays for TCPDF class.
-* DataMatrix (ISO/IEC 16022:2006) is a 2-dimensional bar code.
-*
-* @package com.tecnick.tcpdf
-* @author Nicola Asuni
-* @version 1.0.004
-*/
-
-// custom definitions
-if (!defined('DATAMATRIXDEFS')) {
-
- /**
- * Indicate that definitions for this class are set
- */
- define('DATAMATRIXDEFS', true);
-
- // -----------------------------------------------------
-
-} // end of custom definitions
-
-// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
-
-
-/**
-* ASCII encoding: ASCII character 0 to 127 (1 byte per CW)
-*/
-define('ENC_ASCII', 0);
-
-/**
-* C40 encoding: Upper-case alphanumeric (3/2 bytes per CW)
-*/
-define('ENC_C40', 1);
-
-/**
-* TEXT encoding: Lower-case alphanumeric (3/2 bytes per CW)
-*/
-define('ENC_TXT', 2);
-
-/**
-* X12 encoding: ANSI X12 (3/2 byte per CW)
-*/
-define('ENC_X12', 3);
-
-/**
-* EDIFACT encoding: ASCII character 32 to 94 (4/3 bytes per CW)
-*/
-define('ENC_EDF', 4);
-
-/**
-* BASE 256 encoding: ASCII character 0 to 255 (1 byte per CW)
-*/
-define('ENC_BASE256', 5);
-
-/**
-* ASCII extended encoding: ASCII character 128 to 255 (1/2 byte per CW)
-*/
-define('ENC_ASCII_EXT', 6);
-
-/**
-* ASCII number encoding: ASCII digits (2 bytes per CW)
-*/
-define('ENC_ASCII_NUM', 7);
-
-/**
-* @class Datamatrix
-* Class to create DataMatrix ECC 200 barcode arrays for TCPDF class.
-* DataMatrix (ISO/IEC 16022:2006) is a 2-dimensional bar code.
-*
-* @package com.tecnick.tcpdf
-* @author Nicola Asuni
-* @version 1.0.004
-*/
-class Datamatrix {
-
- /**
- * Barcode array to be returned which is readable by TCPDF.
- * @protected
- */
- protected $barcode_array = array();
-
- /**
- * Store last used encoding for data codewords.
- * @protected
- */
- protected $last_enc = ENC_ASCII;
-
- /**
- * Table of Data Matrix ECC 200 Symbol Attributes:<ul>
- * <li>total matrix rows (including finder pattern)</li>
- * <li>total matrix cols (including finder pattern)</li>
- * <li>total matrix rows (without finder pattern)</li>
- * <li>total matrix cols (without finder pattern)</li>
- * <li>region data rows (with finder pattern)</li>
- * <li>region data col (with finder pattern)</li>
- * <li>region data rows (without finder pattern)</li>
- * <li>region data col (without finder pattern)</li>
- * <li>horizontal regions</li>
- * <li>vertical regions</li>
- * <li>regions</li>
- * <li>data codewords</li>
- * <li>error codewords</li>
- * <li>blocks</li>
- * <li>data codewords per block</li>
- * <li>error codewords per block</li>
- * </ul>
- * @protected
- */
- protected $symbattr = array(
- // square form ---------------------------------------------------------------------------------------
- array(0x00a,0x00a,0x008,0x008,0x00a,0x00a,0x008,0x008,0x001,0x001,0x001,0x003,0x005,0x001,0x003,0x005), // 10x10
- array(0x00c,0x00c,0x00a,0x00a,0x00c,0x00c,0x00a,0x00a,0x001,0x001,0x001,0x005,0x007,0x001,0x005,0x007), // 12x12
- array(0x00e,0x00e,0x00c,0x00c,0x00e,0x00e,0x00c,0x00c,0x001,0x001,0x001,0x008,0x00a,0x001,0x008,0x00a), // 14x14
- array(0x010,0x010,0x00e,0x00e,0x010,0x010,0x00e,0x00e,0x001,0x001,0x001,0x00c,0x00c,0x001,0x00c,0x00c), // 16x16
- array(0x012,0x012,0x010,0x010,0x012,0x012,0x010,0x010,0x001,0x001,0x001,0x012,0x00e,0x001,0x012,0x00e), // 18x18
- array(0x014,0x014,0x012,0x012,0x014,0x014,0x012,0x012,0x001,0x001,0x001,0x016,0x012,0x001,0x016,0x012), // 20x20
- array(0x016,0x016,0x014,0x014,0x016,0x016,0x014,0x014,0x001,0x001,0x001,0x01e,0x014,0x001,0x01e,0x014), // 22x22
- array(0x018,0x018,0x016,0x016,0x018,0x018,0x016,0x016,0x001,0x001,0x001,0x024,0x018,0x001,0x024,0x018), // 24x24
- array(0x01a,0x01a,0x018,0x018,0x01a,0x01a,0x018,0x018,0x001,0x001,0x001,0x02c,0x01c,0x001,0x02c,0x01c), // 26x26
- array(0x020,0x020,0x01c,0x01c,0x010,0x010,0x00e,0x00e,0x002,0x002,0x004,0x03e,0x024,0x001,0x03e,0x024), // 32x32
- array(0x024,0x024,0x020,0x020,0x012,0x012,0x010,0x010,0x002,0x002,0x004,0x056,0x02a,0x001,0x056,0x02a), // 36x36
- array(0x028,0x028,0x024,0x024,0x014,0x014,0x012,0x012,0x002,0x002,0x004,0x072,0x030,0x001,0x072,0x030), // 40x40
- array(0x02c,0x02c,0x028,0x028,0x016,0x016,0x014,0x014,0x002,0x002,0x004,0x090,0x038,0x001,0x090,0x038), // 44x44
- array(0x030,0x030,0x02c,0x02c,0x018,0x018,0x016,0x016,0x002,0x002,0x004,0x0ae,0x044,0x001,0x0ae,0x044), // 48x48
- array(0x034,0x034,0x030,0x030,0x01a,0x01a,0x018,0x018,0x002,0x002,0x004,0x0cc,0x054,0x002,0x066,0x02a), // 52x52
- array(0x040,0x040,0x038,0x038,0x010,0x010,0x00e,0x00e,0x004,0x004,0x010,0x118,0x070,0x002,0x08c,0x038), // 64x64
- array(0x048,0x048,0x040,0x040,0x012,0x012,0x010,0x010,0x004,0x004,0x010,0x170,0x090,0x004,0x05c,0x024), // 72x72
- array(0x050,0x050,0x048,0x048,0x014,0x014,0x012,0x012,0x004,0x004,0x010,0x1c8,0x0c0,0x004,0x072,0x030), // 80x80
- array(0x058,0x058,0x050,0x050,0x016,0x016,0x014,0x014,0x004,0x004,0x010,0x240,0x0e0,0x004,0x090,0x038), // 88x88
- array(0x060,0x060,0x058,0x058,0x018,0x018,0x016,0x016,0x004,0x004,0x010,0x2b8,0x110,0x004,0x0ae,0x044), // 96x96
- array(0x068,0x068,0x060,0x060,0x01a,0x01a,0x018,0x018,0x004,0x004,0x010,0x330,0x150,0x006,0x088,0x038), // 104x104
- array(0x078,0x078,0x06c,0x06c,0x014,0x014,0x012,0x012,0x006,0x006,0x024,0x41a,0x198,0x006,0x0af,0x044), // 120x120
- array(0x084,0x084,0x078,0x078,0x016,0x016,0x014,0x014,0x006,0x006,0x024,0x518,0x1f0,0x008,0x0a3,0x03e), // 132x132
- array(0x090,0x090,0x084,0x084,0x018,0x018,0x016,0x016,0x006,0x006,0x024,0x616,0x26c,0x00a,0x09c,0x03e), // 144x144
- // rectangular form (currently unused) ---------------------------------------------------------------------------
- array(0x008,0x012,0x006,0x010,0x008,0x012,0x006,0x010,0x001,0x001,0x001,0x005,0x007,0x001,0x005,0x007), // 8x18
- array(0x008,0x020,0x006,0x01c,0x008,0x010,0x006,0x00e,0x001,0x002,0x002,0x00a,0x00b,0x001,0x00a,0x00b), // 8x32
- array(0x00c,0x01a,0x00a,0x018,0x00c,0x01a,0x00a,0x018,0x001,0x001,0x001,0x010,0x00e,0x001,0x010,0x00e), // 12x26
- array(0x00c,0x024,0x00a,0x020,0x00c,0x012,0x00a,0x010,0x001,0x002,0x002,0x00c,0x012,0x001,0x00c,0x012), // 12x36
- array(0x010,0x024,0x00e,0x020,0x010,0x012,0x00e,0x010,0x001,0x002,0x002,0x020,0x018,0x001,0x020,0x018), // 16x36
- array(0x010,0x030,0x00e,0x02c,0x010,0x018,0x00e,0x016,0x001,0x002,0x002,0x031,0x01c,0x001,0x031,0x01c) // 16x48
- );
-
- /**
- * Map encodation modes whit character sets.
- * @protected
- */
- protected $chset_id = array(ENC_C40 => 'C40', ENC_TXT => 'TXT', ENC_X12 =>'X12');
-
- /**
- * Basic set of characters for each encodation mode.
- * @protected
- */
- protected $chset = array(
- 'C40' => array( // Basic set for C40 ----------------------------------------------------------------------------
- 'S1'=>0x00,'S2'=>0x01,'S3'=>0x02,0x20=>0x03,0x30=>0x04,0x31=>0x05,0x32=>0x06,0x33=>0x07,0x34=>0x08,0x35=>0x09, //
- 0x36=>0x0a,0x37=>0x0b,0x38=>0x0c,0x39=>0x0d,0x41=>0x0e,0x42=>0x0f,0x43=>0x10,0x44=>0x11,0x45=>0x12,0x46=>0x13, //
- 0x47=>0x14,0x48=>0x15,0x49=>0x16,0x4a=>0x17,0x4b=>0x18,0x4c=>0x19,0x4d=>0x1a,0x4e=>0x1b,0x4f=>0x1c,0x50=>0x1d, //
- 0x51=>0x1e,0x52=>0x1f,0x53=>0x20,0x54=>0x21,0x55=>0x22,0x56=>0x23,0x57=>0x24,0x58=>0x25,0x59=>0x26,0x5a=>0x27),//
- 'TXT' => array( // Basic set for TEXT ---------------------------------------------------------------------------
- 'S1'=>0x00,'S2'=>0x01,'S3'=>0x02,0x20=>0x03,0x30=>0x04,0x31=>0x05,0x32=>0x06,0x33=>0x07,0x34=>0x08,0x35=>0x09, //
- 0x36=>0x0a,0x37=>0x0b,0x38=>0x0c,0x39=>0x0d,0x61=>0x0e,0x62=>0x0f,0x63=>0x10,0x64=>0x11,0x65=>0x12,0x66=>0x13, //
- 0x67=>0x14,0x68=>0x15,0x69=>0x16,0x6a=>0x17,0x6b=>0x18,0x6c=>0x19,0x6d=>0x1a,0x6e=>0x1b,0x6f=>0x1c,0x70=>0x1d, //
- 0x71=>0x1e,0x72=>0x1f,0x73=>0x20,0x74=>0x21,0x75=>0x22,0x76=>0x23,0x77=>0x24,0x78=>0x25,0x79=>0x26,0x7a=>0x27),//
- 'SH1' => array( // Shift 1 set ----------------------------------------------------------------------------------
- 0x00=>0x00,0x01=>0x01,0x02=>0x02,0x03=>0x03,0x04=>0x04,0x05=>0x05,0x06=>0x06,0x07=>0x07,0x08=>0x08,0x09=>0x09, //
- 0x0a=>0x0a,0x0b=>0x0b,0x0c=>0x0c,0x0d=>0x0d,0x0e=>0x0e,0x0f=>0x0f,0x10=>0x10,0x11=>0x11,0x12=>0x12,0x13=>0x13, //
- 0x14=>0x14,0x15=>0x15,0x16=>0x16,0x17=>0x17,0x18=>0x18,0x19=>0x19,0x1a=>0x1a,0x1b=>0x1b,0x1c=>0x1c,0x1d=>0x1d, //
- 0x1e=>0x1e,0x1f=>0x1f), //
- 'SH2' => array( // Shift 2 set ----------------------------------------------------------------------------------
- 0x21=>0x00,0x22=>0x01,0x23=>0x02,0x24=>0x03,0x25=>0x04,0x26=>0x05,0x27=>0x06,0x28=>0x07,0x29=>0x08,0x2a=>0x09, //
- 0x2b=>0x0a,0x2c=>0x0b,0x2d=>0x0c,0x2e=>0x0d,0x2f=>0x0e,0x3a=>0x0f,0x3b=>0x10,0x3c=>0x11,0x3d=>0x12,0x3e=>0x13, //
- 0x3f=>0x14,0x40=>0x15,0x5b=>0x16,0x5c=>0x17,0x5d=>0x18,0x5e=>0x19,0x5f=>0x1a,'F1'=>0x1b,'US'=>0x1e), //
- 'S3C' => array( // Shift 3 set for C40 --------------------------------------------------------------------------
- 0x60=>0x00,0x61=>0x01,0x62=>0x02,0x63=>0x03,0x64=>0x04,0x65=>0x05,0x66=>0x06,0x67=>0x07,0x68=>0x08,0x69=>0x09, //
- 0x6a=>0x0a,0x6b=>0x0b,0x6c=>0x0c,0x6d=>0x0d,0x6e=>0x0e,0x6f=>0x0f,0x70=>0x10,0x71=>0x11,0x72=>0x12,0x73=>0x13, //
- 0x74=>0x14,0x75=>0x15,0x76=>0x16,0x77=>0x17,0x78=>0x18,0x79=>0x19,0x7a=>0x1a,0x7b=>0x1b,0x7c=>0x1c,0x7d=>0x1d, //
- 0x7e=>0x1e,0x7f=>0x1f),
- 'S3T' => array( // Shift 3 set for TEXT -------------------------------------------------------------------------
- 0x60=>0x00,0x41=>0x01,0x42=>0x02,0x43=>0x03,0x44=>0x04,0x45=>0x05,0x46=>0x06,0x47=>0x07,0x48=>0x08,0x49=>0x09, //
- 0x4a=>0x0a,0x4b=>0x0b,0x4c=>0x0c,0x4d=>0x0d,0x4e=>0x0e,0x4f=>0x0f,0x50=>0x10,0x51=>0x11,0x52=>0x12,0x53=>0x13, //
- 0x54=>0x14,0x55=>0x15,0x56=>0x16,0x57=>0x17,0x58=>0x18,0x59=>0x19,0x5a=>0x1a,0x7b=>0x1b,0x7c=>0x1c,0x7d=>0x1d, //
- 0x7e=>0x1e,0x7f=>0x1f), //
- 'X12' => array( // Set for X12 ----------------------------------------------------------------------------------
- 0x0d=>0x00,0x2a=>0x01,0x3e=>0x02,0x20=>0x03,0x30=>0x04,0x31=>0x05,0x32=>0x06,0x33=>0x07,0x34=>0x08,0x35=>0x09, //
- 0x36=>0x0a,0x37=>0x0b,0x38=>0x0c,0x39=>0x0d,0x41=>0x0e,0x42=>0x0f,0x43=>0x10,0x44=>0x11,0x45=>0x12,0x46=>0x13, //
- 0x47=>0x14,0x48=>0x15,0x49=>0x16,0x4a=>0x17,0x4b=>0x18,0x4c=>0x19,0x4d=>0x1a,0x4e=>0x1b,0x4f=>0x1c,0x50=>0x1d, //
- 0x51=>0x1e,0x52=>0x1f,0x53=>0x20,0x54=>0x21,0x55=>0x22,0x56=>0x23,0x57=>0x24,0x58=>0x25,0x59=>0x26,0x5a=>0x27) //
- );
-
-// -----------------------------------------------------------------------------
-
- /**
- * This is the class constructor.
- * Creates a datamatrix object
- * @param $code (string) Code to represent using Datamatrix.
- * @public
- */
- public function __construct($code) {
- $barcode_array = array();
- if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
- return false;
- }
- // get data codewords
- $cw = $this->getHighLevelEncoding($code);
- // number of data codewords
- $nd = count($cw);
- // check size
- if ($nd > 1558) {
- return false;
- }
- // get minimum required matrix size.
- foreach ($this->symbattr as $params) {
- if ($params[11] >= $nd) {
- break;
- }
- }
- if ($params[11] < $nd) {
- // too much data
- return false;
- } elseif ($params[11] > $nd) {
- // add padding
- if ($this->last_enc == ENC_EDF) {
- // switch to ASCII encoding
- $cw[] = 124;
- ++$nd;
- } elseif (($this->last_enc != ENC_ASCII) AND ($this->last_enc != ENC_BASE256)) {
- // switch to ASCII encoding
- $cw[] = 254;
- ++$nd;
- }
- if ($params[11] > $nd) {
- // add first pad
- $cw[] = 129;
- ++$nd;
- // add remaining pads
- for ($i = $nd; $i < $params[11]; ++$i) {
- $cw[] = $this->get253StateCodeword(129, $i);
- }
- }
- }
- // add error correction codewords
- $cw = $this->getErrorCorrection($cw, $params[13], $params[14], $params[15]);
- // initialize empty arrays
- $grid = array_fill(0, ($params[2] * $params[3]), 0);
- // get placement map
- $places = $this->getPlacementMap($params[2], $params[3]);
- // fill the grid with data
- $grid = array();
- $i = 0;
- // region data row max index
- $rdri = ($params[4] - 1);
- // region data column max index
- $rdci = ($params[5] - 1);
- // for each vertical region
- for ($vr = 0; $vr < $params[9]; ++$vr) {
- // for each row on region
- for ($r = 0; $r < $params[4]; ++$r) {
- // get row
- $row = (($vr * $params[4]) + $r);
- // for each horizontal region
- for ($hr = 0; $hr < $params[8]; ++$hr) {
- // for each column on region
- for ($c = 0; $c < $params[5]; ++$c) {
- // get column
- $col = (($hr * $params[5]) + $c);
- // braw bits by case
- if ($r == 0) {
- // top finder pattern
- if ($c % 2) {
- $grid[$row][$col] = 0;
- } else {
- $grid[$row][$col] = 1;
- }
- } elseif ($r == $rdri) {
- // bottom finder pattern
- $grid[$row][$col] = 1;
- } elseif ($c == 0) {
- // left finder pattern
- $grid[$row][$col] = 1;
- } elseif ($c == $rdci) {
- // right finder pattern
- if ($r % 2) {
- $grid[$row][$col] = 1;
- } else {
- $grid[$row][$col] = 0;
- }
- } else { // data bit
- if ($places[$i] < 2) {
- $grid[$row][$col] = $places[$i];
- } else {
- // codeword ID
- $cw_id = (floor($places[$i] / 10) - 1);
- // codeword BIT mask
- $cw_bit = pow(2, (8 - ($places[$i] % 10)));
- $grid[$row][$col] = (($cw[$cw_id] & $cw_bit) == 0) ? 0 : 1;
- }
- ++$i;
- }
- }
- }
- }
- }
- $this->barcode_array['num_rows'] = $params[0];
- $this->barcode_array['num_cols'] = $params[1];
- $this->barcode_array['bcode'] = $grid;
- }
-
- /**
- * Returns a barcode array which is readable by TCPDF
- * @return array barcode array readable by TCPDF;
- * @public
- */
- public function getBarcodeArray() {
- return $this->barcode_array;
- }
-
- /**
- * Product of two numbers in a Power-of-Two Galois Field
- * @param $a (int) first number to multiply.
- * @param $b (int) second number to multiply.
- * @param $log (array) Log table.
- * @param $alog (array) Anti-Log table.
- * @param $gf (array) Number of Factors of the Reed-Solomon polynomial.
- * @return int product
- * @protected
- */
- protected function getGFProduct($a, $b, $log, $alog, $gf) {
- if (($a == 0) OR ($b == 0)) {
- return 0;
- }
- return ($alog[($log[$a] + $log[$b]) % ($gf - 1)]);
- }
-
- /**
- * Add error correction codewords to data codewords array (ANNEX E).
- * @param $wd (array) Array of datacodewords.
- * @param $nb (int) Number of blocks.
- * @param $nd (int) Number of data codewords per block.
- * @param $nc (int) Number of correction codewords per block.
- * @param $gf (int) numner of fields on log/antilog table (power of 2).
- * @param $pp (int) The value of its prime modulus polynomial (301 for ECC200).
- * @return array data codewords + error codewords
- * @protected
- */
- protected function getErrorCorrection($wd, $nb, $nd, $nc, $gf=256, $pp=301) {
- // generate the log ($log) and antilog ($alog) tables
- $log[0] = 0;
- $alog[0] = 1;
- for ($i = 1; $i < $gf; ++$i) {
- $alog[$i] = ($alog[($i - 1)] * 2);
- if ($alog[$i] >= $gf) {
- $alog[$i] ^= $pp;
- }
- $log[$alog[$i]] = $i;
- }
- ksort($log);
- // generate the polynomial coefficients (c)
- $c = array_fill(0, ($nc + 1), 0);
- $c[0] = 1;
- for ($i = 1; $i <= $nc; ++$i) {
- $c[$i] = $c[($i-1)];
- for ($j = ($i - 1); $j >= 1; --$j) {
- $c[$j] = $c[($j - 1)] ^ $this->getGFProduct($c[$j], $alog[$i], $log, $alog, $gf);
- }
- $c[0] = $this->getGFProduct($c[0], $alog[$i], $log, $alog, $gf);
- }
- ksort($c);
- // total number of data codewords
- $num_wd = ($nb * $nd);
- // total number of error codewords
- $num_we = ($nb * $nc);
- // for each block
- for ($b = 0; $b < $nb; ++$b) {
- // create interleaved data block
- $block = array();
- for ($n = $b; $n < $num_wd; $n += $nb) {
- $block[] = $wd[$n];
- }
- // initialize error codewords
- $we = array_fill(0, ($nc + 1), 0);
- // calculate error correction codewords for this block
- for ($i = 0; $i < $nd; ++$i) {
- $k = ($we[0] ^ $block[$i]);
- for ($j = 0; $j < $nc; ++$j) {
- $we[$j] = ($we[($j + 1)] ^ $this->getGFProduct($k, $c[($nc - $j - 1)], $log, $alog, $gf));
- }
- }
- // add error codewords at the end of data codewords
- $j = 0;
- for ($i = $b; $i < $num_we; $i += $nb) {
- $wd[($num_wd + $i)] = $we[$j];
- ++$j;
- }
- }
- // reorder codewords
- ksort($wd);
- return $wd;
- }
-
- /**
- * Return the 253-state codeword
- * @param $cwpad (int) Pad codeword.
- * @param $cwpos (int) Number of data codewords from the beginning of encoded data.
- * @return pad codeword
- * @protected
- */
- protected function get253StateCodeword($cwpad, $cwpos) {
- $pad = ($cwpad + (((149 * $cwpos) % 253) + 1));
- if ($pad > 254) {
- $pad -= 254;
- }
- return $pad;
- }
-
- /**
- * Return the 255-state codeword
- * @param $cwpad (int) Pad codeword.
- * @param $cwpos (int) Number of data codewords from the beginning of encoded data.
- * @return pad codeword
- * @protected
- */
- protected function get255StateCodeword($cwpad, $cwpos) {
- $pad = ($cwpad + (((149 * $cwpos) % 255) + 1));
- if ($pad > 255) {
- $pad -= 256;
- }
- return $pad;
- }
-
- /**
- * Returns true if the char belongs to the selected mode
- * @param $chr (int) Character (byte) to check.
- * @param $mode (int) Current encoding mode.
- * @return boolean true if the char is of the selected mode.
- * @protected
- */
- protected function isCharMode($chr, $mode) {
- $status = false;
- switch ($mode) {
- case ENC_ASCII: { // ASCII character 0 to 127
- $status = (($chr >= 0) AND ($chr <= 127));
- break;
- }
- case ENC_C40: { // Upper-case alphanumeric
- $status = (($chr == 32) OR (($chr >= 48) AND ($chr <= 57)) OR (($chr >= 65) AND ($chr <= 90)));
- break;
- }
- case ENC_TXT: { // Lower-case alphanumeric
- $status = (($chr == 32) OR (($chr >= 48) AND ($chr <= 57)) OR (($chr >= 97) AND ($chr <= 122)));
- break;
- }
- case ENC_X12: { // ANSI X12
- $status = (($chr == 13) OR ($chr == 42) OR ($chr == 62));
- break;
- }
- case ENC_EDF: { // ASCII character 32 to 94
- $status = (($chr >= 32) AND ($chr <= 94));
- break;
- }
- case ENC_BASE256: { // Function character (FNC1, Structured Append, Reader Program, or Code Page)
- $status = (($chr == 232) OR ($chr == 233) OR ($chr == 234) OR ($chr == 241));
- break;
- }
- case ENC_ASCII_EXT: { // ASCII character 128 to 255
- $status = (($chr >= 128) AND ($chr <= 255));
- break;
- }
- case ENC_ASCII_NUM: { // ASCII digits
- $status = (($chr >= 48) AND ($chr <= 57));
- break;
- }
- }
- return $status;
- }
-
- /**
- * The look-ahead test scans the data to be encoded to find the best mode (Annex P - steps from J to S).
- * @param $data (string) data to encode
- * @param $pos (int) current position
- * @param $mode (int) current encoding mode
- * @return int encoding mode
- * @protected
- */
- protected function lookAheadTest($data, $pos, $mode) {
- $data_length = strlen($data);
- if ($pos >= $data_length) {
- return $mode;
- }
- $charscount = 0; // count processed chars
- // STEP J
- if ($mode == ENC_ASCII) {
- $numch = array(0, 1, 1, 1, 1, 1.25);
- } else {
- $numch = array(1, 2, 2, 2, 2, 2.25);
- $numch[$mode] = 0;
- }
- while (true) {
- // STEP K
- if (($pos + $charscount) == $data_length) {
- if ($numch[ENC_ASCII] <= ceil(min($numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_EDF], $numch[ENC_BASE256]))) {
- return ENC_ASCII;
- }
- if ($numch[ENC_BASE256] < ceil(min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_EDF]))) {
- return ENC_BASE256;
- }
- if ($numch[ENC_EDF] < ceil(min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_BASE256]))) {
- return ENC_EDF;
- }
- if ($numch[ENC_TXT] < ceil(min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_X12], $numch[ENC_EDF], $numch[ENC_BASE256]))) {
- return ENC_TXT;
- }
- if ($numch[ENC_X12] < ceil(min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_EDF], $numch[ENC_BASE256]))) {
- return ENC_X12;
- }
- return ENC_C40;
- }
- // get char
- $chr = ord($data[$pos + $charscount]);
- $charscount++;
- // STEP L
- if ($this->isCharMode($chr, ENC_ASCII_NUM)) {
- $numch[ENC_ASCII] += (1 / 2);
- } elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
- $numch[ENC_ASCII] = ceil($numch[ENC_ASCII]);
- $numch[ENC_ASCII] += 2;
- } else {
- $numch[ENC_ASCII] = ceil($numch[ENC_ASCII]);
- $numch[ENC_ASCII] += 1;
- }
- // STEP M
- if ($this->isCharMode($chr, ENC_C40)) {
- $numch[ENC_C40] += (2 / 3);
- } elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
- $numch[ENC_C40] += (8 / 3);
- } else {
- $numch[ENC_C40] += (4 / 3);
- }
- // STEP N
- if ($this->isCharMode($chr, ENC_TXT)) {
- $numch[ENC_TXT] += (2 / 3);
- } elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
- $numch[ENC_TXT] += (8 / 3);
- } else {
- $numch[ENC_TXT] += (4 / 3);
- }
- // STEP O
- if ($this->isCharMode($chr, ENC_X12) OR $this->isCharMode($chr, ENC_C40)) {
- $numch[ENC_X12] += (2 / 3);
- } elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
- $numch[ENC_X12] += (13 / 3);
- } else {
- $numch[ENC_X12] += (10 / 3);
- }
- // STEP P
- if ($this->isCharMode($chr, ENC_EDF)) {
- $numch[ENC_EDF] += (3 / 4);
- } elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
- $numch[ENC_EDF] += (17 / 4);
- } else {
- $numch[ENC_EDF] += (13 / 4);
- }
- // STEP Q
- if ($this->isCharMode($chr, ENC_BASE256)) {
- $numch[ENC_BASE256] += 4;
- } else {
- $numch[ENC_BASE256] += 1;
- }
- // STEP R
- if ($charscount >= 4) {
- if (($numch[ENC_ASCII] + 1) <= min($numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_EDF], $numch[ENC_BASE256])) {
- return ENC_ASCII;
- }
- if ((($numch[ENC_BASE256] + 1) <= $numch[ENC_ASCII])
- OR (($numch[ENC_BASE256] + 1) < min($numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_EDF]))) {
- return ENC_BASE256;
- }
- if (($numch[ENC_EDF] + 1) < min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_BASE256])) {
- return ENC_EDF;
- }
- if (($numch[ENC_TXT] + 1) < min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_X12], $numch[ENC_EDF], $numch[ENC_BASE256])) {
- return ENC_TXT;
- }
- if (($numch[ENC_X12] + 1) < min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_EDF], $numch[ENC_BASE256])) {
- return ENC_X12;
- }
- if (($numch[ENC_C40] + 1) < min($numch[ENC_ASCII], $numch[ENC_TXT], $numch[ENC_EDF], $numch[ENC_BASE256])) {
- if ($numch[ENC_C40] < $numch[ENC_X12]) {
- return ENC_C40;
- }
- if ($numch[ENC_C40] == $numch[ENC_X12]) {
- $k = ($pos + $charscount + 1);
- while ($k < $data_length) {
- $tmpchr = ord($data{$k});
- if ($this->isCharMode($tmpchr, ENC_X12)) {
- return ENC_X12;
- } elseif (!($this->isCharMode($tmpchr, ENC_X12) OR $this->isCharMode($tmpchr, ENC_C40))) {
- break;
- }
- ++$k;
- }
- return ENC_C40;
- }
- }
- }
- } // end of while
- }
-
- /**
- * Get the switching codeword to a new encoding mode (latch codeword)
- * @param $mode (int) New encoding mode.
- * @return (int) Switch codeword.
- * @protected
- */
- protected function getSwitchEncodingCodeword($mode) {
- switch ($mode) {
- case ENC_ASCII: { // ASCII character 0 to 127
- $cw = 254;
- break;
- }
- case ENC_C40: { // Upper-case alphanumeric
- $cw = 230;
- break;
- }
- case ENC_TXT: { // Lower-case alphanumeric
- $cw = 239;
- break;
- }
- case ENC_X12: { // ANSI X12
- $cw = 238;
- break;
- }
- case ENC_EDF: { // ASCII character 32 to 94
- $cw = 240;
- break;
- }
- case ENC_BASE256: { // Function character (FNC1, Structured Append, Reader Program, or Code Page)
- $cw = 231;
- break;
- }
- }
- return $cw;
- }
-
- /**
- * Choose the minimum matrix size and return the max number of data codewords.
- * @param $numcw (int) Number of current codewords.
- * @return number of data codewords in matrix
- * @protected
- */
- protected function getMaxDataCodewords($numcw) {
- foreach ($this->symbattr as $key => $matrix) {
- if ($matrix[11] >= $numcw) {
- return $matrix[11];
- }
- }
- return 0;
- }
-
- /**
- * Get high level encoding using the minimum symbol data characters for ECC 200
- * @param $data (string) data to encode
- * @return array of codewords
- * @protected
- */
- protected function getHighLevelEncoding($data) {
- // STEP A. Start in ASCII encodation.
- $enc = ENC_ASCII; // current encoding mode
- $pos = 0; // current position
- $cw = array(); // array of codewords to be returned
- $cw_num = 0; // number of data codewords
- $data_lenght = strlen($data); // number of chars
- while ($pos < $data_lenght) {
- switch ($enc) {
- case ENC_ASCII: { // STEP B. While in ASCII encodation
- if (($data_lenght > 1) AND ($pos < ($data_lenght - 1)) AND ($this->isCharMode(ord($data[$pos]), ENC_ASCII_NUM) AND $this->isCharMode(ord($data[$pos + 1]), ENC_ASCII_NUM))) {
- // 1. If the next data sequence is at least 2 consecutive digits, encode the next two digits as a double digit in ASCII mode.
- $cw[] = (intval(substr($data, $pos, 2)) + 130);
- ++$cw_num;
- $pos += 2;
- } else {
- // 2. If the look-ahead test (starting at step J) indicates another mode, switch to that mode.
- $newenc = $this->lookAheadTest($data, $pos, $enc);
- if ($newenc != $enc) {
- // switch to new encoding
- $enc = $newenc;
- $cw[] = $this->getSwitchEncodingCodeword($enc);
- ++$cw_num;
- } else {
- // get new byte
- $chr = ord($data[$pos]);
- ++$pos;
- if ($this->isCharMode($chr, ENC_ASCII_EXT)) {
- // 3. If the next data character is extended ASCII (greater than 127) encode it in ASCII mode first using the Upper Shift (value 235) character.
- $cw[] = 235;
- $cw[] = ($chr - 127);
- $cw_num += 2;
- } else {
- // 4. Otherwise process the next data character in ASCII encodation.
- $cw[] = ($chr + 1);
- ++$cw_num;
- }
- }
- }
- break;
- }
- case ENC_C40 : // Upper-case alphanumeric
- case ENC_TXT : // Lower-case alphanumeric
- case ENC_X12 : { // ANSI X12
- $temp_cw = array();
- $p = 0;
- $epos = $pos;
- // get charset ID
- $set_id = $this->chset_id[$enc];
- // get basic charset for current encoding
- $charset = $this->chset[$set_id];
- do {
- // 2. process the next character in C40 encodation.
- $chr = ord($data[$epos]);
- ++$epos;
- // check for extended character
- if ($chr & 0x80) {
- if ($enc == ENC_X12) {
- return false;
- }
- $chr = ($chr & 0x7f);
- $temp_cw[] = 1; // shift 2
- $temp_cw[] = 30; // upper shift
- $p += 2;
- }
- if (isset($charset[$chr])) {
- $temp_cw[] = $charset[$chr];
- ++$p;
- } else {
- if (isset($this->chset['SH1'][$chr])) {
- $temp_cw[] = 0; // shift 1
- $shiftset = $this->chset['SH1'];
- } elseif (isset($chr, $this->chset['SH2'][$chr])) {
- $temp_cw[] = 1; // shift 2
- $shiftset = $this->chset['SH2'];
- } elseif (($enc == ENC_C40) AND isset($this->chset['S3C'][$chr])) {
- $temp_cw[] = 2; // shift 3
- $shiftset = $this->chset['S3C'];
- } elseif (($enc == ENC_TXT) AND isset($this->chset['S3T'][$chr])) {
- $temp_cw[] = 2; // shift 3
- $shiftset = $this->chset['S3T'];
- } else {
- return false;
- }
- $temp_cw[] = $shiftset[$chr];
- $p += 2;
- }
- if ($p >= 3) {
- $c1 = array_shift($temp_cw);
- $c2 = array_shift($temp_cw);
- $c3 = array_shift($temp_cw);
- $p -= 3;
- $tmp = ((1600 * $c1) + (40 * $c2) + $c3 + 1);
- $cw[] = ($tmp >> 8);
- $cw[] = ($tmp % 256);
- $cw_num += 2;
- $pos = $epos;
- // 1. If the C40 encoding is at the point of starting a new double symbol character and if the look-ahead test (starting at step J) indicates another mode, switch to that mode.
- $newenc = $this->lookAheadTest($data, $pos, $enc);
- if ($newenc != $enc) {
- $enc = $newenc;
- $cw[] = $this->getSwitchEncodingCodeword($enc);
- ++$cw_num;
- $pos -= $p;
- $p = 0;
- break;
- }
- }
- } while (($p > 0) AND ($epos < $data_lenght));
- // process last data (if any)
- if ($p > 0) {
- // get remaining number of data symbols
- $cwr = ($this->getMaxDataCodewords($cw_num + 2) - $cw_num);
- if (($cwr == 1) AND ($p == 1)) {
- // d. If one symbol character remains and one C40 value (data character) remains to be encoded
- $c1 = array_shift($temp_cw);
- --$p;
- $cw[] = ($c1 + 1);
- ++$cw_num;
- } elseif (($cwr == 2) AND ($p == 1)) {
- // c. If two symbol characters remain and only one C40 value (data character) remains to be encoded
- $c1 = array_shift($temp_cw);
- --$p;
- $cw[] = 254;
- $cw[] = ($c1 + 1);
- $cw_num += 2;
- } elseif (($cwr == 2) AND ($p == 2)) {
- // b. If two symbol characters remain and two C40 values remain to be encoded
- $c1 = array_shift($temp_cw);
- $c2 = array_shift($temp_cw);
- $p -= 2;
- $tmp = ((1600 * $c1) + (40 * $c2) + 1);
- $cw[] = ($tmp >> 8);
- $cw[] = ($tmp % 256);
- $cw_num += 2;
- } else {
- // switch to ASCII encoding
- if ($enc != ENC_ASCII) {
- $enc = ENC_ASCII;
- $cw[] = $this->getSwitchEncodingCodeword($enc);
- ++$cw_num;
- }
- }
- }
- break;
- }
- case ENC_EDF: { // F. While in EDIFACT (EDF) encodation
- // initialize temporary array with 0 lenght
- $temp_cw = array();
- $epos = $pos;
- $field_lenght = 0;
- $newenc = $enc;
- do {
- // 2. process the next character in EDIFACT encodation.
- $chr = ord($data[$epos]);
- if ($this->isCharMode($chr, ENC_EDF)) {
- ++$epos;
- $temp_cw[] = $chr;
- ++$field_lenght;
- }
- if (($field_lenght == 4) OR ($epos == $data_lenght) OR !$this->isCharMode($chr, ENC_EDF)) {
- if ($field_lenght < 4) {
- // set unlatch character
- $temp_cw[] = 0x1f;
- ++$field_lenght;
- // fill empty characters
- for ($i = $field_lenght; $i < 4; ++$i) {
- $temp_cw[] = 0;
- }
- $enc = ENC_ASCII;
- }
- // encodes four data characters in three codewords
- $tcw = (($temp_cw[0] & 0x3F) << 2) + (($temp_cw[1] & 0x30) >> 4);
- if ($tcw > 0) {
- $cw[] = $tcw;
- $cw_num++;
- }
- $tcw= (($temp_cw[1] & 0x0F) << 4) + (($temp_cw[2] & 0x3C) >> 2);
- if ($tcw > 0) {
- $cw[] = $tcw;
- $cw_num++;
- }
- $tcw = (($temp_cw[2] & 0x03) << 6) + ($temp_cw[3] & 0x3F);
- if ($tcw > 0) {
- $cw[] = $tcw;
- $cw_num++;
- }
- $temp_cw = array();
- $pos = $epos;
- $field_lenght = 0;
- if ($enc == ENC_ASCII) {
- break; // exit from EDIFACT mode
- }
- }
- } while ($epos < $data_lenght);
- break;
- }
- case ENC_BASE256: { // G. While in Base 256 (B256) encodation
- // initialize temporary array with 0 lenght
- $temp_cw = array();
- $field_lenght = 0;
- while (($pos < $data_lenght) AND ($field_lenght <= 1555)) {
- $newenc = $this->lookAheadTest($data, $pos, $enc);
- if ($newenc != $enc) {
- // 1. If the look-ahead test (starting at step J) indicates another mode, switch to that mode.
- $enc = $newenc;
- $cw[] = $this->getSwitchEncodingCodeword($enc);
- ++$cw_num;
- break; // exit from B256 mode
- } else {
- // 2. Otherwise, process the next character in Base 256 encodation.
- $chr = ord($data[$pos]);
- ++$pos;
- $temp_cw[] = $chr;
- ++$field_lenght;
- }
- }
- // set field lenght
- if ($field_lenght <= 249) {
- $cw[] = $field_lenght;
- ++$cw_num;
- } else {
- $cw[] = (floor($field_lenght / 250) + 249);
- $cw[] = ($field_lenght % 250);
- $cw_num += 2;
- }
- if (!empty($temp_cw)) {
- // add B256 field
- foreach ($temp_cw as $p => $cht) {
- $cw[] = $this->get255StateCodeword($chr, ($cw_num + $p));
- }
- }
- break;
- }
- } // end of switch enc
- } // end of while
- // set last used encoding
- $this->last_enc = $enc;
- return $cw;
- }
-
- /**
- * Places "chr+bit" with appropriate wrapping within array[].
- * (Annex F - ECC 200 symbol character placement)
- * @param $marr (array) Array of symbols.
- * @param $nrow (int) Number of rows.
- * @param $ncol (int) Number of columns.
- * @param $row (int) Row number.
- * @param $col (int) Column number.
- * @param $chr (int) Char byte.
- * @param $bit (int) Bit.
- * @return array
- * @protected
- */
- protected function placeModule($marr, $nrow, $ncol, $row, $col, $chr, $bit) {
- if ($row < 0) {
- $row += $nrow;
- $col += (4 - (($nrow + 4) % 8));
- }
- if ($col < 0) {
- $col += $ncol;
- $row += (4 - (($ncol + 4) % 8));
- }
- $marr[(($row * $ncol) + $col)] = ((10 * $chr) + $bit);
- return $marr;
- }
-
- /**
- * Places the 8 bits of a utah-shaped symbol character.
- * (Annex F - ECC 200 symbol character placement)
- * @param $marr (array) Array of symbols.
- * @param $nrow (int) Number of rows.
- * @param $ncol (int) Number of columns.
- * @param $row (int) Row number.
- * @param $col (int) Column number.
- * @param $chr (int) Char byte.
- * @return array
- * @protected
- */
- protected function placeUtah($marr, $nrow, $ncol, $row, $col, $chr) {
- $marr = $this->placeModule($marr, $nrow, $ncol, $row-2, $col-2, $chr, 1);
- $marr = $this->placeModule($marr, $nrow, $ncol, $row-2, $col-1, $chr, 2);
- $marr = $this->placeModule($marr, $nrow, $ncol, $row-1, $col-2, $chr, 3);
- $marr = $this->placeModule($marr, $nrow, $ncol, $row-1, $col-1, $chr, 4);
- $marr = $this->placeModule($marr, $nrow, $ncol, $row-1, $col, $chr, 5);
- $marr = $this->placeModule($marr, $nrow, $ncol, $row, $col-2, $chr, 6);
- $marr = $this->placeModule($marr, $nrow, $ncol, $row, $col-1, $chr, 7);
- $marr = $this->placeModule($marr, $nrow, $ncol, $row, $col, $chr, 8);
- return $marr;
- }
-
- /**
- * Places the 8 bits of the first special corner case.
- * (Annex F - ECC 200 symbol character placement)
- * @param $marr (array) Array of symbols.
- * @param $nrow (int) Number of rows.
- * @param $ncol (int) Number of columns.
- * @param $chr (int) Char byte.
- * @return array
- * @protected
- */
- protected function placeCornerA($marr, $nrow, $ncol, $chr) {
- $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 0, $chr, 1);
- $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 1, $chr, 2);
- $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 2, $chr, 3);
- $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-2, $chr, 4);
- $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-1, $chr, 5);
- $marr = $this->placeModule($marr, $nrow, $ncol, 1, $ncol-1, $chr, 6);
- $marr = $this->placeModule($marr, $nrow, $ncol, 2, $ncol-1, $chr, 7);
- $marr = $this->placeModule($marr, $nrow, $ncol, 3, $ncol-1, $chr, 8);
- return $marr;
- }
-
- /**
- * Places the 8 bits of the second special corner case.
- * (Annex F - ECC 200 symbol character placement)
- * @param $marr (array) Array of symbols.
- * @param $nrow (int) Number of rows.
- * @param $ncol (int) Number of columns.
- * @param $chr (int) Char byte.
- * @return array
- * @protected
- */
- protected function placeCornerB($marr, $nrow, $ncol, $chr) {
- $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-3, 0, $chr, 1);
- $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-2, 0, $chr, 2);
- $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 0, $chr, 3);
- $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-4, $chr, 4);
- $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-3, $chr, 5);
- $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-2, $chr, 6);
- $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-1, $chr, 7);
- $marr = $this->placeModule($marr, $nrow, $ncol, 1, $ncol-1, $chr, 8);
- return $marr;
- }
-
- /**
- * Places the 8 bits of the third special corner case.
- * (Annex F - ECC 200 symbol character placement)
- * @param $marr (array) Array of symbols.
- * @param $nrow (int) Number of rows.
- * @param $ncol (int) Number of columns.
- * @param $chr (int) Char byte.
- * @return array
- * @protected
- */
- protected function placeCornerC($marr, $nrow, $ncol, $chr) {
- $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-3, 0, $chr, 1);
- $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-2, 0, $chr, 2);
- $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 0, $chr, 3);
- $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-2, $chr, 4);
- $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-1, $chr, 5);
- $marr = $this->placeModule($marr, $nrow, $ncol, 1, $ncol-1, $chr, 6);
- $marr = $this->placeModule($marr, $nrow, $ncol, 2, $ncol-1, $chr, 7);
- $marr = $this->placeModule($marr, $nrow, $ncol, 3, $ncol-1, $chr, 8);
- return $marr;
- }
-
- /**
- * Places the 8 bits of the fourth special corner case.
- * (Annex F - ECC 200 symbol character placement)
- * @param $marr (array) Array of symbols.
- * @param $nrow (int) Number of rows.
- * @param $ncol (int) Number of columns.
- * @param $chr (int) Char byte.
- * @return array
- * @protected
- */
- protected function placeCornerD($marr, $nrow, $ncol, $chr) {
- $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 0, $chr, 1);
- $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, $ncol-1, $chr, 2);
- $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-3, $chr, 3);
- $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-2, $chr, 4);
- $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-1, $chr, 5);
- $marr = $this->placeModule($marr, $nrow, $ncol, 1, $ncol-3, $chr, 6);
- $marr = $this->placeModule($marr, $nrow, $ncol, 1, $ncol-2, $chr, 7);
- $marr = $this->placeModule($marr, $nrow, $ncol, 1, $ncol-1, $chr, 8);
- return $marr;
- }
-
- /**
- * Build a placement map.
- * (Annex F - ECC 200 symbol character placement)
- * @param $nrow (int) Number of rows.
- * @param $ncol (int) Number of columns.
- * @return array
- * @protected
- */
- protected function getPlacementMap($nrow, $ncol) {
- // initialize array with zeros
- $marr = array_fill(0, ($nrow * $ncol), 0);
- // set starting values
- $chr = 1;
- $row = 4;
- $col = 0;
- do {
- // repeatedly first check for one of the special corner cases, then
- if (($row == $nrow) AND ($col == 0)) {
- $marr = $this->placeCornerA($marr, $nrow, $ncol, $chr);
- ++$chr;
- }
- if (($row == ($nrow - 2)) AND ($col == 0) AND ($ncol % 4)) {
- $marr = $this->placeCornerB($marr, $nrow, $ncol, $chr);
- ++$chr;
- }
- if (($row == ($nrow - 2)) AND ($col == 0) AND (($ncol % 8) == 4)) {
- $marr = $this->placeCornerC($marr, $nrow, $ncol, $chr);
- ++$chr;
- }
- if (($row == ($nrow + 4)) AND ($col == 2) AND (!($ncol % 8))) {
- $marr = $this->placeCornerD($marr, $nrow, $ncol, $chr);
- ++$chr;
- }
- // sweep upward diagonally, inserting successive characters,
- do {
- if (($row < $nrow) AND ($col >= 0) AND (!$marr[(($row * $ncol) + $col)])) {
- $marr = $this->placeUtah($marr, $nrow, $ncol, $row, $col, $chr);
- ++$chr;
- }
- $row -= 2;
- $col += 2;
- } while (($row >= 0) AND ($col < $ncol));
- ++$row;
- $col += 3;
- // & then sweep downward diagonally, inserting successive characters,...
- do {
- if (($row >= 0) AND ($col < $ncol) AND (!$marr[(($row * $ncol) + $col)])) {
- $marr = $this->placeUtah($marr, $nrow, $ncol, $row, $col, $chr);
- ++$chr;
- }
- $row += 2;
- $col -= 2;
- } while (($row < $nrow) AND ($col >= 0));
- $row += 3;
- ++$col;
- // ... until the entire array is scanned
- } while (($row < $nrow) OR ($col < $ncol));
- // lastly, if the lower righthand corner is untouched, fill in fixed pattern
- if (!$marr[(($nrow * $ncol) - 1)]) {
- $marr[(($nrow * $ncol) - 1)] = 1;
- $marr[(($nrow * $ncol) - $ncol - 2)] = 1;
- }
- return $marr;
- }
-
-} // end DataMatrix class
-//============================================================+
-// END OF FILE
-//============================================================+
diff --git a/libs/tcpdf/include/barcodes/pdf417.php b/libs/tcpdf/include/barcodes/pdf417.php
deleted file mode 100644
index 4265299074..0000000000
--- a/libs/tcpdf/include/barcodes/pdf417.php
+++ /dev/null
@@ -1,996 +0,0 @@
-<?php
-//============================================================+
-// File name : pdf417.php
-// Version : 1.0.005
-// Begin : 2010-06-03
-// Last Update : 2013-09-17
-// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
-// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
-// -------------------------------------------------------------------
-// Copyright (C) 2010-2013 Nicola Asuni - Tecnick.com LTD
-//
-// This file is part of TCPDF software library.
-//
-// TCPDF 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 3 of the
-// License, or (at your option) any later version.
-//
-// TCPDF 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 TCPDF. If not, see <http://www.gnu.org/licenses/>.
-//
-// See LICENSE.TXT file for more information.
-// -------------------------------------------------------------------
-//
-// DESCRIPTION :
-//
-// Class to create PDF417 barcode arrays for TCPDF class.
-// PDF417 (ISO/IEC 15438:2006) is a 2-dimensional stacked bar code created by Symbol Technologies in 1991.
-// It is one of the most popular 2D codes because of its ability to be read with slightly modified handheld laser or linear CCD scanners.
-// TECHNICAL DATA / FEATURES OF PDF417:
-// Encodable Character Set: All 128 ASCII Characters (including extended)
-// Code Type: Continuous, Multi-Row
-// Symbol Height: 3 - 90 Rows
-// Symbol Width: 90X - 583X
-// Bidirectional Decoding: Yes
-// Error Correction Characters: 2 - 512
-// Maximum Data Characters: 1850 text, 2710 digits, 1108 bytes
-//
-//============================================================+
-
-/**
- * @file
- * Class to create PDF417 barcode arrays for TCPDF class.
- * PDF417 (ISO/IEC 15438:2006) is a 2-dimensional stacked bar code created by Symbol Technologies in 1991.
- * (requires PHP bcmath extension)
- * @package com.tecnick.tcpdf
- * @author Nicola Asuni
- * @version 1.0.005
- */
-
-// definitions
-if (!defined('PDF417DEFS')) {
-
- /**
- * Indicate that definitions for this class are set
- */
- define('PDF417DEFS', true);
-
- // -----------------------------------------------------
-
- /**
- * Row height respect X dimension of single module
- */
- define('ROWHEIGHT', 4);
-
- /**
- * Horizontal quiet zone in modules
- */
- define('QUIETH', 2);
-
- /**
- * Vertical quiet zone in modules
- */
- define('QUIETV', 2);
-
-} // end of definitions
-
-// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
-
-/**
- * @class PDF417
- * Class to create PDF417 barcode arrays for TCPDF class.
- * PDF417 (ISO/IEC 15438:2006) is a 2-dimensional stacked bar code created by Symbol Technologies in 1991.
- * @package com.tecnick.tcpdf
- * @author Nicola Asuni
- * @version 1.0.003
- */
-class PDF417 {
-
- /**
- * Barcode array to be returned which is readable by TCPDF.
- * @protected
- */
- protected $barcode_array = array();
-
- /**
- * Start pattern.
- * @protected
- */
- protected $start_pattern = '11111111010101000';
-
- /**
- * Stop pattern.
- * @protected
- */
- protected $stop_pattern = '111111101000101001';
-
- /**
- * Array of text Compaction Sub-Modes (values 0xFB - 0xFF are used for submode changers).
- * @protected
- */
- protected $textsubmodes = array(
- array(0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x20,0xFD,0xFE,0xFF), // Alpha
- array(0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x20,0xFD,0xFE,0xFF), // Lower
- array(0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x26,0x0d,0x09,0x2c,0x3a,0x23,0x2d,0x2e,0x24,0x2f,0x2b,0x25,0x2a,0x3d,0x5e,0xFB,0x20,0xFD,0xFE,0xFF), // Mixed
- array(0x3b,0x3c,0x3e,0x40,0x5b,0x5c,0x5d,0x5f,0x60,0x7e,0x21,0x0d,0x09,0x2c,0x3a,0x0a,0x2d,0x2e,0x24,0x2f,0x22,0x7c,0x2a,0x28,0x29,0x3f,0x7b,0x7d,0x27,0xFF) // Puntuaction
- );
-
- /**
- * Array of switching codes for Text Compaction Sub-Modes.
- * @protected
- */
- protected $textlatch = array(
- '01' => array(27), '02' => array(28), '03' => array(28,25), //
- '10' => array(28,28), '12' => array(28), '13' => array(28,25), //
- '20' => array(28), '21' => array(27), '23' => array(25), //
- '30' => array(29), '31' => array(29,27), '32' => array(29,28) //
- );
-
- /**
- * Clusters of codewords (0, 3, 6)<br/>
- * Values are hex equivalents of binary representation of bars (1 = bar, 0 = space).<br/>
- * The codewords numbered from 900 to 928 have special meaning, some enable to switch between modes in order to optimise the code:<ul>
- * <li>900 : Switch to "Text" mode</li>
- * <li>901 : Switch to "Byte" mode</li>
- * <li>902 : Switch to "Numeric" mode</li>
- * <li>903 - 912 : Reserved</li>
- * <li>913 : Switch to "Octet" only for the next codeword</li>
- * <li>914 - 920 : Reserved</li>
- * <li>921 : Initialization</li>
- * <li>922 : Terminator codeword for Macro PDF control block</li>
- * <li>923 : Sequence tag to identify the beginning of optional fields in the Macro PDF control block</li>
- * <li>924 : Switch to "Byte" mode (If the total number of byte is multiple of 6)</li>
- * <li>925 : Identifier for a user defined Extended Channel Interpretation (ECI)</li>
- * <li>926 : Identifier for a general purpose ECI format</li>
- * <li>927 : Identifier for an ECI of a character set or code page</li>
- * <li>928 : Macro marker codeword to indicate the beginning of a Macro PDF Control Block</li>
- * </ul>
- * @protected
- */
- protected $clusters = array(
- array( // cluster 0 -----------------------------------------------------------------------
- 0x1d5c0,0x1eaf0,0x1f57c,0x1d4e0,0x1ea78,0x1f53e,0x1a8c0,0x1d470,0x1a860,0x15040, // 10
- 0x1a830,0x15020,0x1adc0,0x1d6f0,0x1eb7c,0x1ace0,0x1d678,0x1eb3e,0x158c0,0x1ac70, // 20
- 0x15860,0x15dc0,0x1aef0,0x1d77c,0x15ce0,0x1ae78,0x1d73e,0x15c70,0x1ae3c,0x15ef0, // 30
- 0x1af7c,0x15e78,0x1af3e,0x15f7c,0x1f5fa,0x1d2e0,0x1e978,0x1f4be,0x1a4c0,0x1d270, // 40
- 0x1e93c,0x1a460,0x1d238,0x14840,0x1a430,0x1d21c,0x14820,0x1a418,0x14810,0x1a6e0, // 50
- 0x1d378,0x1e9be,0x14cc0,0x1a670,0x1d33c,0x14c60,0x1a638,0x1d31e,0x14c30,0x1a61c, // 60
- 0x14ee0,0x1a778,0x1d3be,0x14e70,0x1a73c,0x14e38,0x1a71e,0x14f78,0x1a7be,0x14f3c, // 70
- 0x14f1e,0x1a2c0,0x1d170,0x1e8bc,0x1a260,0x1d138,0x1e89e,0x14440,0x1a230,0x1d11c, // 80
- 0x14420,0x1a218,0x14410,0x14408,0x146c0,0x1a370,0x1d1bc,0x14660,0x1a338,0x1d19e, // 90
- 0x14630,0x1a31c,0x14618,0x1460c,0x14770,0x1a3bc,0x14738,0x1a39e,0x1471c,0x147bc, // 100
- 0x1a160,0x1d0b8,0x1e85e,0x14240,0x1a130,0x1d09c,0x14220,0x1a118,0x1d08e,0x14210, // 110
- 0x1a10c,0x14208,0x1a106,0x14360,0x1a1b8,0x1d0de,0x14330,0x1a19c,0x14318,0x1a18e, // 120
- 0x1430c,0x14306,0x1a1de,0x1438e,0x14140,0x1a0b0,0x1d05c,0x14120,0x1a098,0x1d04e, // 130
- 0x14110,0x1a08c,0x14108,0x1a086,0x14104,0x141b0,0x14198,0x1418c,0x140a0,0x1d02e, // 140
- 0x1a04c,0x1a046,0x14082,0x1cae0,0x1e578,0x1f2be,0x194c0,0x1ca70,0x1e53c,0x19460, // 150
- 0x1ca38,0x1e51e,0x12840,0x19430,0x12820,0x196e0,0x1cb78,0x1e5be,0x12cc0,0x19670, // 160
- 0x1cb3c,0x12c60,0x19638,0x12c30,0x12c18,0x12ee0,0x19778,0x1cbbe,0x12e70,0x1973c, // 170
- 0x12e38,0x12e1c,0x12f78,0x197be,0x12f3c,0x12fbe,0x1dac0,0x1ed70,0x1f6bc,0x1da60, // 180
- 0x1ed38,0x1f69e,0x1b440,0x1da30,0x1ed1c,0x1b420,0x1da18,0x1ed0e,0x1b410,0x1da0c, // 190
- 0x192c0,0x1c970,0x1e4bc,0x1b6c0,0x19260,0x1c938,0x1e49e,0x1b660,0x1db38,0x1ed9e, // 200
- 0x16c40,0x12420,0x19218,0x1c90e,0x16c20,0x1b618,0x16c10,0x126c0,0x19370,0x1c9bc, // 210
- 0x16ec0,0x12660,0x19338,0x1c99e,0x16e60,0x1b738,0x1db9e,0x16e30,0x12618,0x16e18, // 220
- 0x12770,0x193bc,0x16f70,0x12738,0x1939e,0x16f38,0x1b79e,0x16f1c,0x127bc,0x16fbc, // 230
- 0x1279e,0x16f9e,0x1d960,0x1ecb8,0x1f65e,0x1b240,0x1d930,0x1ec9c,0x1b220,0x1d918, // 240
- 0x1ec8e,0x1b210,0x1d90c,0x1b208,0x1b204,0x19160,0x1c8b8,0x1e45e,0x1b360,0x19130, // 250
- 0x1c89c,0x16640,0x12220,0x1d99c,0x1c88e,0x16620,0x12210,0x1910c,0x16610,0x1b30c, // 260
- 0x19106,0x12204,0x12360,0x191b8,0x1c8de,0x16760,0x12330,0x1919c,0x16730,0x1b39c, // 270
- 0x1918e,0x16718,0x1230c,0x12306,0x123b8,0x191de,0x167b8,0x1239c,0x1679c,0x1238e, // 280
- 0x1678e,0x167de,0x1b140,0x1d8b0,0x1ec5c,0x1b120,0x1d898,0x1ec4e,0x1b110,0x1d88c, // 290
- 0x1b108,0x1d886,0x1b104,0x1b102,0x12140,0x190b0,0x1c85c,0x16340,0x12120,0x19098, // 300
- 0x1c84e,0x16320,0x1b198,0x1d8ce,0x16310,0x12108,0x19086,0x16308,0x1b186,0x16304, // 310
- 0x121b0,0x190dc,0x163b0,0x12198,0x190ce,0x16398,0x1b1ce,0x1638c,0x12186,0x16386, // 320
- 0x163dc,0x163ce,0x1b0a0,0x1d858,0x1ec2e,0x1b090,0x1d84c,0x1b088,0x1d846,0x1b084, // 330
- 0x1b082,0x120a0,0x19058,0x1c82e,0x161a0,0x12090,0x1904c,0x16190,0x1b0cc,0x19046, // 340
- 0x16188,0x12084,0x16184,0x12082,0x120d8,0x161d8,0x161cc,0x161c6,0x1d82c,0x1d826, // 350
- 0x1b042,0x1902c,0x12048,0x160c8,0x160c4,0x160c2,0x18ac0,0x1c570,0x1e2bc,0x18a60, // 360
- 0x1c538,0x11440,0x18a30,0x1c51c,0x11420,0x18a18,0x11410,0x11408,0x116c0,0x18b70, // 370
- 0x1c5bc,0x11660,0x18b38,0x1c59e,0x11630,0x18b1c,0x11618,0x1160c,0x11770,0x18bbc, // 380
- 0x11738,0x18b9e,0x1171c,0x117bc,0x1179e,0x1cd60,0x1e6b8,0x1f35e,0x19a40,0x1cd30, // 390
- 0x1e69c,0x19a20,0x1cd18,0x1e68e,0x19a10,0x1cd0c,0x19a08,0x1cd06,0x18960,0x1c4b8, // 400
- 0x1e25e,0x19b60,0x18930,0x1c49c,0x13640,0x11220,0x1cd9c,0x1c48e,0x13620,0x19b18, // 410
- 0x1890c,0x13610,0x11208,0x13608,0x11360,0x189b8,0x1c4de,0x13760,0x11330,0x1cdde, // 420
- 0x13730,0x19b9c,0x1898e,0x13718,0x1130c,0x1370c,0x113b8,0x189de,0x137b8,0x1139c, // 430
- 0x1379c,0x1138e,0x113de,0x137de,0x1dd40,0x1eeb0,0x1f75c,0x1dd20,0x1ee98,0x1f74e, // 440
- 0x1dd10,0x1ee8c,0x1dd08,0x1ee86,0x1dd04,0x19940,0x1ccb0,0x1e65c,0x1bb40,0x19920, // 450
- 0x1eedc,0x1e64e,0x1bb20,0x1dd98,0x1eece,0x1bb10,0x19908,0x1cc86,0x1bb08,0x1dd86, // 460
- 0x19902,0x11140,0x188b0,0x1c45c,0x13340,0x11120,0x18898,0x1c44e,0x17740,0x13320, // 470
- 0x19998,0x1ccce,0x17720,0x1bb98,0x1ddce,0x18886,0x17710,0x13308,0x19986,0x17708, // 480
- 0x11102,0x111b0,0x188dc,0x133b0,0x11198,0x188ce,0x177b0,0x13398,0x199ce,0x17798, // 490
- 0x1bbce,0x11186,0x13386,0x111dc,0x133dc,0x111ce,0x177dc,0x133ce,0x1dca0,0x1ee58, // 500
- 0x1f72e,0x1dc90,0x1ee4c,0x1dc88,0x1ee46,0x1dc84,0x1dc82,0x198a0,0x1cc58,0x1e62e, // 510
- 0x1b9a0,0x19890,0x1ee6e,0x1b990,0x1dccc,0x1cc46,0x1b988,0x19884,0x1b984,0x19882, // 520
- 0x1b982,0x110a0,0x18858,0x1c42e,0x131a0,0x11090,0x1884c,0x173a0,0x13190,0x198cc, // 530
- 0x18846,0x17390,0x1b9cc,0x11084,0x17388,0x13184,0x11082,0x13182,0x110d8,0x1886e, // 540
- 0x131d8,0x110cc,0x173d8,0x131cc,0x110c6,0x173cc,0x131c6,0x110ee,0x173ee,0x1dc50, // 550
- 0x1ee2c,0x1dc48,0x1ee26,0x1dc44,0x1dc42,0x19850,0x1cc2c,0x1b8d0,0x19848,0x1cc26, // 560
- 0x1b8c8,0x1dc66,0x1b8c4,0x19842,0x1b8c2,0x11050,0x1882c,0x130d0,0x11048,0x18826, // 570
- 0x171d0,0x130c8,0x19866,0x171c8,0x1b8e6,0x11042,0x171c4,0x130c2,0x171c2,0x130ec, // 580
- 0x171ec,0x171e6,0x1ee16,0x1dc22,0x1cc16,0x19824,0x19822,0x11028,0x13068,0x170e8, // 590
- 0x11022,0x13062,0x18560,0x10a40,0x18530,0x10a20,0x18518,0x1c28e,0x10a10,0x1850c, // 600
- 0x10a08,0x18506,0x10b60,0x185b8,0x1c2de,0x10b30,0x1859c,0x10b18,0x1858e,0x10b0c, // 610
- 0x10b06,0x10bb8,0x185de,0x10b9c,0x10b8e,0x10bde,0x18d40,0x1c6b0,0x1e35c,0x18d20, // 620
- 0x1c698,0x18d10,0x1c68c,0x18d08,0x1c686,0x18d04,0x10940,0x184b0,0x1c25c,0x11b40, // 630
- 0x10920,0x1c6dc,0x1c24e,0x11b20,0x18d98,0x1c6ce,0x11b10,0x10908,0x18486,0x11b08, // 640
- 0x18d86,0x10902,0x109b0,0x184dc,0x11bb0,0x10998,0x184ce,0x11b98,0x18dce,0x11b8c, // 650
- 0x10986,0x109dc,0x11bdc,0x109ce,0x11bce,0x1cea0,0x1e758,0x1f3ae,0x1ce90,0x1e74c, // 660
- 0x1ce88,0x1e746,0x1ce84,0x1ce82,0x18ca0,0x1c658,0x19da0,0x18c90,0x1c64c,0x19d90, // 670
- 0x1cecc,0x1c646,0x19d88,0x18c84,0x19d84,0x18c82,0x19d82,0x108a0,0x18458,0x119a0, // 680
- 0x10890,0x1c66e,0x13ba0,0x11990,0x18ccc,0x18446,0x13b90,0x19dcc,0x10884,0x13b88, // 690
- 0x11984,0x10882,0x11982,0x108d8,0x1846e,0x119d8,0x108cc,0x13bd8,0x119cc,0x108c6, // 700
- 0x13bcc,0x119c6,0x108ee,0x119ee,0x13bee,0x1ef50,0x1f7ac,0x1ef48,0x1f7a6,0x1ef44, // 710
- 0x1ef42,0x1ce50,0x1e72c,0x1ded0,0x1ef6c,0x1e726,0x1dec8,0x1ef66,0x1dec4,0x1ce42, // 720
- 0x1dec2,0x18c50,0x1c62c,0x19cd0,0x18c48,0x1c626,0x1bdd0,0x19cc8,0x1ce66,0x1bdc8, // 730
- 0x1dee6,0x18c42,0x1bdc4,0x19cc2,0x1bdc2,0x10850,0x1842c,0x118d0,0x10848,0x18426, // 740
- 0x139d0,0x118c8,0x18c66,0x17bd0,0x139c8,0x19ce6,0x10842,0x17bc8,0x1bde6,0x118c2, // 750
- 0x17bc4,0x1086c,0x118ec,0x10866,0x139ec,0x118e6,0x17bec,0x139e6,0x17be6,0x1ef28, // 760
- 0x1f796,0x1ef24,0x1ef22,0x1ce28,0x1e716,0x1de68,0x1ef36,0x1de64,0x1ce22,0x1de62, // 770
- 0x18c28,0x1c616,0x19c68,0x18c24,0x1bce8,0x19c64,0x18c22,0x1bce4,0x19c62,0x1bce2, // 780
- 0x10828,0x18416,0x11868,0x18c36,0x138e8,0x11864,0x10822,0x179e8,0x138e4,0x11862, // 790
- 0x179e4,0x138e2,0x179e2,0x11876,0x179f6,0x1ef12,0x1de34,0x1de32,0x19c34,0x1bc74, // 800
- 0x1bc72,0x11834,0x13874,0x178f4,0x178f2,0x10540,0x10520,0x18298,0x10510,0x10508, // 810
- 0x10504,0x105b0,0x10598,0x1058c,0x10586,0x105dc,0x105ce,0x186a0,0x18690,0x1c34c, // 820
- 0x18688,0x1c346,0x18684,0x18682,0x104a0,0x18258,0x10da0,0x186d8,0x1824c,0x10d90, // 830
- 0x186cc,0x10d88,0x186c6,0x10d84,0x10482,0x10d82,0x104d8,0x1826e,0x10dd8,0x186ee, // 840
- 0x10dcc,0x104c6,0x10dc6,0x104ee,0x10dee,0x1c750,0x1c748,0x1c744,0x1c742,0x18650, // 850
- 0x18ed0,0x1c76c,0x1c326,0x18ec8,0x1c766,0x18ec4,0x18642,0x18ec2,0x10450,0x10cd0, // 860
- 0x10448,0x18226,0x11dd0,0x10cc8,0x10444,0x11dc8,0x10cc4,0x10442,0x11dc4,0x10cc2, // 870
- 0x1046c,0x10cec,0x10466,0x11dec,0x10ce6,0x11de6,0x1e7a8,0x1e7a4,0x1e7a2,0x1c728, // 880
- 0x1cf68,0x1e7b6,0x1cf64,0x1c722,0x1cf62,0x18628,0x1c316,0x18e68,0x1c736,0x19ee8, // 890
- 0x18e64,0x18622,0x19ee4,0x18e62,0x19ee2,0x10428,0x18216,0x10c68,0x18636,0x11ce8, // 900
- 0x10c64,0x10422,0x13de8,0x11ce4,0x10c62,0x13de4,0x11ce2,0x10436,0x10c76,0x11cf6, // 910
- 0x13df6,0x1f7d4,0x1f7d2,0x1e794,0x1efb4,0x1e792,0x1efb2,0x1c714,0x1cf34,0x1c712, // 920
- 0x1df74,0x1cf32,0x1df72,0x18614,0x18e34,0x18612,0x19e74,0x18e32,0x1bef4), // 929
- array( // cluster 3 -----------------------------------------------------------------------
- 0x1f560,0x1fab8,0x1ea40,0x1f530,0x1fa9c,0x1ea20,0x1f518,0x1fa8e,0x1ea10,0x1f50c, // 10
- 0x1ea08,0x1f506,0x1ea04,0x1eb60,0x1f5b8,0x1fade,0x1d640,0x1eb30,0x1f59c,0x1d620, // 20
- 0x1eb18,0x1f58e,0x1d610,0x1eb0c,0x1d608,0x1eb06,0x1d604,0x1d760,0x1ebb8,0x1f5de, // 30
- 0x1ae40,0x1d730,0x1eb9c,0x1ae20,0x1d718,0x1eb8e,0x1ae10,0x1d70c,0x1ae08,0x1d706, // 40
- 0x1ae04,0x1af60,0x1d7b8,0x1ebde,0x15e40,0x1af30,0x1d79c,0x15e20,0x1af18,0x1d78e, // 50
- 0x15e10,0x1af0c,0x15e08,0x1af06,0x15f60,0x1afb8,0x1d7de,0x15f30,0x1af9c,0x15f18, // 60
- 0x1af8e,0x15f0c,0x15fb8,0x1afde,0x15f9c,0x15f8e,0x1e940,0x1f4b0,0x1fa5c,0x1e920, // 70
- 0x1f498,0x1fa4e,0x1e910,0x1f48c,0x1e908,0x1f486,0x1e904,0x1e902,0x1d340,0x1e9b0, // 80
- 0x1f4dc,0x1d320,0x1e998,0x1f4ce,0x1d310,0x1e98c,0x1d308,0x1e986,0x1d304,0x1d302, // 90
- 0x1a740,0x1d3b0,0x1e9dc,0x1a720,0x1d398,0x1e9ce,0x1a710,0x1d38c,0x1a708,0x1d386, // 100
- 0x1a704,0x1a702,0x14f40,0x1a7b0,0x1d3dc,0x14f20,0x1a798,0x1d3ce,0x14f10,0x1a78c, // 110
- 0x14f08,0x1a786,0x14f04,0x14fb0,0x1a7dc,0x14f98,0x1a7ce,0x14f8c,0x14f86,0x14fdc, // 120
- 0x14fce,0x1e8a0,0x1f458,0x1fa2e,0x1e890,0x1f44c,0x1e888,0x1f446,0x1e884,0x1e882, // 130
- 0x1d1a0,0x1e8d8,0x1f46e,0x1d190,0x1e8cc,0x1d188,0x1e8c6,0x1d184,0x1d182,0x1a3a0, // 140
- 0x1d1d8,0x1e8ee,0x1a390,0x1d1cc,0x1a388,0x1d1c6,0x1a384,0x1a382,0x147a0,0x1a3d8, // 150
- 0x1d1ee,0x14790,0x1a3cc,0x14788,0x1a3c6,0x14784,0x14782,0x147d8,0x1a3ee,0x147cc, // 160
- 0x147c6,0x147ee,0x1e850,0x1f42c,0x1e848,0x1f426,0x1e844,0x1e842,0x1d0d0,0x1e86c, // 170
- 0x1d0c8,0x1e866,0x1d0c4,0x1d0c2,0x1a1d0,0x1d0ec,0x1a1c8,0x1d0e6,0x1a1c4,0x1a1c2, // 180
- 0x143d0,0x1a1ec,0x143c8,0x1a1e6,0x143c4,0x143c2,0x143ec,0x143e6,0x1e828,0x1f416, // 190
- 0x1e824,0x1e822,0x1d068,0x1e836,0x1d064,0x1d062,0x1a0e8,0x1d076,0x1a0e4,0x1a0e2, // 200
- 0x141e8,0x1a0f6,0x141e4,0x141e2,0x1e814,0x1e812,0x1d034,0x1d032,0x1a074,0x1a072, // 210
- 0x1e540,0x1f2b0,0x1f95c,0x1e520,0x1f298,0x1f94e,0x1e510,0x1f28c,0x1e508,0x1f286, // 220
- 0x1e504,0x1e502,0x1cb40,0x1e5b0,0x1f2dc,0x1cb20,0x1e598,0x1f2ce,0x1cb10,0x1e58c, // 230
- 0x1cb08,0x1e586,0x1cb04,0x1cb02,0x19740,0x1cbb0,0x1e5dc,0x19720,0x1cb98,0x1e5ce, // 240
- 0x19710,0x1cb8c,0x19708,0x1cb86,0x19704,0x19702,0x12f40,0x197b0,0x1cbdc,0x12f20, // 250
- 0x19798,0x1cbce,0x12f10,0x1978c,0x12f08,0x19786,0x12f04,0x12fb0,0x197dc,0x12f98, // 260
- 0x197ce,0x12f8c,0x12f86,0x12fdc,0x12fce,0x1f6a0,0x1fb58,0x16bf0,0x1f690,0x1fb4c, // 270
- 0x169f8,0x1f688,0x1fb46,0x168fc,0x1f684,0x1f682,0x1e4a0,0x1f258,0x1f92e,0x1eda0, // 280
- 0x1e490,0x1fb6e,0x1ed90,0x1f6cc,0x1f246,0x1ed88,0x1e484,0x1ed84,0x1e482,0x1ed82, // 290
- 0x1c9a0,0x1e4d8,0x1f26e,0x1dba0,0x1c990,0x1e4cc,0x1db90,0x1edcc,0x1e4c6,0x1db88, // 300
- 0x1c984,0x1db84,0x1c982,0x1db82,0x193a0,0x1c9d8,0x1e4ee,0x1b7a0,0x19390,0x1c9cc, // 310
- 0x1b790,0x1dbcc,0x1c9c6,0x1b788,0x19384,0x1b784,0x19382,0x1b782,0x127a0,0x193d8, // 320
- 0x1c9ee,0x16fa0,0x12790,0x193cc,0x16f90,0x1b7cc,0x193c6,0x16f88,0x12784,0x16f84, // 330
- 0x12782,0x127d8,0x193ee,0x16fd8,0x127cc,0x16fcc,0x127c6,0x16fc6,0x127ee,0x1f650, // 340
- 0x1fb2c,0x165f8,0x1f648,0x1fb26,0x164fc,0x1f644,0x1647e,0x1f642,0x1e450,0x1f22c, // 350
- 0x1ecd0,0x1e448,0x1f226,0x1ecc8,0x1f666,0x1ecc4,0x1e442,0x1ecc2,0x1c8d0,0x1e46c, // 360
- 0x1d9d0,0x1c8c8,0x1e466,0x1d9c8,0x1ece6,0x1d9c4,0x1c8c2,0x1d9c2,0x191d0,0x1c8ec, // 370
- 0x1b3d0,0x191c8,0x1c8e6,0x1b3c8,0x1d9e6,0x1b3c4,0x191c2,0x1b3c2,0x123d0,0x191ec, // 380
- 0x167d0,0x123c8,0x191e6,0x167c8,0x1b3e6,0x167c4,0x123c2,0x167c2,0x123ec,0x167ec, // 390
- 0x123e6,0x167e6,0x1f628,0x1fb16,0x162fc,0x1f624,0x1627e,0x1f622,0x1e428,0x1f216, // 400
- 0x1ec68,0x1f636,0x1ec64,0x1e422,0x1ec62,0x1c868,0x1e436,0x1d8e8,0x1c864,0x1d8e4, // 410
- 0x1c862,0x1d8e2,0x190e8,0x1c876,0x1b1e8,0x1d8f6,0x1b1e4,0x190e2,0x1b1e2,0x121e8, // 420
- 0x190f6,0x163e8,0x121e4,0x163e4,0x121e2,0x163e2,0x121f6,0x163f6,0x1f614,0x1617e, // 430
- 0x1f612,0x1e414,0x1ec34,0x1e412,0x1ec32,0x1c834,0x1d874,0x1c832,0x1d872,0x19074, // 440
- 0x1b0f4,0x19072,0x1b0f2,0x120f4,0x161f4,0x120f2,0x161f2,0x1f60a,0x1e40a,0x1ec1a, // 450
- 0x1c81a,0x1d83a,0x1903a,0x1b07a,0x1e2a0,0x1f158,0x1f8ae,0x1e290,0x1f14c,0x1e288, // 460
- 0x1f146,0x1e284,0x1e282,0x1c5a0,0x1e2d8,0x1f16e,0x1c590,0x1e2cc,0x1c588,0x1e2c6, // 470
- 0x1c584,0x1c582,0x18ba0,0x1c5d8,0x1e2ee,0x18b90,0x1c5cc,0x18b88,0x1c5c6,0x18b84, // 480
- 0x18b82,0x117a0,0x18bd8,0x1c5ee,0x11790,0x18bcc,0x11788,0x18bc6,0x11784,0x11782, // 490
- 0x117d8,0x18bee,0x117cc,0x117c6,0x117ee,0x1f350,0x1f9ac,0x135f8,0x1f348,0x1f9a6, // 500
- 0x134fc,0x1f344,0x1347e,0x1f342,0x1e250,0x1f12c,0x1e6d0,0x1e248,0x1f126,0x1e6c8, // 510
- 0x1f366,0x1e6c4,0x1e242,0x1e6c2,0x1c4d0,0x1e26c,0x1cdd0,0x1c4c8,0x1e266,0x1cdc8, // 520
- 0x1e6e6,0x1cdc4,0x1c4c2,0x1cdc2,0x189d0,0x1c4ec,0x19bd0,0x189c8,0x1c4e6,0x19bc8, // 530
- 0x1cde6,0x19bc4,0x189c2,0x19bc2,0x113d0,0x189ec,0x137d0,0x113c8,0x189e6,0x137c8, // 540
- 0x19be6,0x137c4,0x113c2,0x137c2,0x113ec,0x137ec,0x113e6,0x137e6,0x1fba8,0x175f0, // 550
- 0x1bafc,0x1fba4,0x174f8,0x1ba7e,0x1fba2,0x1747c,0x1743e,0x1f328,0x1f996,0x132fc, // 560
- 0x1f768,0x1fbb6,0x176fc,0x1327e,0x1f764,0x1f322,0x1767e,0x1f762,0x1e228,0x1f116, // 570
- 0x1e668,0x1e224,0x1eee8,0x1f776,0x1e222,0x1eee4,0x1e662,0x1eee2,0x1c468,0x1e236, // 580
- 0x1cce8,0x1c464,0x1dde8,0x1cce4,0x1c462,0x1dde4,0x1cce2,0x1dde2,0x188e8,0x1c476, // 590
- 0x199e8,0x188e4,0x1bbe8,0x199e4,0x188e2,0x1bbe4,0x199e2,0x1bbe2,0x111e8,0x188f6, // 600
- 0x133e8,0x111e4,0x177e8,0x133e4,0x111e2,0x177e4,0x133e2,0x177e2,0x111f6,0x133f6, // 610
- 0x1fb94,0x172f8,0x1b97e,0x1fb92,0x1727c,0x1723e,0x1f314,0x1317e,0x1f734,0x1f312, // 620
- 0x1737e,0x1f732,0x1e214,0x1e634,0x1e212,0x1ee74,0x1e632,0x1ee72,0x1c434,0x1cc74, // 630
- 0x1c432,0x1dcf4,0x1cc72,0x1dcf2,0x18874,0x198f4,0x18872,0x1b9f4,0x198f2,0x1b9f2, // 640
- 0x110f4,0x131f4,0x110f2,0x173f4,0x131f2,0x173f2,0x1fb8a,0x1717c,0x1713e,0x1f30a, // 650
- 0x1f71a,0x1e20a,0x1e61a,0x1ee3a,0x1c41a,0x1cc3a,0x1dc7a,0x1883a,0x1987a,0x1b8fa, // 660
- 0x1107a,0x130fa,0x171fa,0x170be,0x1e150,0x1f0ac,0x1e148,0x1f0a6,0x1e144,0x1e142, // 670
- 0x1c2d0,0x1e16c,0x1c2c8,0x1e166,0x1c2c4,0x1c2c2,0x185d0,0x1c2ec,0x185c8,0x1c2e6, // 680
- 0x185c4,0x185c2,0x10bd0,0x185ec,0x10bc8,0x185e6,0x10bc4,0x10bc2,0x10bec,0x10be6, // 690
- 0x1f1a8,0x1f8d6,0x11afc,0x1f1a4,0x11a7e,0x1f1a2,0x1e128,0x1f096,0x1e368,0x1e124, // 700
- 0x1e364,0x1e122,0x1e362,0x1c268,0x1e136,0x1c6e8,0x1c264,0x1c6e4,0x1c262,0x1c6e2, // 710
- 0x184e8,0x1c276,0x18de8,0x184e4,0x18de4,0x184e2,0x18de2,0x109e8,0x184f6,0x11be8, // 720
- 0x109e4,0x11be4,0x109e2,0x11be2,0x109f6,0x11bf6,0x1f9d4,0x13af8,0x19d7e,0x1f9d2, // 730
- 0x13a7c,0x13a3e,0x1f194,0x1197e,0x1f3b4,0x1f192,0x13b7e,0x1f3b2,0x1e114,0x1e334, // 740
- 0x1e112,0x1e774,0x1e332,0x1e772,0x1c234,0x1c674,0x1c232,0x1cef4,0x1c672,0x1cef2, // 750
- 0x18474,0x18cf4,0x18472,0x19df4,0x18cf2,0x19df2,0x108f4,0x119f4,0x108f2,0x13bf4, // 760
- 0x119f2,0x13bf2,0x17af0,0x1bd7c,0x17a78,0x1bd3e,0x17a3c,0x17a1e,0x1f9ca,0x1397c, // 770
- 0x1fbda,0x17b7c,0x1393e,0x17b3e,0x1f18a,0x1f39a,0x1f7ba,0x1e10a,0x1e31a,0x1e73a, // 780
- 0x1ef7a,0x1c21a,0x1c63a,0x1ce7a,0x1defa,0x1843a,0x18c7a,0x19cfa,0x1bdfa,0x1087a, // 790
- 0x118fa,0x139fa,0x17978,0x1bcbe,0x1793c,0x1791e,0x138be,0x179be,0x178bc,0x1789e, // 800
- 0x1785e,0x1e0a8,0x1e0a4,0x1e0a2,0x1c168,0x1e0b6,0x1c164,0x1c162,0x182e8,0x1c176, // 810
- 0x182e4,0x182e2,0x105e8,0x182f6,0x105e4,0x105e2,0x105f6,0x1f0d4,0x10d7e,0x1f0d2, // 820
- 0x1e094,0x1e1b4,0x1e092,0x1e1b2,0x1c134,0x1c374,0x1c132,0x1c372,0x18274,0x186f4, // 830
- 0x18272,0x186f2,0x104f4,0x10df4,0x104f2,0x10df2,0x1f8ea,0x11d7c,0x11d3e,0x1f0ca, // 840
- 0x1f1da,0x1e08a,0x1e19a,0x1e3ba,0x1c11a,0x1c33a,0x1c77a,0x1823a,0x1867a,0x18efa, // 850
- 0x1047a,0x10cfa,0x11dfa,0x13d78,0x19ebe,0x13d3c,0x13d1e,0x11cbe,0x13dbe,0x17d70, // 860
- 0x1bebc,0x17d38,0x1be9e,0x17d1c,0x17d0e,0x13cbc,0x17dbc,0x13c9e,0x17d9e,0x17cb8, // 870
- 0x1be5e,0x17c9c,0x17c8e,0x13c5e,0x17cde,0x17c5c,0x17c4e,0x17c2e,0x1c0b4,0x1c0b2, // 880
- 0x18174,0x18172,0x102f4,0x102f2,0x1e0da,0x1c09a,0x1c1ba,0x1813a,0x1837a,0x1027a, // 890
- 0x106fa,0x10ebe,0x11ebc,0x11e9e,0x13eb8,0x19f5e,0x13e9c,0x13e8e,0x11e5e,0x13ede, // 900
- 0x17eb0,0x1bf5c,0x17e98,0x1bf4e,0x17e8c,0x17e86,0x13e5c,0x17edc,0x13e4e,0x17ece, // 910
- 0x17e58,0x1bf2e,0x17e4c,0x17e46,0x13e2e,0x17e6e,0x17e2c,0x17e26,0x10f5e,0x11f5c, // 920
- 0x11f4e,0x13f58,0x19fae,0x13f4c,0x13f46,0x11f2e,0x13f6e,0x13f2c,0x13f26), // 929
- array( // cluster 6 -----------------------------------------------------------------------
- 0x1abe0,0x1d5f8,0x153c0,0x1a9f0,0x1d4fc,0x151e0,0x1a8f8,0x1d47e,0x150f0,0x1a87c, // 10
- 0x15078,0x1fad0,0x15be0,0x1adf8,0x1fac8,0x159f0,0x1acfc,0x1fac4,0x158f8,0x1ac7e, // 20
- 0x1fac2,0x1587c,0x1f5d0,0x1faec,0x15df8,0x1f5c8,0x1fae6,0x15cfc,0x1f5c4,0x15c7e, // 30
- 0x1f5c2,0x1ebd0,0x1f5ec,0x1ebc8,0x1f5e6,0x1ebc4,0x1ebc2,0x1d7d0,0x1ebec,0x1d7c8, // 40
- 0x1ebe6,0x1d7c4,0x1d7c2,0x1afd0,0x1d7ec,0x1afc8,0x1d7e6,0x1afc4,0x14bc0,0x1a5f0, // 50
- 0x1d2fc,0x149e0,0x1a4f8,0x1d27e,0x148f0,0x1a47c,0x14878,0x1a43e,0x1483c,0x1fa68, // 60
- 0x14df0,0x1a6fc,0x1fa64,0x14cf8,0x1a67e,0x1fa62,0x14c7c,0x14c3e,0x1f4e8,0x1fa76, // 70
- 0x14efc,0x1f4e4,0x14e7e,0x1f4e2,0x1e9e8,0x1f4f6,0x1e9e4,0x1e9e2,0x1d3e8,0x1e9f6, // 80
- 0x1d3e4,0x1d3e2,0x1a7e8,0x1d3f6,0x1a7e4,0x1a7e2,0x145e0,0x1a2f8,0x1d17e,0x144f0, // 90
- 0x1a27c,0x14478,0x1a23e,0x1443c,0x1441e,0x1fa34,0x146f8,0x1a37e,0x1fa32,0x1467c, // 100
- 0x1463e,0x1f474,0x1477e,0x1f472,0x1e8f4,0x1e8f2,0x1d1f4,0x1d1f2,0x1a3f4,0x1a3f2, // 110
- 0x142f0,0x1a17c,0x14278,0x1a13e,0x1423c,0x1421e,0x1fa1a,0x1437c,0x1433e,0x1f43a, // 120
- 0x1e87a,0x1d0fa,0x14178,0x1a0be,0x1413c,0x1411e,0x141be,0x140bc,0x1409e,0x12bc0, // 130
- 0x195f0,0x1cafc,0x129e0,0x194f8,0x1ca7e,0x128f0,0x1947c,0x12878,0x1943e,0x1283c, // 140
- 0x1f968,0x12df0,0x196fc,0x1f964,0x12cf8,0x1967e,0x1f962,0x12c7c,0x12c3e,0x1f2e8, // 150
- 0x1f976,0x12efc,0x1f2e4,0x12e7e,0x1f2e2,0x1e5e8,0x1f2f6,0x1e5e4,0x1e5e2,0x1cbe8, // 160
- 0x1e5f6,0x1cbe4,0x1cbe2,0x197e8,0x1cbf6,0x197e4,0x197e2,0x1b5e0,0x1daf8,0x1ed7e, // 170
- 0x169c0,0x1b4f0,0x1da7c,0x168e0,0x1b478,0x1da3e,0x16870,0x1b43c,0x16838,0x1b41e, // 180
- 0x1681c,0x125e0,0x192f8,0x1c97e,0x16de0,0x124f0,0x1927c,0x16cf0,0x1b67c,0x1923e, // 190
- 0x16c78,0x1243c,0x16c3c,0x1241e,0x16c1e,0x1f934,0x126f8,0x1937e,0x1fb74,0x1f932, // 200
- 0x16ef8,0x1267c,0x1fb72,0x16e7c,0x1263e,0x16e3e,0x1f274,0x1277e,0x1f6f4,0x1f272, // 210
- 0x16f7e,0x1f6f2,0x1e4f4,0x1edf4,0x1e4f2,0x1edf2,0x1c9f4,0x1dbf4,0x1c9f2,0x1dbf2, // 220
- 0x193f4,0x193f2,0x165c0,0x1b2f0,0x1d97c,0x164e0,0x1b278,0x1d93e,0x16470,0x1b23c, // 230
- 0x16438,0x1b21e,0x1641c,0x1640e,0x122f0,0x1917c,0x166f0,0x12278,0x1913e,0x16678, // 240
- 0x1b33e,0x1663c,0x1221e,0x1661e,0x1f91a,0x1237c,0x1fb3a,0x1677c,0x1233e,0x1673e, // 250
- 0x1f23a,0x1f67a,0x1e47a,0x1ecfa,0x1c8fa,0x1d9fa,0x191fa,0x162e0,0x1b178,0x1d8be, // 260
- 0x16270,0x1b13c,0x16238,0x1b11e,0x1621c,0x1620e,0x12178,0x190be,0x16378,0x1213c, // 270
- 0x1633c,0x1211e,0x1631e,0x121be,0x163be,0x16170,0x1b0bc,0x16138,0x1b09e,0x1611c, // 280
- 0x1610e,0x120bc,0x161bc,0x1209e,0x1619e,0x160b8,0x1b05e,0x1609c,0x1608e,0x1205e, // 290
- 0x160de,0x1605c,0x1604e,0x115e0,0x18af8,0x1c57e,0x114f0,0x18a7c,0x11478,0x18a3e, // 300
- 0x1143c,0x1141e,0x1f8b4,0x116f8,0x18b7e,0x1f8b2,0x1167c,0x1163e,0x1f174,0x1177e, // 310
- 0x1f172,0x1e2f4,0x1e2f2,0x1c5f4,0x1c5f2,0x18bf4,0x18bf2,0x135c0,0x19af0,0x1cd7c, // 320
- 0x134e0,0x19a78,0x1cd3e,0x13470,0x19a3c,0x13438,0x19a1e,0x1341c,0x1340e,0x112f0, // 330
- 0x1897c,0x136f0,0x11278,0x1893e,0x13678,0x19b3e,0x1363c,0x1121e,0x1361e,0x1f89a, // 340
- 0x1137c,0x1f9ba,0x1377c,0x1133e,0x1373e,0x1f13a,0x1f37a,0x1e27a,0x1e6fa,0x1c4fa, // 350
- 0x1cdfa,0x189fa,0x1bae0,0x1dd78,0x1eebe,0x174c0,0x1ba70,0x1dd3c,0x17460,0x1ba38, // 360
- 0x1dd1e,0x17430,0x1ba1c,0x17418,0x1ba0e,0x1740c,0x132e0,0x19978,0x1ccbe,0x176e0, // 370
- 0x13270,0x1993c,0x17670,0x1bb3c,0x1991e,0x17638,0x1321c,0x1761c,0x1320e,0x1760e, // 380
- 0x11178,0x188be,0x13378,0x1113c,0x17778,0x1333c,0x1111e,0x1773c,0x1331e,0x1771e, // 390
- 0x111be,0x133be,0x177be,0x172c0,0x1b970,0x1dcbc,0x17260,0x1b938,0x1dc9e,0x17230, // 400
- 0x1b91c,0x17218,0x1b90e,0x1720c,0x17206,0x13170,0x198bc,0x17370,0x13138,0x1989e, // 410
- 0x17338,0x1b99e,0x1731c,0x1310e,0x1730e,0x110bc,0x131bc,0x1109e,0x173bc,0x1319e, // 420
- 0x1739e,0x17160,0x1b8b8,0x1dc5e,0x17130,0x1b89c,0x17118,0x1b88e,0x1710c,0x17106, // 430
- 0x130b8,0x1985e,0x171b8,0x1309c,0x1719c,0x1308e,0x1718e,0x1105e,0x130de,0x171de, // 440
- 0x170b0,0x1b85c,0x17098,0x1b84e,0x1708c,0x17086,0x1305c,0x170dc,0x1304e,0x170ce, // 450
- 0x17058,0x1b82e,0x1704c,0x17046,0x1302e,0x1706e,0x1702c,0x17026,0x10af0,0x1857c, // 460
- 0x10a78,0x1853e,0x10a3c,0x10a1e,0x10b7c,0x10b3e,0x1f0ba,0x1e17a,0x1c2fa,0x185fa, // 470
- 0x11ae0,0x18d78,0x1c6be,0x11a70,0x18d3c,0x11a38,0x18d1e,0x11a1c,0x11a0e,0x10978, // 480
- 0x184be,0x11b78,0x1093c,0x11b3c,0x1091e,0x11b1e,0x109be,0x11bbe,0x13ac0,0x19d70, // 490
- 0x1cebc,0x13a60,0x19d38,0x1ce9e,0x13a30,0x19d1c,0x13a18,0x19d0e,0x13a0c,0x13a06, // 500
- 0x11970,0x18cbc,0x13b70,0x11938,0x18c9e,0x13b38,0x1191c,0x13b1c,0x1190e,0x13b0e, // 510
- 0x108bc,0x119bc,0x1089e,0x13bbc,0x1199e,0x13b9e,0x1bd60,0x1deb8,0x1ef5e,0x17a40, // 520
- 0x1bd30,0x1de9c,0x17a20,0x1bd18,0x1de8e,0x17a10,0x1bd0c,0x17a08,0x1bd06,0x17a04, // 530
- 0x13960,0x19cb8,0x1ce5e,0x17b60,0x13930,0x19c9c,0x17b30,0x1bd9c,0x19c8e,0x17b18, // 540
- 0x1390c,0x17b0c,0x13906,0x17b06,0x118b8,0x18c5e,0x139b8,0x1189c,0x17bb8,0x1399c, // 550
- 0x1188e,0x17b9c,0x1398e,0x17b8e,0x1085e,0x118de,0x139de,0x17bde,0x17940,0x1bcb0, // 560
- 0x1de5c,0x17920,0x1bc98,0x1de4e,0x17910,0x1bc8c,0x17908,0x1bc86,0x17904,0x17902, // 570
- 0x138b0,0x19c5c,0x179b0,0x13898,0x19c4e,0x17998,0x1bcce,0x1798c,0x13886,0x17986, // 580
- 0x1185c,0x138dc,0x1184e,0x179dc,0x138ce,0x179ce,0x178a0,0x1bc58,0x1de2e,0x17890, // 590
- 0x1bc4c,0x17888,0x1bc46,0x17884,0x17882,0x13858,0x19c2e,0x178d8,0x1384c,0x178cc, // 600
- 0x13846,0x178c6,0x1182e,0x1386e,0x178ee,0x17850,0x1bc2c,0x17848,0x1bc26,0x17844, // 610
- 0x17842,0x1382c,0x1786c,0x13826,0x17866,0x17828,0x1bc16,0x17824,0x17822,0x13816, // 620
- 0x17836,0x10578,0x182be,0x1053c,0x1051e,0x105be,0x10d70,0x186bc,0x10d38,0x1869e, // 630
- 0x10d1c,0x10d0e,0x104bc,0x10dbc,0x1049e,0x10d9e,0x11d60,0x18eb8,0x1c75e,0x11d30, // 640
- 0x18e9c,0x11d18,0x18e8e,0x11d0c,0x11d06,0x10cb8,0x1865e,0x11db8,0x10c9c,0x11d9c, // 650
- 0x10c8e,0x11d8e,0x1045e,0x10cde,0x11dde,0x13d40,0x19eb0,0x1cf5c,0x13d20,0x19e98, // 660
- 0x1cf4e,0x13d10,0x19e8c,0x13d08,0x19e86,0x13d04,0x13d02,0x11cb0,0x18e5c,0x13db0, // 670
- 0x11c98,0x18e4e,0x13d98,0x19ece,0x13d8c,0x11c86,0x13d86,0x10c5c,0x11cdc,0x10c4e, // 680
- 0x13ddc,0x11cce,0x13dce,0x1bea0,0x1df58,0x1efae,0x1be90,0x1df4c,0x1be88,0x1df46, // 690
- 0x1be84,0x1be82,0x13ca0,0x19e58,0x1cf2e,0x17da0,0x13c90,0x19e4c,0x17d90,0x1becc, // 700
- 0x19e46,0x17d88,0x13c84,0x17d84,0x13c82,0x17d82,0x11c58,0x18e2e,0x13cd8,0x11c4c, // 710
- 0x17dd8,0x13ccc,0x11c46,0x17dcc,0x13cc6,0x17dc6,0x10c2e,0x11c6e,0x13cee,0x17dee, // 720
- 0x1be50,0x1df2c,0x1be48,0x1df26,0x1be44,0x1be42,0x13c50,0x19e2c,0x17cd0,0x13c48, // 730
- 0x19e26,0x17cc8,0x1be66,0x17cc4,0x13c42,0x17cc2,0x11c2c,0x13c6c,0x11c26,0x17cec, // 740
- 0x13c66,0x17ce6,0x1be28,0x1df16,0x1be24,0x1be22,0x13c28,0x19e16,0x17c68,0x13c24, // 750
- 0x17c64,0x13c22,0x17c62,0x11c16,0x13c36,0x17c76,0x1be14,0x1be12,0x13c14,0x17c34, // 760
- 0x13c12,0x17c32,0x102bc,0x1029e,0x106b8,0x1835e,0x1069c,0x1068e,0x1025e,0x106de, // 770
- 0x10eb0,0x1875c,0x10e98,0x1874e,0x10e8c,0x10e86,0x1065c,0x10edc,0x1064e,0x10ece, // 780
- 0x11ea0,0x18f58,0x1c7ae,0x11e90,0x18f4c,0x11e88,0x18f46,0x11e84,0x11e82,0x10e58, // 790
- 0x1872e,0x11ed8,0x18f6e,0x11ecc,0x10e46,0x11ec6,0x1062e,0x10e6e,0x11eee,0x19f50, // 800
- 0x1cfac,0x19f48,0x1cfa6,0x19f44,0x19f42,0x11e50,0x18f2c,0x13ed0,0x19f6c,0x18f26, // 810
- 0x13ec8,0x11e44,0x13ec4,0x11e42,0x13ec2,0x10e2c,0x11e6c,0x10e26,0x13eec,0x11e66, // 820
- 0x13ee6,0x1dfa8,0x1efd6,0x1dfa4,0x1dfa2,0x19f28,0x1cf96,0x1bf68,0x19f24,0x1bf64, // 830
- 0x19f22,0x1bf62,0x11e28,0x18f16,0x13e68,0x11e24,0x17ee8,0x13e64,0x11e22,0x17ee4, // 840
- 0x13e62,0x17ee2,0x10e16,0x11e36,0x13e76,0x17ef6,0x1df94,0x1df92,0x19f14,0x1bf34, // 850
- 0x19f12,0x1bf32,0x11e14,0x13e34,0x11e12,0x17e74,0x13e32,0x17e72,0x1df8a,0x19f0a, // 860
- 0x1bf1a,0x11e0a,0x13e1a,0x17e3a,0x1035c,0x1034e,0x10758,0x183ae,0x1074c,0x10746, // 870
- 0x1032e,0x1076e,0x10f50,0x187ac,0x10f48,0x187a6,0x10f44,0x10f42,0x1072c,0x10f6c, // 880
- 0x10726,0x10f66,0x18fa8,0x1c7d6,0x18fa4,0x18fa2,0x10f28,0x18796,0x11f68,0x18fb6, // 890
- 0x11f64,0x10f22,0x11f62,0x10716,0x10f36,0x11f76,0x1cfd4,0x1cfd2,0x18f94,0x19fb4, // 900
- 0x18f92,0x19fb2,0x10f14,0x11f34,0x10f12,0x13f74,0x11f32,0x13f72,0x1cfca,0x18f8a, // 910
- 0x19f9a,0x10f0a,0x11f1a,0x13f3a,0x103ac,0x103a6,0x107a8,0x183d6,0x107a4,0x107a2, // 920
- 0x10396,0x107b6,0x187d4,0x187d2,0x10794,0x10fb4,0x10792,0x10fb2,0x1c7ea) // 929
- ); // end of $clusters array
-
- /**
- * Array of factors of the Reed-Solomon polynomial equations used for error correction; one sub array for each correction level (0-8).
- * @protected
- */
- protected $rsfactors = array(
- array( // ECL 0 (2 factors) -------------------------------------------------------------------------------
- 0x01b,0x395), // 2
- array( // ECL 1 (4 factors) -------------------------------------------------------------------------------
- 0x20a,0x238,0x2d3,0x329), // 4
- array( // ECL 2 (8 factors) -------------------------------------------------------------------------------
- 0x0ed,0x134,0x1b4,0x11c,0x286,0x28d,0x1ac,0x17b), // 8
- array( // ECL 3 (16 factors) ------------------------------------------------------------------------------
- 0x112,0x232,0x0e8,0x2f3,0x257,0x20c,0x321,0x084,0x127,0x074,0x1ba,0x1ac,0x127,0x02a,0x0b0,0x041),// 16
- array( // ECL 4 (32 factors) ------------------------------------------------------------------------------
- 0x169,0x23f,0x39a,0x20d,0x0b0,0x24a,0x280,0x141,0x218,0x2e6,0x2a5,0x2e6,0x2af,0x11c,0x0c1,0x205, // 16
- 0x111,0x1ee,0x107,0x093,0x251,0x320,0x23b,0x140,0x323,0x085,0x0e7,0x186,0x2ad,0x14a,0x03f,0x19a),// 32
- array( // ECL 5 (64 factors) ------------------------------------------------------------------------------
- 0x21b,0x1a6,0x006,0x05d,0x35e,0x303,0x1c5,0x06a,0x262,0x11f,0x06b,0x1f9,0x2dd,0x36d,0x17d,0x264, // 16
- 0x2d3,0x1dc,0x1ce,0x0ac,0x1ae,0x261,0x35a,0x336,0x21f,0x178,0x1ff,0x190,0x2a0,0x2fa,0x11b,0x0b8, // 32
- 0x1b8,0x023,0x207,0x01f,0x1cc,0x252,0x0e1,0x217,0x205,0x160,0x25d,0x09e,0x28b,0x0c9,0x1e8,0x1f6, // 48
- 0x288,0x2dd,0x2cd,0x053,0x194,0x061,0x118,0x303,0x348,0x275,0x004,0x17d,0x34b,0x26f,0x108,0x21f),// 64
- array( // ECL 6 (128 factors) -----------------------------------------------------------------------------
- 0x209,0x136,0x360,0x223,0x35a,0x244,0x128,0x17b,0x035,0x30b,0x381,0x1bc,0x190,0x39d,0x2ed,0x19f, // 16
- 0x336,0x05d,0x0d9,0x0d0,0x3a0,0x0f4,0x247,0x26c,0x0f6,0x094,0x1bf,0x277,0x124,0x38c,0x1ea,0x2c0, // 32
- 0x204,0x102,0x1c9,0x38b,0x252,0x2d3,0x2a2,0x124,0x110,0x060,0x2ac,0x1b0,0x2ae,0x25e,0x35c,0x239, // 48
- 0x0c1,0x0db,0x081,0x0ba,0x0ec,0x11f,0x0c0,0x307,0x116,0x0ad,0x028,0x17b,0x2c8,0x1cf,0x286,0x308, // 64
- 0x0ab,0x1eb,0x129,0x2fb,0x09c,0x2dc,0x05f,0x10e,0x1bf,0x05a,0x1fb,0x030,0x0e4,0x335,0x328,0x382, // 80
- 0x310,0x297,0x273,0x17a,0x17e,0x106,0x17c,0x25a,0x2f2,0x150,0x059,0x266,0x057,0x1b0,0x29e,0x268, // 96
- 0x09d,0x176,0x0f2,0x2d6,0x258,0x10d,0x177,0x382,0x34d,0x1c6,0x162,0x082,0x32e,0x24b,0x324,0x022, // 112
- 0x0d3,0x14a,0x21b,0x129,0x33b,0x361,0x025,0x205,0x342,0x13b,0x226,0x056,0x321,0x004,0x06c,0x21b),// 128
- array( // ECL 7 (256 factors) -----------------------------------------------------------------------------
- 0x20c,0x37e,0x04b,0x2fe,0x372,0x359,0x04a,0x0cc,0x052,0x24a,0x2c4,0x0fa,0x389,0x312,0x08a,0x2d0, // 16
- 0x35a,0x0c2,0x137,0x391,0x113,0x0be,0x177,0x352,0x1b6,0x2dd,0x0c2,0x118,0x0c9,0x118,0x33c,0x2f5, // 32
- 0x2c6,0x32e,0x397,0x059,0x044,0x239,0x00b,0x0cc,0x31c,0x25d,0x21c,0x391,0x321,0x2bc,0x31f,0x089, // 48
- 0x1b7,0x1a2,0x250,0x29c,0x161,0x35b,0x172,0x2b6,0x145,0x0f0,0x0d8,0x101,0x11c,0x225,0x0d1,0x374, // 64
- 0x13b,0x046,0x149,0x319,0x1ea,0x112,0x36d,0x0a2,0x2ed,0x32c,0x2ac,0x1cd,0x14e,0x178,0x351,0x209, // 80
- 0x133,0x123,0x323,0x2c8,0x013,0x166,0x18f,0x38c,0x067,0x1ff,0x033,0x008,0x205,0x0e1,0x121,0x1d6, // 96
- 0x27d,0x2db,0x042,0x0ff,0x395,0x10d,0x1cf,0x33e,0x2da,0x1b1,0x350,0x249,0x088,0x21a,0x38a,0x05a, // 112
- 0x002,0x122,0x2e7,0x0c7,0x28f,0x387,0x149,0x031,0x322,0x244,0x163,0x24c,0x0bc,0x1ce,0x00a,0x086, // 128
- 0x274,0x140,0x1df,0x082,0x2e3,0x047,0x107,0x13e,0x176,0x259,0x0c0,0x25d,0x08e,0x2a1,0x2af,0x0ea, // 144
- 0x2d2,0x180,0x0b1,0x2f0,0x25f,0x280,0x1c7,0x0c1,0x2b1,0x2c3,0x325,0x281,0x030,0x03c,0x2dc,0x26d, // 160
- 0x37f,0x220,0x105,0x354,0x28f,0x135,0x2b9,0x2f3,0x2f4,0x03c,0x0e7,0x305,0x1b2,0x1a5,0x2d6,0x210, // 176
- 0x1f7,0x076,0x031,0x31b,0x020,0x090,0x1f4,0x0ee,0x344,0x18a,0x118,0x236,0x13f,0x009,0x287,0x226, // 192
- 0x049,0x392,0x156,0x07e,0x020,0x2a9,0x14b,0x318,0x26c,0x03c,0x261,0x1b9,0x0b4,0x317,0x37d,0x2f2, // 208
- 0x25d,0x17f,0x0e4,0x2ed,0x2f8,0x0d5,0x036,0x129,0x086,0x036,0x342,0x12b,0x39a,0x0bf,0x38e,0x214, // 224
- 0x261,0x33d,0x0bd,0x014,0x0a7,0x01d,0x368,0x1c1,0x053,0x192,0x029,0x290,0x1f9,0x243,0x1e1,0x0ad, // 240
- 0x194,0x0fb,0x2b0,0x05f,0x1f1,0x22b,0x282,0x21f,0x133,0x09f,0x39c,0x22e,0x288,0x037,0x1f1,0x00a),// 256
- array( // ECL 8 (512 factors) -----------------------------------------------------------------------------
- 0x160,0x04d,0x175,0x1f8,0x023,0x257,0x1ac,0x0cf,0x199,0x23e,0x076,0x1f2,0x11d,0x17c,0x15e,0x1ec, // 16
- 0x0c5,0x109,0x398,0x09b,0x392,0x12b,0x0e5,0x283,0x126,0x367,0x132,0x058,0x057,0x0c1,0x160,0x30d, // 32
- 0x34e,0x04b,0x147,0x208,0x1b3,0x21f,0x0cb,0x29a,0x0f9,0x15a,0x30d,0x26d,0x280,0x10c,0x31a,0x216, // 48
- 0x21b,0x30d,0x198,0x186,0x284,0x066,0x1dc,0x1f3,0x122,0x278,0x221,0x025,0x35a,0x394,0x228,0x029, // 64
- 0x21e,0x121,0x07a,0x110,0x17f,0x320,0x1e5,0x062,0x2f0,0x1d8,0x2f9,0x06b,0x310,0x35c,0x292,0x2e5, // 80
- 0x122,0x0cc,0x2a9,0x197,0x357,0x055,0x063,0x03e,0x1e2,0x0b4,0x014,0x129,0x1c3,0x251,0x391,0x08e, // 96
- 0x328,0x2ac,0x11f,0x218,0x231,0x04c,0x28d,0x383,0x2d9,0x237,0x2e8,0x186,0x201,0x0c0,0x204,0x102, // 112
- 0x0f0,0x206,0x31a,0x18b,0x300,0x350,0x033,0x262,0x180,0x0a8,0x0be,0x33a,0x148,0x254,0x312,0x12f, // 128
- 0x23a,0x17d,0x19f,0x281,0x09c,0x0ed,0x097,0x1ad,0x213,0x0cf,0x2a4,0x2c6,0x059,0x0a8,0x130,0x192, // 144
- 0x028,0x2c4,0x23f,0x0a2,0x360,0x0e5,0x041,0x35d,0x349,0x200,0x0a4,0x1dd,0x0dd,0x05c,0x166,0x311, // 160
- 0x120,0x165,0x352,0x344,0x33b,0x2e0,0x2c3,0x05e,0x008,0x1ee,0x072,0x209,0x002,0x1f3,0x353,0x21f, // 176
- 0x098,0x2d9,0x303,0x05f,0x0f8,0x169,0x242,0x143,0x358,0x31d,0x121,0x033,0x2ac,0x1d2,0x215,0x334, // 192
- 0x29d,0x02d,0x386,0x1c4,0x0a7,0x156,0x0f4,0x0ad,0x023,0x1cf,0x28b,0x033,0x2bb,0x24f,0x1c4,0x242, // 208
- 0x025,0x07c,0x12a,0x14c,0x228,0x02b,0x1ab,0x077,0x296,0x309,0x1db,0x352,0x2fc,0x16c,0x242,0x38f, // 224
- 0x11b,0x2c7,0x1d8,0x1a4,0x0f5,0x120,0x252,0x18a,0x1ff,0x147,0x24d,0x309,0x2bb,0x2b0,0x02b,0x198, // 240
- 0x34a,0x17f,0x2d1,0x209,0x230,0x284,0x2ca,0x22f,0x03e,0x091,0x369,0x297,0x2c9,0x09f,0x2a0,0x2d9, // 256
- 0x270,0x03b,0x0c1,0x1a1,0x09e,0x0d1,0x233,0x234,0x157,0x2b5,0x06d,0x260,0x233,0x16d,0x0b5,0x304, // 272
- 0x2a5,0x136,0x0f8,0x161,0x2c4,0x19a,0x243,0x366,0x269,0x349,0x278,0x35c,0x121,0x218,0x023,0x309, // 288
- 0x26a,0x24a,0x1a8,0x341,0x04d,0x255,0x15a,0x10d,0x2f5,0x278,0x2b7,0x2ef,0x14b,0x0f7,0x0b8,0x02d, // 304
- 0x313,0x2a8,0x012,0x042,0x197,0x171,0x036,0x1ec,0x0e4,0x265,0x33e,0x39a,0x1b5,0x207,0x284,0x389, // 320
- 0x315,0x1a4,0x131,0x1b9,0x0cf,0x12c,0x37c,0x33b,0x08d,0x219,0x17d,0x296,0x201,0x038,0x0fc,0x155, // 336
- 0x0f2,0x31d,0x346,0x345,0x2d0,0x0e0,0x133,0x277,0x03d,0x057,0x230,0x136,0x2f4,0x299,0x18d,0x328, // 352
- 0x353,0x135,0x1d9,0x31b,0x17a,0x01f,0x287,0x393,0x1cb,0x326,0x24e,0x2db,0x1a9,0x0d8,0x224,0x0f9, // 368
- 0x141,0x371,0x2bb,0x217,0x2a1,0x30e,0x0d2,0x32f,0x389,0x12f,0x34b,0x39a,0x119,0x049,0x1d5,0x317, // 384
- 0x294,0x0a2,0x1f2,0x134,0x09b,0x1a6,0x38b,0x331,0x0bb,0x03e,0x010,0x1a9,0x217,0x150,0x11e,0x1b5, // 400
- 0x177,0x111,0x262,0x128,0x0b7,0x39b,0x074,0x29b,0x2ef,0x161,0x03e,0x16e,0x2b3,0x17b,0x2af,0x34a, // 416
- 0x025,0x165,0x2d0,0x2e6,0x14a,0x005,0x027,0x39b,0x137,0x1a8,0x0f2,0x2ed,0x141,0x036,0x29d,0x13c, // 432
- 0x156,0x12b,0x216,0x069,0x29b,0x1e8,0x280,0x2a0,0x240,0x21c,0x13c,0x1e6,0x2d1,0x262,0x02e,0x290, // 448
- 0x1bf,0x0ab,0x268,0x1d0,0x0be,0x213,0x129,0x141,0x2fa,0x2f0,0x215,0x0af,0x086,0x00e,0x17d,0x1b1, // 464
- 0x2cd,0x02d,0x06f,0x014,0x254,0x11c,0x2e0,0x08a,0x286,0x19b,0x36d,0x29d,0x08d,0x397,0x02d,0x30c, // 480
- 0x197,0x0a4,0x14c,0x383,0x0a5,0x2d6,0x258,0x145,0x1f2,0x28f,0x165,0x2f0,0x300,0x0df,0x351,0x287, // 496
- 0x03f,0x136,0x35f,0x0fb,0x16e,0x130,0x11a,0x2e2,0x2a3,0x19a,0x185,0x0f4,0x01f,0x079,0x12f,0x107) // 512
- );
-
- /**
- * This is the class constructor.
- * Creates a PDF417 object
- * @param $code (string) code to represent using PDF417
- * @param $ecl (int) error correction level (0-8); default -1 = automatic correction level
- * @param $aspectratio (float) the width to height of the symbol (excluding quiet zones)
- * @param $macro (array) information for macro block
- * @public
- */
- public function __construct($code, $ecl=-1, $aspectratio=2, $macro=array()) {
- $barcode_array = array();
- if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
- return false;
- }
- // get the input sequence array
- $sequence = $this->getInputSequences($code);
- $codewords = array(); // array of code-words
- foreach($sequence as $seq) {
- $cw = $this->getCompaction($seq[0], $seq[1], true);
- $codewords = array_merge($codewords, $cw);
- }
- if ($codewords[0] == 900) {
- // Text Alpha is the default mode, so remove the first code
- array_shift($codewords);
- }
- // count number of codewords
- $numcw = count($codewords);
- if ($numcw > 925) {
- // reached maximum data codeword capacity
- return false;
- }
- // build macro control block codewords
- if (!empty($macro)) {
- $macrocw = array();
- // beginning of macro control block
- $macrocw[] = 928;
- // segment index
- $cw = $this->getCompaction(902, sprintf('%05d', $macro['segment_index']), false);
- $macrocw = array_merge($macrocw, $cw);
- // file ID
- $cw = $this->getCompaction(900, $macro['file_id'], false);
- $macrocw = array_merge($macrocw, $cw);
- // optional fields
- $optmodes = array(900,902,902,900,900,902,902);
- $optsize = array(-1,2,4,-1,-1,-1,2);
- foreach ($optmodes as $k => $omode) {
- if (isset($macro['option_'.$k])) {
- $macrocw[] = 923;
- $macrocw[] = $k;
- if ($optsize[$k] == 2) {
- $macro['option_'.$k] = sprintf('%05d', $macro['option_'.$k]);
- } elseif ($optsize[$k] == 4) {
- $macro['option_'.$k] = sprintf('%010d', $macro['option_'.$k]);
- }
- $cw = $this->getCompaction($omode, $macro['option_'.$k], false);
- $macrocw = array_merge($macrocw, $cw);
- }
- }
- if ($macro['segment_index'] == ($macro['segment_total'] - 1)) {
- // end of control block
- $macrocw[] = 922;
- }
- // update total codewords
- $numcw += count($macrocw);
- }
- // set error correction level
- $ecl = $this->getErrorCorrectionLevel($ecl, $numcw);
- // number of codewords for error correction
- $errsize = (2 << $ecl);
- // calculate number of columns (number of codewords per row) and rows
- $nce = ($numcw + $errsize + 1);
- $cols = round((sqrt(4761 + (68 * $aspectratio * ROWHEIGHT * $nce)) - 69) / 34);
- // adjust cols
- if ($cols < 1) {
- $cols = 1;
- } elseif ($cols > 30) {
- $cols = 30;
- }
- $rows = ceil($nce / $cols);
- $size = ($cols * $rows);
- // adjust rows
- if (($rows < 3) OR ($rows > 90)) {
- if ($rows < 3) {
- $rows = 3;
- } elseif ($rows > 90) {
- $rows = 90;
- }
- $cols = ceil($size / $rows);
- $size = ($cols * $rows);
- }
- if ($size > 928) {
- // set dimensions to get maximum capacity
- if (abs($aspectratio - (17 * 29 / 32)) < abs($aspectratio - (17 * 16 / 58))) {
- $cols = 29;
- $rows = 32;
- } else {
- $cols = 16;
- $rows = 58;
- }
- $size = 928;
- }
- // calculate padding
- $pad = ($size - $nce);
- if ($pad > 0) {
- if (($size - $rows) == $nce) {
- --$rows;
- $size -= $rows;
- } else {
- // add pading
- $codewords = array_merge($codewords, array_fill(0, $pad, 900));
- }
- }
- if (!empty($macro)) {
- // add macro section
- $codewords = array_merge($codewords, $macrocw);
- }
- // Symbol Lenght Descriptor (number of data codewords including Symbol Lenght Descriptor and pad codewords)
- $sld = $size - $errsize;
- // add symbol length description
- array_unshift($codewords, $sld);
- // calculate error correction
- $ecw = $this->getErrorCorrection($codewords, $ecl);
- // add error correction codewords
- $codewords = array_merge($codewords, $ecw);
- // add horizontal quiet zones to start and stop patterns
- $pstart = str_repeat('0', QUIETH).$this->start_pattern;
- $pstop = $this->stop_pattern.str_repeat('0', QUIETH);
- $barcode_array['num_rows'] = ($rows * ROWHEIGHT) + (2 * QUIETV);
- $barcode_array['num_cols'] = (($cols + 2) * 17) + 35 + (2 * QUIETH);
- $barcode_array['bcode'] = array();
- // build rows for vertical quiet zone
- if (QUIETV > 0) {
- $empty_row = array_fill(0, $barcode_array['num_cols'], 0);
- for ($i = 0; $i < QUIETV; ++$i) {
- // add vertical quiet rows
- $barcode_array['bcode'][] = $empty_row;
- }
- }
- $k = 0; // codeword index
- $cid = 0; // initial cluster
- // for each row
- for ($r = 0; $r < $rows; ++$r) {
- // row start code
- $row = $pstart;
- switch ($cid) {
- case 0: {
- $L = ((30 * intval($r / 3)) + intval(($rows - 1) / 3));
- break;
- }
- case 1: {
- $L = ((30 * intval($r / 3)) + ($ecl * 3) + (($rows - 1) % 3));
- break;
- }
- case 2: {
- $L = ((30 * intval($r / 3)) + ($cols - 1));
- break;
- }
- }
- // left row indicator
- $row .= sprintf('%17b', $this->clusters[$cid][$L]);
- // for each column
- for ($c = 0; $c < $cols; ++$c) {
- $row .= sprintf('%17b', $this->clusters[$cid][$codewords[$k]]);
- ++$k;
- }
- switch ($cid) {
- case 0: {
- $L = ((30 * intval($r / 3)) + ($cols - 1));
- break;
- }
- case 1: {
- $L = ((30 * intval($r / 3)) + intval(($rows - 1) / 3));
- break;
- }
- case 2: {
- $L = ((30 * intval($r / 3)) + ($ecl * 3) + (($rows - 1) % 3));
- break;
- }
- }
- // right row indicator
- $row .= sprintf('%17b', $this->clusters[$cid][$L]);
- // row stop code
- $row .= $pstop;
- // convert the string to array
- $arow = preg_split('//', $row, -1, PREG_SPLIT_NO_EMPTY);
- // duplicate row to get the desired height
- for ($h = 0; $h < ROWHEIGHT; ++$h) {
- $barcode_array['bcode'][] = $arow;
- }
- ++$cid;
- if ($cid > 2) {
- $cid = 0;
- }
- }
- if (QUIETV > 0) {
- for ($i = 0; $i < QUIETV; ++$i) {
- // add vertical quiet rows
- $barcode_array['bcode'][] = $empty_row;
- }
- }
- $this->barcode_array = $barcode_array;
- }
-
- /**
- * Returns a barcode array which is readable by TCPDF
- * @return array barcode array readable by TCPDF;
- * @public
- */
- public function getBarcodeArray() {
- return $this->barcode_array;
- }
-
- /**
- * Returns the error correction level (0-8) to be used
- * @param $ecl (int) error correction level
- * @param $numcw (int) number of data codewords
- * @return int error correction level
- * @protected
- */
- protected function getErrorCorrectionLevel($ecl, $numcw) {
- // get maximum correction level
- $maxecl = 8; // starting error level
- $maxerrsize = (928 - $numcw); // available codewords for error
- while ($maxecl > 0) {
- $errsize = (2 << $ecl);
- if ($maxerrsize >= $errsize) {
- break;
- }
- --$maxecl;
- }
- // check for automatic levels
- if (($ecl < 0) OR ($ecl > 8)) {
- if ($numcw < 41) {
- $ecl = 2;
- } elseif ($numcw < 161) {
- $ecl = 3;
- } elseif ($numcw < 321) {
- $ecl = 4;
- } elseif ($numcw < 864) {
- $ecl = 5;
- } else {
- $ecl = $maxecl;
- }
- }
- if ($ecl > $maxecl) {
- $ecl = $maxecl;
- }
- return $ecl;
- }
-
- /**
- * Returns the error correction codewords
- * @param $cw (array) array of codewords including Symbol Lenght Descriptor and pad
- * @param $ecl (int) error correction level 0-8
- * @return array of error correction codewords
- * @protected
- */
- protected function getErrorCorrection($cw, $ecl) {
- // get error correction coefficients
- $ecc = $this->rsfactors[$ecl];
- // number of error correction factors
- $eclsize = (2 << $ecl);
- // maximum index for $rsfactors[$ecl]
- $eclmaxid = ($eclsize - 1);
- // initialize array of error correction codewords
- $ecw = array_fill(0, $eclsize, 0);
- // for each data codeword
- foreach($cw as $k => $d) {
- $t1 = ($d + $ecw[$eclmaxid]) % 929;
- for ($j = $eclmaxid; $j > 0; --$j) {
- $t2 = ($t1 * $ecc[$j]) % 929;
- $t3 = 929 - $t2;
- $ecw[$j] = ($ecw[($j - 1)] + $t3) % 929;
- }
- $t2 = ($t1 * $ecc[0]) % 929;
- $t3 = 929 - $t2;
- $ecw[0] = $t3 % 929;
- }
- foreach($ecw as $j => $e) {
- if ($e != 0) {
- $ecw[$j] = 929 - $e;
- }
- }
- $ecw = array_reverse($ecw);
- return $ecw;
- }
-
- /**
- * Create array of sequences from input
- * @param $code (string) code
- * @return bidimensional array containing characters and classification
- * @protected
- */
- protected function getInputSequences($code) {
- $sequence_array = array(); // array to be returned
- $numseq = array();
- // get numeric sequences
- preg_match_all('/([0-9]{13,44})/', $code, $numseq, PREG_OFFSET_CAPTURE);
- $numseq[1][] = array('', strlen($code));
- $offset = 0;
- foreach($numseq[1] as $seq) {
- $seqlen = strlen($seq[0]);
- if ($seq[1] > 0) {
- // extract text sequence before the number sequence
- $prevseq = substr($code, $offset, ($seq[1] - $offset));
- $textseq = array();
- // get text sequences
- preg_match_all('/([\x09\x0a\x0d\x20-\x7e]{5,})/', $prevseq, $textseq, PREG_OFFSET_CAPTURE);
- $textseq[1][] = array('', strlen($prevseq));
- $txtoffset = 0;
- foreach($textseq[1] as $txtseq) {
- $txtseqlen = strlen($txtseq[0]);
- if ($txtseq[1] > 0) {
- // extract byte sequence before the text sequence
- $prevtxtseq = substr($prevseq, $txtoffset, ($txtseq[1] - $txtoffset));
- if (strlen($prevtxtseq) > 0) {
- // add BYTE sequence
- if ((strlen($prevtxtseq) == 1) AND ((count($sequence_array) > 0) AND ($sequence_array[(count($sequence_array) - 1)][0] == 900))) {
- $sequence_array[] = array(913, $prevtxtseq);
- } elseif ((strlen($prevtxtseq) % 6) == 0) {
- $sequence_array[] = array(924, $prevtxtseq);
- } else {
- $sequence_array[] = array(901, $prevtxtseq);
- }
- }
- }
- if ($txtseqlen > 0) {
- // add numeric sequence
- $sequence_array[] = array(900, $txtseq[0]);
- }
- $txtoffset = $txtseq[1] + $txtseqlen;
- }
- }
- if ($seqlen > 0) {
- // add numeric sequence
- $sequence_array[] = array(902, $seq[0]);
- }
- $offset = $seq[1] + $seqlen;
- }
- return $sequence_array;
- }
-
- /**
- * Compact data by mode.
- * @param $mode (int) compaction mode number
- * @param $code (string) data to compact
- * @param $addmode (boolean) if true add the mode codeword at first position
- * @return array of codewords
- * @protected
- */
- protected function getCompaction($mode, $code, $addmode=true) {
- $cw = array(); // array of codewords to return
- switch($mode) {
- case 900: { // Text Compaction mode latch
- $submode = 0; // default Alpha sub-mode
- $txtarr = array(); // array of characters and sub-mode switching characters
- $codelen = strlen($code);
- for ($i = 0; $i < $codelen; ++$i) {
- $chval = ord($code{$i});
- if (($k = array_search($chval, $this->textsubmodes[$submode])) !== false) {
- // we are on the same sub-mode
- $txtarr[] = $k;
- } else {
- // the sub-mode is changed
- for ($s = 0; $s < 4; ++$s) {
- // search new sub-mode
- if (($s != $submode) AND (($k = array_search($chval, $this->textsubmodes[$s])) !== false)) {
- // $s is the new submode
- if (((($i + 1) == $codelen) OR ((($i + 1) < $codelen) AND (array_search(ord($code{($i + 1)}), $this->textsubmodes[$submode]) !== false))) AND (($s == 3) OR (($s == 0) AND ($submode == 1)))) {
- // shift (temporary change only for this char)
- if ($s == 3) {
- // shift to puntuaction
- $txtarr[] = 29;
- } else {
- // shift from lower to alpha
- $txtarr[] = 27;
- }
- } else {
- // latch
- $txtarr = array_merge($txtarr, $this->textlatch[''.$submode.$s]);
- // set new submode
- $submode = $s;
- }
- // add characted code to array
- $txtarr[] = $k;
- break;
- }
- }
- }
- }
- $txtarrlen = count($txtarr);
- if (($txtarrlen % 2) != 0) {
- // add padding
- $txtarr[] = 29;
- ++$txtarrlen;
- }
- // calculate codewords
- for ($i = 0; $i < $txtarrlen; $i += 2) {
- $cw[] = (30 * $txtarr[$i]) + $txtarr[($i + 1)];
- }
- break;
- }
- case 901:
- case 924: { // Byte Compaction mode latch
- while (($codelen = strlen($code)) > 0) {
- if ($codelen > 6) {
- $rest = substr($code, 6);
- $code = substr($code, 0, 6);
- $sublen = 6;
- } else {
- $rest = '';
- $sublen = strlen($code);
- }
- if ($sublen == 6) {
- $t = bcmul(''.ord($code{0}), '1099511627776');
- $t = bcadd($t, bcmul(''.ord($code{1}), '4294967296'));
- $t = bcadd($t, bcmul(''.ord($code{2}), '16777216'));
- $t = bcadd($t, bcmul(''.ord($code{3}), '65536'));
- $t = bcadd($t, bcmul(''.ord($code{4}), '256'));
- $t = bcadd($t, ''.ord($code{5}));
- // tmp array for the 6 bytes block
- $cw6 = array();
- do {
- $d = bcmod($t, '900');
- $t = bcdiv($t, '900');
- // prepend the value to the beginning of the array
- array_unshift($cw6, $d);
- } while ($t != '0');
- // append the result array at the end
- $cw = array_merge($cw, $cw6);
- } else {
- for ($i = 0; $i < $sublen; ++$i) {
- $cw[] = ord($code{$i});
- }
- }
- $code = $rest;
- }
- break;
- }
- case 902: { // Numeric Compaction mode latch
- while (($codelen = strlen($code)) > 0) {
- if ($codelen > 44) {
- $rest = substr($code, 44);
- $code = substr($code, 0, 44);
- } else {
- $rest = '';
- }
- $t = '1'.$code;
- do {
- $d = bcmod($t, '900');
- $t = bcdiv($t, '900');
- array_unshift($cw, $d);
- } while ($t != '0');
- $code = $rest;
- }
- break;
- }
- case 913: { // Byte Compaction mode shift
- $cw[] = ord($code);
- break;
- }
- }
- if ($addmode) {
- // add the compaction mode codeword at the beginning
- array_unshift($cw, $mode);
- }
- return $cw;
- }
-
-} // end PDF417 class
-
-//============================================================+
-// END OF FILE
-//============================================================+
diff --git a/libs/tcpdf/include/barcodes/qrcode.php b/libs/tcpdf/include/barcodes/qrcode.php
deleted file mode 100644
index 3127fe6873..0000000000
--- a/libs/tcpdf/include/barcodes/qrcode.php
+++ /dev/null
@@ -1,2866 +0,0 @@
-<?php
-//============================================================+
-// File name : qrcode.php
-// Version : 1.0.010
-// Begin : 2010-03-22
-// Last Update : 2012-07-25
-// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
-// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
-// -------------------------------------------------------------------
-// Copyright (C) 2010-2012 Nicola Asuni - Tecnick.com LTD
-//
-// This file is part of TCPDF software library.
-//
-// TCPDF 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 3 of the
-// License, or (at your option) any later version.
-//
-// TCPDF 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 TCPDF. If not, see <http://www.gnu.org/licenses/>.
-//
-// See LICENSE.TXT file for more information.
-// -------------------------------------------------------------------
-//
-// DESCRIPTION :
-//
-// Class to create QR-code arrays for TCPDF class.
-// QR Code symbol is a 2D barcode that can be scanned by
-// handy terminals such as a mobile phone with CCD.
-// The capacity of QR Code is up to 7000 digits or 4000
-// characters, and has high robustness.
-// This class supports QR Code model 2, described in
-// JIS (Japanese Industrial Standards) X0510:2004
-// or ISO/IEC 18004.
-// Currently the following features are not supported:
-// ECI and FNC1 mode, Micro QR Code, QR Code model 1,
-// Structured mode.
-//
-// This class is derived from the following projects:
-// ---------------------------------------------------------
-// "PHP QR Code encoder"
-// License: GNU-LGPLv3
-// Copyright (C) 2010 by Dominik Dzienia <deltalab at poczta dot fm>
-// http://phpqrcode.sourceforge.net/
-// https://sourceforge.net/projects/phpqrcode/
-//
-// The "PHP QR Code encoder" is based on
-// "C libqrencode library" (ver. 3.1.1)
-// License: GNU-LGPL 2.1
-// Copyright (C) 2006-2010 by Kentaro Fukuchi
-// http://megaui.net/fukuchi/works/qrencode/index.en.html
-//
-// Reed-Solomon code encoder is written by Phil Karn, KA9Q.
-// Copyright (C) 2002-2006 Phil Karn, KA9Q
-//
-// QR Code is registered trademark of DENSO WAVE INCORPORATED
-// http://www.denso-wave.com/qrcode/index-e.html
-// ---------------------------------------------------------
-//============================================================+
-
-/**
- * @file
- * Class to create QR-code arrays for TCPDF class.
- * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD.
- * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness.
- * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004.
- * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode.
- *
- * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html).
- * Please read comments on this class source file for full copyright and license information.
- *
- * @package com.tecnick.tcpdf
- * @author Nicola Asuni
- * @version 1.0.010
- */
-
-// definitions
-if (!defined('QRCODEDEFS')) {
-
- /**
- * Indicate that definitions for this class are set
- */
- define('QRCODEDEFS', true);
-
- // -----------------------------------------------------
-
- // Encoding modes (characters which can be encoded in QRcode)
-
- /**
- * Encoding mode
- */
- define('QR_MODE_NL', -1);
-
- /**
- * Encoding mode numeric (0-9). 3 characters are encoded to 10bit length. In theory, 7089 characters or less can be stored in a QRcode.
- */
- define('QR_MODE_NM', 0);
-
- /**
- * Encoding mode alphanumeric (0-9A-Z $%*+-./:) 45characters. 2 characters are encoded to 11bit length. In theory, 4296 characters or less can be stored in a QRcode.
- */
- define('QR_MODE_AN', 1);
-
- /**
- * Encoding mode 8bit byte data. In theory, 2953 characters or less can be stored in a QRcode.
- */
- define('QR_MODE_8B', 2);
-
- /**
- * Encoding mode KANJI. A KANJI character (multibyte character) is encoded to 13bit length. In theory, 1817 characters or less can be stored in a QRcode.
- */
- define('QR_MODE_KJ', 3);
-
- /**
- * Encoding mode STRUCTURED (currently unsupported)
- */
- define('QR_MODE_ST', 4);
-
- // -----------------------------------------------------
-
- // Levels of error correction.
- // QRcode has a function of an error correcting for miss reading that white is black.
- // Error correcting is defined in 4 level as below.
-
- /**
- * Error correction level L : About 7% or less errors can be corrected.
- */
- define('QR_ECLEVEL_L', 0);
-
- /**
- * Error correction level M : About 15% or less errors can be corrected.
- */
- define('QR_ECLEVEL_M', 1);
-
- /**
- * Error correction level Q : About 25% or less errors can be corrected.
- */
- define('QR_ECLEVEL_Q', 2);
-
- /**
- * Error correction level H : About 30% or less errors can be corrected.
- */
- define('QR_ECLEVEL_H', 3);
-
- // -----------------------------------------------------
-
- // Version. Size of QRcode is defined as version.
- // Version is from 1 to 40.
- // Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases.
- // So version 40 is 177*177 matrix.
-
- /**
- * Maximum QR Code version.
- */
- define('QRSPEC_VERSION_MAX', 40);
-
- /**
- * Maximum matrix size for maximum version (version 40 is 177*177 matrix).
- */
- define('QRSPEC_WIDTH_MAX', 177);
-
- // -----------------------------------------------------
-
- /**
- * Matrix index to get width from $capacity array.
- */
- define('QRCAP_WIDTH', 0);
-
- /**
- * Matrix index to get number of words from $capacity array.
- */
- define('QRCAP_WORDS', 1);
-
- /**
- * Matrix index to get remainder from $capacity array.
- */
- define('QRCAP_REMINDER', 2);
-
- /**
- * Matrix index to get error correction level from $capacity array.
- */
- define('QRCAP_EC', 3);
-
- // -----------------------------------------------------
-
- // Structure (currently usupported)
-
- /**
- * Number of header bits for structured mode
- */
- define('STRUCTURE_HEADER_BITS', 20);
-
- /**
- * Max number of symbols for structured mode
- */
- define('MAX_STRUCTURED_SYMBOLS', 16);
-
- // -----------------------------------------------------
-
- // Masks
-
- /**
- * Down point base value for case 1 mask pattern (concatenation of same color in a line or a column)
- */
- define('N1', 3);
-
- /**
- * Down point base value for case 2 mask pattern (module block of same color)
- */
- define('N2', 3);
-
- /**
- * Down point base value for case 3 mask pattern (1:1:3:1:1(dark:bright:dark:bright:dark)pattern in a line or a column)
- */
- define('N3', 40);
-
- /**
- * Down point base value for case 4 mask pattern (ration of dark modules in whole)
- */
- define('N4', 10);
-
- // -----------------------------------------------------
-
- // Optimization settings
-
- /**
- * if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
- */
- define('QR_FIND_BEST_MASK', true);
-
- /**
- * if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
- */
- define('QR_FIND_FROM_RANDOM', 2);
-
- /**
- * when QR_FIND_BEST_MASK === false
- */
- define('QR_DEFAULT_MASK', 2);
-
- // -----------------------------------------------------
-
-} // end of definitions
-
-// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
-
-// for compatibility with PHP4
-if (!function_exists('str_split')) {
- /**
- * Convert a string to an array (needed for PHP4 compatibility)
- * @param $string (string) The input string.
- * @param $split_length (int) Maximum length of the chunk.
- * @return If the optional split_length parameter is specified, the returned array will be broken down into chunks with each being split_length in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element.
- */
- function str_split($string, $split_length=1) {
- if ((strlen($string) > $split_length) OR (!$split_length)) {
- do {
- $c = strlen($string);
- $parts[] = substr($string, 0, $split_length);
- $string = substr($string, $split_length);
- } while ($string !== false);
- } else {
- $parts = array($string);
- }
- return $parts;
- }
-}
-
-// #####################################################
-
-/**
- * @class QRcode
- * Class to create QR-code arrays for TCPDF class.
- * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD.
- * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness.
- * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004.
- * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode.
- *
- * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html).
- * Please read comments on this class source file for full copyright and license information.
- *
- * @package com.tecnick.tcpdf
- * @author Nicola Asuni
- * @version 1.0.010
- */
-class QRcode {
-
- /**
- * Barcode array to be returned which is readable by TCPDF.
- * @protected
- */
- protected $barcode_array = array();
-
- /**
- * QR code version. Size of QRcode is defined as version. Version is from 1 to 40. Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. So version 40 is 177*177 matrix.
- * @protected
- */
- protected $version = 0;
-
- /**
- * Levels of error correction. See definitions for possible values.
- * @protected
- */
- protected $level = QR_ECLEVEL_L;
-
- /**
- * Encoding mode.
- * @protected
- */
- protected $hint = QR_MODE_8B;
-
- /**
- * Boolean flag, if true the input string will be converted to uppercase.
- * @protected
- */
- protected $casesensitive = true;
-
- /**
- * Structured QR code (not supported yet).
- * @protected
- */
- protected $structured = 0;
-
- /**
- * Mask data.
- * @protected
- */
- protected $data;
-
- // FrameFiller
-
- /**
- * Width.
- * @protected
- */
- protected $width;
-
- /**
- * Frame.
- * @protected
- */
- protected $frame;
-
- /**
- * X position of bit.
- * @protected
- */
- protected $x;
-
- /**
- * Y position of bit.
- * @protected
- */
- protected $y;
-
- /**
- * Direction.
- * @protected
- */
- protected $dir;
-
- /**
- * Single bit value.
- * @protected
- */
- protected $bit;
-
- // ---- QRrawcode ----
-
- /**
- * Data code.
- * @protected
- */
- protected $datacode = array();
-
- /**
- * Error correction code.
- * @protected
- */
- protected $ecccode = array();
-
- /**
- * Blocks.
- * @protected
- */
- protected $blocks;
-
- /**
- * Reed-Solomon blocks.
- * @protected
- */
- protected $rsblocks = array(); //of RSblock
-
- /**
- * Counter.
- * @protected
- */
- protected $count;
-
- /**
- * Data length.
- * @protected
- */
- protected $dataLength;
-
- /**
- * Error correction length.
- * @protected
- */
- protected $eccLength;
-
- /**
- * Value b1.
- * @protected
- */
- protected $b1;
-
- // ---- QRmask ----
-
- /**
- * Run length.
- * @protected
- */
- protected $runLength = array();
-
- // ---- QRsplit ----
-
- /**
- * Input data string.
- * @protected
- */
- protected $dataStr = '';
-
- /**
- * Input items.
- * @protected
- */
- protected $items;
-
- // Reed-Solomon items
-
- /**
- * Reed-Solomon items.
- * @protected
- */
- protected $rsitems = array();
-
- /**
- * Array of frames.
- * @protected
- */
- protected $frames = array();
-
- /**
- * Alphabet-numeric convesion table.
- * @protected
- */
- protected $anTable = array(
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
- 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, //
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, //
- -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, //
- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, //
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 //
- );
-
- /**
- * Array Table of the capacity of symbols.
- * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004.
- * @protected
- */
- protected $capacity = array(
- array( 0, 0, 0, array( 0, 0, 0, 0)), //
- array( 21, 26, 0, array( 7, 10, 13, 17)), // 1
- array( 25, 44, 7, array( 10, 16, 22, 28)), //
- array( 29, 70, 7, array( 15, 26, 36, 44)), //
- array( 33, 100, 7, array( 20, 36, 52, 64)), //
- array( 37, 134, 7, array( 26, 48, 72, 88)), // 5
- array( 41, 172, 7, array( 36, 64, 96, 112)), //
- array( 45, 196, 0, array( 40, 72, 108, 130)), //
- array( 49, 242, 0, array( 48, 88, 132, 156)), //
- array( 53, 292, 0, array( 60, 110, 160, 192)), //
- array( 57, 346, 0, array( 72, 130, 192, 224)), // 10
- array( 61, 404, 0, array( 80, 150, 224, 264)), //
- array( 65, 466, 0, array( 96, 176, 260, 308)), //
- array( 69, 532, 0, array( 104, 198, 288, 352)), //
- array( 73, 581, 3, array( 120, 216, 320, 384)), //
- array( 77, 655, 3, array( 132, 240, 360, 432)), // 15
- array( 81, 733, 3, array( 144, 280, 408, 480)), //
- array( 85, 815, 3, array( 168, 308, 448, 532)), //
- array( 89, 901, 3, array( 180, 338, 504, 588)), //
- array( 93, 991, 3, array( 196, 364, 546, 650)), //
- array( 97, 1085, 3, array( 224, 416, 600, 700)), // 20
- array(101, 1156, 4, array( 224, 442, 644, 750)), //
- array(105, 1258, 4, array( 252, 476, 690, 816)), //
- array(109, 1364, 4, array( 270, 504, 750, 900)), //
- array(113, 1474, 4, array( 300, 560, 810, 960)), //
- array(117, 1588, 4, array( 312, 588, 870, 1050)), // 25
- array(121, 1706, 4, array( 336, 644, 952, 1110)), //
- array(125, 1828, 4, array( 360, 700, 1020, 1200)), //
- array(129, 1921, 3, array( 390, 728, 1050, 1260)), //
- array(133, 2051, 3, array( 420, 784, 1140, 1350)), //
- array(137, 2185, 3, array( 450, 812, 1200, 1440)), // 30
- array(141, 2323, 3, array( 480, 868, 1290, 1530)), //
- array(145, 2465, 3, array( 510, 924, 1350, 1620)), //
- array(149, 2611, 3, array( 540, 980, 1440, 1710)), //
- array(153, 2761, 3, array( 570, 1036, 1530, 1800)), //
- array(157, 2876, 0, array( 570, 1064, 1590, 1890)), // 35
- array(161, 3034, 0, array( 600, 1120, 1680, 1980)), //
- array(165, 3196, 0, array( 630, 1204, 1770, 2100)), //
- array(169, 3362, 0, array( 660, 1260, 1860, 2220)), //
- array(173, 3532, 0, array( 720, 1316, 1950, 2310)), //
- array(177, 3706, 0, array( 750, 1372, 2040, 2430)) // 40
- );
-
- /**
- * Array Length indicator.
- * @protected
- */
- protected $lengthTableBits = array(
- array(10, 12, 14),
- array( 9, 11, 13),
- array( 8, 16, 16),
- array( 8, 10, 12)
- );
-
- /**
- * Array Table of the error correction code (Reed-Solomon block).
- * See Table 12-16 (pp.30-36), JIS X0510:2004.
- * @protected
- */
- protected $eccTable = array(
- array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), //
- array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1
- array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), //
- array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), //
- array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), //
- array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5
- array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), //
- array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), //
- array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), //
- array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), //
- array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), // 10
- array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), //
- array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), //
- array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), //
- array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), //
- array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), // 15
- array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), //
- array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), //
- array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), //
- array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), //
- array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), // 20
- array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), //
- array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), //
- array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), //
- array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), //
- array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), // 25
- array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), //
- array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), //
- array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), //
- array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), //
- array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), // 30
- array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), //
- array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), //
- array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), //
- array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), //
- array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), // 35
- array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), //
- array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), //
- array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), //
- array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), //
- array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)) // 40
- );
-
- /**
- * Array Positions of alignment patterns.
- * This array includes only the second and the third position of the alignment patterns. Rest of them can be calculated from the distance between them.
- * See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
- * @protected
- */
- protected $alignmentPattern = array(
- array( 0, 0),
- array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5
- array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10
- array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), // 11-15
- array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), // 16-20
- array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), // 21-25
- array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), // 26-30
- array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), // 31-35
- array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58) // 35-40
- );
-
- /**
- * Array Version information pattern (BCH coded).
- * See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
- * size: [QRSPEC_VERSION_MAX - 6]
- * @protected
- */
- protected $versionPattern = array(
- 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, //
- 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, //
- 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, //
- 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, //
- 0x27541, 0x28c69
- );
-
- /**
- * Array Format information
- * @protected
- */
- protected $formatInfo = array(
- array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), //
- array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), //
- array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), //
- array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) //
- );
-
-
- // -------------------------------------------------
- // -------------------------------------------------
-
-
- /**
- * This is the class constructor.
- * Creates a QRcode object
- * @param $code (string) code to represent using QRcode
- * @param $eclevel (string) error level: <ul><li>L : About 7% or less errors can be corrected.</li><li>M : About 15% or less errors can be corrected.</li><li>Q : About 25% or less errors can be corrected.</li><li>H : About 30% or less errors can be corrected.</li></ul>
- * @public
- * @since 1.0.000
- */
- public function __construct($code, $eclevel = 'L') {
- $barcode_array = array();
- if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
- return false;
- }
- // set error correction level
- $this->level = array_search($eclevel, array('L', 'M', 'Q', 'H'));
- if ($this->level === false) {
- $this->level = QR_ECLEVEL_L;
- }
- if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) {
- return false;
- }
- if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) {
- return false;
- }
- $this->items = array();
- $this->encodeString($code);
- if (is_null($this->data)) {
- return false;
- }
- $qrTab = $this->binarize($this->data);
- $size = count($qrTab);
- $barcode_array['num_rows'] = $size;
- $barcode_array['num_cols'] = $size;
- $barcode_array['bcode'] = array();
- foreach ($qrTab as $line) {
- $arrAdd = array();
- foreach (str_split($line) as $char) {
- $arrAdd[] = ($char=='1')?1:0;
- }
- $barcode_array['bcode'][] = $arrAdd;
- }
- $this->barcode_array = $barcode_array;
- }
-
- /**
- * Returns a barcode array which is readable by TCPDF
- * @return array barcode array readable by TCPDF;
- * @public
- */
- public function getBarcodeArray() {
- return $this->barcode_array;
- }
-
- /**
- * Convert the frame in binary form
- * @param $frame (array) array to binarize
- * @return array frame in binary form
- */
- protected function binarize($frame) {
- $len = count($frame);
- // the frame is square (width = height)
- foreach ($frame as &$frameLine) {
- for ($i=0; $i<$len; $i++) {
- $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
- }
- }
- return $frame;
- }
-
- /**
- * Encode the input string to QR code
- * @param $string (string) input string to encode
- */
- protected function encodeString($string) {
- $this->dataStr = $string;
- if (!$this->casesensitive) {
- $this->toUpper();
- }
- $ret = $this->splitString();
- if ($ret < 0) {
- return NULL;
- }
- $this->encodeMask(-1);
- }
-
- /**
- * Encode mask
- * @param $mask (int) masking mode
- */
- protected function encodeMask($mask) {
- $spec = array(0, 0, 0, 0, 0);
- $this->datacode = $this->getByteStream($this->items);
- if (is_null($this->datacode)) {
- return NULL;
- }
- $spec = $this->getEccSpec($this->version, $this->level, $spec);
- $this->b1 = $this->rsBlockNum1($spec);
- $this->dataLength = $this->rsDataLength($spec);
- $this->eccLength = $this->rsEccLength($spec);
- $this->ecccode = array_fill(0, $this->eccLength, 0);
- $this->blocks = $this->rsBlockNum($spec);
- $ret = $this->init($spec);
- if ($ret < 0) {
- return NULL;
- }
- $this->count = 0;
- $this->width = $this->getWidth($this->version);
- $this->frame = $this->newFrame($this->version);
- $this->x = $this->width - 1;
- $this->y = $this->width - 1;
- $this->dir = -1;
- $this->bit = -1;
- // inteleaved data and ecc codes
- for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) {
- $code = $this->getCode();
- $bit = 0x80;
- for ($j=0; $j<8; $j++) {
- $addr = $this->getNextPosition();
- $this->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
- $bit = $bit >> 1;
- }
- }
- // remainder bits
- $j = $this->getRemainder($this->version);
- for ($i=0; $i<$j; $i++) {
- $addr = $this->getNextPosition();
- $this->setFrameAt($addr, 0x02);
- }
- // masking
- $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
- if ($mask < 0) {
- if (QR_FIND_BEST_MASK) {
- $masked = $this->mask($this->width, $this->frame, $this->level);
- } else {
- $masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level);
- }
- } else {
- $masked = $this->makeMask($this->width, $this->frame, $mask, $this->level);
- }
- if ($masked == NULL) {
- return NULL;
- }
- $this->data = $masked;
- }
-
- // - - - - - - - - - - - - - - - - - - - - - - - - -
-
- // FrameFiller
-
- /**
- * Set frame value at specified position
- * @param $at (array) x,y position
- * @param $val (int) value of the character to set
- */
- protected function setFrameAt($at, $val) {
- $this->frame[$at['y']][$at['x']] = chr($val);
- }
-
- /**
- * Get frame value at specified position
- * @param $at (array) x,y position
- * @return value at specified position
- */
- protected function getFrameAt($at) {
- return ord($this->frame[$at['y']][$at['x']]);
- }
-
- /**
- * Return the next frame position
- * @return array of x,y coordinates
- */
- protected function getNextPosition() {
- do {
- if ($this->bit == -1) {
- $this->bit = 0;
- return array('x'=>$this->x, 'y'=>$this->y);
- }
- $x = $this->x;
- $y = $this->y;
- $w = $this->width;
- if ($this->bit == 0) {
- $x--;
- $this->bit++;
- } else {
- $x++;
- $y += $this->dir;
- $this->bit--;
- }
- if ($this->dir < 0) {
- if ($y < 0) {
- $y = 0;
- $x -= 2;
- $this->dir = 1;
- if ($x == 6) {
- $x--;
- $y = 9;
- }
- }
- } else {
- if ($y == $w) {
- $y = $w - 1;
- $x -= 2;
- $this->dir = -1;
- if ($x == 6) {
- $x--;
- $y -= 8;
- }
- }
- }
- if (($x < 0) OR ($y < 0)) {
- return NULL;
- }
- $this->x = $x;
- $this->y = $y;
- } while(ord($this->frame[$y][$x]) & 0x80);
- return array('x'=>$x, 'y'=>$y);
- }
-
- // - - - - - - - - - - - - - - - - - - - - - - - - -
-
- // QRrawcode
-
- /**
- * Initialize code.
- * @param $spec (array) array of ECC specification
- * @return 0 in case of success, -1 in case of error
- */
- protected function init($spec) {
- $dl = $this->rsDataCodes1($spec);
- $el = $this->rsEccCodes1($spec);
- $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
- $blockNo = 0;
- $dataPos = 0;
- $eccPos = 0;
- $endfor = $this->rsBlockNum1($spec);
- for ($i=0; $i < $endfor; ++$i) {
- $ecc = array_slice($this->ecccode, $eccPos);
- $this->rsblocks[$blockNo] = array();
- $this->rsblocks[$blockNo]['dataLength'] = $dl;
- $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
- $this->rsblocks[$blockNo]['eccLength'] = $el;
- $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
- $this->rsblocks[$blockNo]['ecc'] = $ecc;
- $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
- $dataPos += $dl;
- $eccPos += $el;
- $blockNo++;
- }
- if ($this->rsBlockNum2($spec) == 0) {
- return 0;
- }
- $dl = $this->rsDataCodes2($spec);
- $el = $this->rsEccCodes2($spec);
- $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
- if ($rs == NULL) {
- return -1;
- }
- $endfor = $this->rsBlockNum2($spec);
- for ($i=0; $i < $endfor; ++$i) {
- $ecc = array_slice($this->ecccode, $eccPos);
- $this->rsblocks[$blockNo] = array();
- $this->rsblocks[$blockNo]['dataLength'] = $dl;
- $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
- $this->rsblocks[$blockNo]['eccLength'] = $el;
- $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
- $this->rsblocks[$blockNo]['ecc'] = $ecc;
- $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc);
- $dataPos += $dl;
- $eccPos += $el;
- $blockNo++;
- }
- return 0;
- }
-
- /**
- * Return Reed-Solomon block code.
- * @return array rsblocks
- */
- protected function getCode() {
- if ($this->count < $this->dataLength) {
- $row = $this->count % $this->blocks;
- $col = $this->count / $this->blocks;
- if ($col >= $this->rsblocks[0]['dataLength']) {
- $row += $this->b1;
- }
- $ret = $this->rsblocks[$row]['data'][$col];
- } elseif ($this->count < $this->dataLength + $this->eccLength) {
- $row = ($this->count - $this->dataLength) % $this->blocks;
- $col = ($this->count - $this->dataLength) / $this->blocks;
- $ret = $this->rsblocks[$row]['ecc'][$col];
- } else {
- return 0;
- }
- $this->count++;
- return $ret;
- }
-
- // - - - - - - - - - - - - - - - - - - - - - - - - -
-
- // QRmask
-
- /**
- * Write Format Information on frame and returns the number of black bits
- * @param $width (int) frame width
- * @param $frame (array) frame
- * @param $mask (array) masking mode
- * @param $level (int) error correction level
- * @return int blacks
- */
- protected function writeFormatInformation($width, &$frame, $mask, $level) {
- $blacks = 0;
- $format = $this->getFormatInfo($mask, $level);
- for ($i=0; $i<8; ++$i) {
- if ($format & 1) {
- $blacks += 2;
- $v = 0x85;
- } else {
- $v = 0x84;
- }
- $frame[8][$width - 1 - $i] = chr($v);
- if ($i < 6) {
- $frame[$i][8] = chr($v);
- } else {
- $frame[$i + 1][8] = chr($v);
- }
- $format = $format >> 1;
- }
- for ($i=0; $i<7; ++$i) {
- if ($format & 1) {
- $blacks += 2;
- $v = 0x85;
- } else {
- $v = 0x84;
- }
- $frame[$width - 7 + $i][8] = chr($v);
- if ($i == 0) {
- $frame[8][7] = chr($v);
- } else {
- $frame[8][6 - $i] = chr($v);
- }
- $format = $format >> 1;
- }
- return $blacks;
- }
-
- /**
- * mask0
- * @param $x (int) X position
- * @param $y (int) Y position
- * @return int mask
- */
- protected function mask0($x, $y) {
- return ($x + $y) & 1;
- }
-
- /**
- * mask1
- * @param $x (int) X position
- * @param $y (int) Y position
- * @return int mask
- */
- protected function mask1($x, $y) {
- return ($y & 1);
- }
-
- /**
- * mask2
- * @param $x (int) X position
- * @param $y (int) Y position
- * @return int mask
- */
- protected function mask2($x, $y) {
- return ($x % 3);
- }
-
- /**
- * mask3
- * @param $x (int) X position
- * @param $y (int) Y position
- * @return int mask
- */
- protected function mask3($x, $y) {
- return ($x + $y) % 3;
- }
-
- /**
- * mask4
- * @param $x (int) X position
- * @param $y (int) Y position
- * @return int mask
- */
- protected function mask4($x, $y) {
- return (((int)($y / 2)) + ((int)($x / 3))) & 1;
- }
-
- /**
- * mask5
- * @param $x (int) X position
- * @param $y (int) Y position
- * @return int mask
- */
- protected function mask5($x, $y) {
- return (($x * $y) & 1) + ($x * $y) % 3;
- }
-
- /**
- * mask6
- * @param $x (int) X position
- * @param $y (int) Y position
- * @return int mask
- */
- protected function mask6($x, $y) {
- return ((($x * $y) & 1) + ($x * $y) % 3) & 1;
- }
-
- /**
- * mask7
- * @param $x (int) X position
- * @param $y (int) Y position
- * @return int mask
- */
- protected function mask7($x, $y) {
- return ((($x * $y) % 3) + (($x + $y) & 1)) & 1;
- }
-
- /**
- * Return bitmask
- * @param $maskNo (int) mask number
- * @param $width (int) width
- * @param $frame (array) frame
- * @return array bitmask
- */
- protected function generateMaskNo($maskNo, $width, $frame) {
- $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
- for ($y=0; $y<$width; ++$y) {
- for ($x=0; $x<$width; ++$x) {
- if (ord($frame[$y][$x]) & 0x80) {
- $bitMask[$y][$x] = 0;
- } else {
- $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
- $bitMask[$y][$x] = ($maskFunc == 0)?1:0;
- }
- }
- }
- return $bitMask;
- }
-
- /**
- * makeMaskNo
- * @param $maskNo (int)
- * @param $width (int)
- * @param $s (int)
- * @param $d (int)
- * @param $maskGenOnly (boolean)
- * @return int b
- */
- protected function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly=false) {
- $b = 0;
- $bitMask = array();
- $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
- if ($maskGenOnly) {
- return;
- }
- $d = $s;
- for ($y=0; $y<$width; ++$y) {
- for ($x=0; $x<$width; ++$x) {
- if ($bitMask[$y][$x] == 1) {
- $d[$y][$x] = chr(ord($s[$y][$x]) ^ ((int)($bitMask[$y][$x])));
- }
- $b += (int)(ord($d[$y][$x]) & 1);
- }
- }
- return $b;
- }
-
- /**
- * makeMask
- * @param $width (int)
- * @param $frame (array)
- * @param $maskNo (int)
- * @param $level (int)
- * @return array mask
- */
- protected function makeMask($width, $frame, $maskNo, $level) {
- $masked = array_fill(0, $width, str_repeat("\0", $width));
- $this->makeMaskNo($maskNo, $width, $frame, $masked);
- $this->writeFormatInformation($width, $masked, $maskNo, $level);
- return $masked;
- }
-
- /**
- * calcN1N3
- * @param $length (int)
- * @return int demerit
- */
- protected function calcN1N3($length) {
- $demerit = 0;
- for ($i=0; $i<$length; ++$i) {
- if ($this->runLength[$i] >= 5) {
- $demerit += (N1 + ($this->runLength[$i] - 5));
- }
- if ($i & 1) {
- if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) {
- $fact = (int)($this->runLength[$i] / 3);
- if (($this->runLength[$i-2] == $fact)
- AND ($this->runLength[$i-1] == $fact)
- AND ($this->runLength[$i+1] == $fact)
- AND ($this->runLength[$i+2] == $fact)) {
- if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) {
- $demerit += N3;
- } elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) {
- $demerit += N3;
- }
- }
- }
- }
- }
- return $demerit;
- }
-
- /**
- * evaluateSymbol
- * @param $width (int)
- * @param $frame (array)
- * @return int demerit
- */
- protected function evaluateSymbol($width, $frame) {
- $head = 0;
- $demerit = 0;
- for ($y=0; $y<$width; ++$y) {
- $head = 0;
- $this->runLength[0] = 1;
- $frameY = $frame[$y];
- if ($y > 0) {
- $frameYM = $frame[$y-1];
- }
- for ($x=0; $x<$width; ++$x) {
- if (($x > 0) AND ($y > 0)) {
- $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
- $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);
- if (($b22 | ($w22 ^ 1)) & 1) {
- $demerit += N2;
- }
- }
- if (($x == 0) AND (ord($frameY[$x]) & 1)) {
- $this->runLength[0] = -1;
- $head = 1;
- $this->runLength[$head] = 1;
- } elseif ($x > 0) {
- if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
- $head++;
- $this->runLength[$head] = 1;
- } else {
- $this->runLength[$head]++;
- }
- }
- }
- $demerit += $this->calcN1N3($head+1);
- }
- for ($x=0; $x<$width; ++$x) {
- $head = 0;
- $this->runLength[0] = 1;
- for ($y=0; $y<$width; ++$y) {
- if (($y == 0) AND (ord($frame[$y][$x]) & 1)) {
- $this->runLength[0] = -1;
- $head = 1;
- $this->runLength[$head] = 1;
- } elseif ($y > 0) {
- if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
- $head++;
- $this->runLength[$head] = 1;
- } else {
- $this->runLength[$head]++;
- }
- }
- }
- $demerit += $this->calcN1N3($head+1);
- }
- return $demerit;
- }
-
- /**
- * mask
- * @param $width (int)
- * @param $frame (array)
- * @param $level (int)
- * @return array best mask
- */
- protected function mask($width, $frame, $level) {
- $minDemerit = PHP_INT_MAX;
- $bestMaskNum = 0;
- $bestMask = array();
- $checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7);
- if (QR_FIND_FROM_RANDOM !== false) {
- $howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9);
- for ($i = 0; $i < $howManuOut; ++$i) {
- $remPos = rand (0, count($checked_masks)-1);
- unset($checked_masks[$remPos]);
- $checked_masks = array_values($checked_masks);
- }
- }
- $bestMask = $frame;
- foreach ($checked_masks as $i) {
- $mask = array_fill(0, $width, str_repeat("\0", $width));
- $demerit = 0;
- $blacks = 0;
- $blacks = $this->makeMaskNo($i, $width, $frame, $mask);
- $blacks += $this->writeFormatInformation($width, $mask, $i, $level);
- $blacks = (int)(100 * $blacks / ($width * $width));
- $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
- $demerit += $this->evaluateSymbol($width, $mask);
- if ($demerit < $minDemerit) {
- $minDemerit = $demerit;
- $bestMask = $mask;
- $bestMaskNum = $i;
- }
- }
- return $bestMask;
- }
-
- // - - - - - - - - - - - - - - - - - - - - - - - - -
-
- // QRsplit
-
- /**
- * Return true if the character at specified position is a number
- * @param $str (string) string
- * @param $pos (int) characted position
- * @return boolean true of false
- */
- protected function isdigitat($str, $pos) {
- if ($pos >= strlen($str)) {
- return false;
- }
- return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
- }
-
- /**
- * Return true if the character at specified position is an alphanumeric character
- * @param $str (string) string
- * @param $pos (int) characted position
- * @return boolean true of false
- */
- protected function isalnumat($str, $pos) {
- if ($pos >= strlen($str)) {
- return false;
- }
- return ($this->lookAnTable(ord($str[$pos])) >= 0);
- }
-
- /**
- * identifyMode
- * @param $pos (int)
- * @return int mode
- */
- protected function identifyMode($pos) {
- if ($pos >= strlen($this->dataStr)) {
- return QR_MODE_NL;
- }
- $c = $this->dataStr[$pos];
- if ($this->isdigitat($this->dataStr, $pos)) {
- return QR_MODE_NM;
- } elseif ($this->isalnumat($this->dataStr, $pos)) {
- return QR_MODE_AN;
- } elseif ($this->hint == QR_MODE_KJ) {
- if ($pos+1 < strlen($this->dataStr)) {
- $d = $this->dataStr[$pos+1];
- $word = (ord($c) << 8) | ord($d);
- if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) {
- return QR_MODE_KJ;
- }
- }
- }
- return QR_MODE_8B;
- }
-
- /**
- * eatNum
- * @return int run
- */
- protected function eatNum() {
- $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
- $p = 0;
- while($this->isdigitat($this->dataStr, $p)) {
- $p++;
- }
- $run = $p;
- $mode = $this->identifyMode($p);
- if ($mode == QR_MODE_8B) {
- $dif = $this->estimateBitsModeNum($run) + 4 + $ln
- + $this->estimateBitsMode8(1) // + 4 + l8
- - $this->estimateBitsMode8($run + 1); // - 4 - l8
- if ($dif > 0) {
- return $this->eat8();
- }
- }
- if ($mode == QR_MODE_AN) {
- $dif = $this->estimateBitsModeNum($run) + 4 + $ln
- + $this->estimateBitsModeAn(1) // + 4 + la
- - $this->estimateBitsModeAn($run + 1);// - 4 - la
- if ($dif > 0) {
- return $this->eatAn();
- }
- }
- $this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr));
- return $run;
- }
-
- /**
- * eatAn
- * @return int run
- */
- protected function eatAn() {
- $la = $this->lengthIndicator(QR_MODE_AN, $this->version);
- $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
- $p =1 ;
- while($this->isalnumat($this->dataStr, $p)) {
- if ($this->isdigitat($this->dataStr, $p)) {
- $q = $p;
- while($this->isdigitat($this->dataStr, $q)) {
- $q++;
- }
- $dif = $this->estimateBitsModeAn($p) // + 4 + la
- + $this->estimateBitsModeNum($q - $p) + 4 + $ln
- - $this->estimateBitsModeAn($q); // - 4 - la
- if ($dif < 0) {
- break;
- } else {
- $p = $q;
- }
- } else {
- $p++;
- }
- }
- $run = $p;
- if (!$this->isalnumat($this->dataStr, $p)) {
- $dif = $this->estimateBitsModeAn($run) + 4 + $la
- + $this->estimateBitsMode8(1) // + 4 + l8
- - $this->estimateBitsMode8($run + 1); // - 4 - l8
- if ($dif > 0) {
- return $this->eat8();
- }
- }
- $this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr));
- return $run;
- }
-
- /**
- * eatKanji
- * @return int run
- */
- protected function eatKanji() {
- $p = 0;
- while($this->identifyMode($p) == QR_MODE_KJ) {
- $p += 2;
- }
- $this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr));
- return $run;
- }
-
- /**
- * eat8
- * @return int run
- */
- protected function eat8() {
- $la = $this->lengthIndicator(QR_MODE_AN, $this->version);
- $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
- $p = 1;
- $dataStrLen = strlen($this->dataStr);
- while($p < $dataStrLen) {
- $mode = $this->identifyMode($p);
- if ($mode == QR_MODE_KJ) {
- break;
- }
- if ($mode == QR_MODE_NM) {
- $q = $p;
- while($this->isdigitat($this->dataStr, $q)) {
- $q++;
- }
- $dif = $this->estimateBitsMode8($p) // + 4 + l8
- + $this->estimateBitsModeNum($q - $p) + 4 + $ln
- - $this->estimateBitsMode8($q); // - 4 - l8
- if ($dif < 0) {
- break;
- } else {
- $p = $q;
- }
- } elseif ($mode == QR_MODE_AN) {
- $q = $p;
- while($this->isalnumat($this->dataStr, $q)) {
- $q++;
- }
- $dif = $this->estimateBitsMode8($p) // + 4 + l8
- + $this->estimateBitsModeAn($q - $p) + 4 + $la
- - $this->estimateBitsMode8($q); // - 4 - l8
- if ($dif < 0) {
- break;
- } else {
- $p = $q;
- }
- } else {
- $p++;
- }
- }
- $run = $p;
- $this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr));
- return $run;
- }
-
- /**
- * splitString
- * @return (int)
- */
- protected function splitString() {
- while (strlen($this->dataStr) > 0) {
- $mode = $this->identifyMode(0);
- switch ($mode) {
- case QR_MODE_NM: {
- $length = $this->eatNum();
- break;
- }
- case QR_MODE_AN: {
- $length = $this->eatAn();
- break;
- }
- case QR_MODE_KJ: {
- if ($hint == QR_MODE_KJ) {
- $length = $this->eatKanji();
- } else {
- $length = $this->eat8();
- }
- break;
- }
- default: {
- $length = $this->eat8();
- break;
- }
- }
- if ($length == 0) {
- return 0;
- }
- if ($length < 0) {
- return -1;
- }
- $this->dataStr = substr($this->dataStr, $length);
- }
- return 0;
- }
-
- /**
- * toUpper
- */
- protected function toUpper() {
- $stringLen = strlen($this->dataStr);
- $p = 0;
- while ($p < $stringLen) {
- $mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint);
- if ($mode == QR_MODE_KJ) {
- $p += 2;
- } else {
- if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) {
- $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
- }
- $p++;
- }
- }
- return $this->dataStr;
- }
-
- // - - - - - - - - - - - - - - - - - - - - - - - - -
-
- // QRinputItem
-
- /**
- * newInputItem
- * @param $mode (int)
- * @param $size (int)
- * @param $data (array)
- * @param $bstream (array)
- * @return array input item
- */
- protected function newInputItem($mode, $size, $data, $bstream=null) {
- $setData = array_slice($data, 0, $size);
- if (count($setData) < $size) {
- $setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0));
- }
- if (!$this->check($mode, $size, $setData)) {
- return NULL;
- }
- $inputitem = array();
- $inputitem['mode'] = $mode;
- $inputitem['size'] = $size;
- $inputitem['data'] = $setData;
- $inputitem['bstream'] = $bstream;
- return $inputitem;
- }
-
- /**
- * encodeModeNum
- * @param $inputitem (array)
- * @param $version (int)
- * @return array input item
- */
- protected function encodeModeNum($inputitem, $version) {
- $words = (int)($inputitem['size'] / 3);
- $inputitem['bstream'] = array();
- $val = 0x1;
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']);
- for ($i=0; $i < $words; ++$i) {
- $val = (ord($inputitem['data'][$i*3 ]) - ord('0')) * 100;
- $val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10;
- $val += (ord($inputitem['data'][$i*3+2]) - ord('0'));
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val);
- }
- if ($inputitem['size'] - $words * 3 == 1) {
- $val = ord($inputitem['data'][$words*3]) - ord('0');
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
- } elseif (($inputitem['size'] - ($words * 3)) == 2) {
- $val = (ord($inputitem['data'][$words*3 ]) - ord('0')) * 10;
- $val += (ord($inputitem['data'][$words*3+1]) - ord('0'));
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val);
- }
- return $inputitem;
- }
-
- /**
- * encodeModeAn
- * @param $inputitem (array)
- * @param $version (int)
- * @return array input item
- */
- protected function encodeModeAn($inputitem, $version) {
- $words = (int)($inputitem['size'] / 2);
- $inputitem['bstream'] = array();
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02);
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']);
- for ($i=0; $i < $words; ++$i) {
- $val = (int)($this->lookAnTable(ord($inputitem['data'][$i*2])) * 45);
- $val += (int)($this->lookAnTable(ord($inputitem['data'][($i*2)+1])));
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val);
- }
- if ($inputitem['size'] & 1) {
- $val = $this->lookAnTable(ord($inputitem['data'][($words * 2)]));
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val);
- }
- return $inputitem;
- }
-
- /**
- * encodeMode8
- * @param $inputitem (array)
- * @param $version (int)
- * @return array input item
- */
- protected function encodeMode8($inputitem, $version) {
- $inputitem['bstream'] = array();
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4);
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']);
- for ($i=0; $i < $inputitem['size']; ++$i) {
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i]));
- }
- return $inputitem;
- }
-
- /**
- * encodeModeKanji
- * @param $inputitem (array)
- * @param $version (int)
- * @return array input item
- */
- protected function encodeModeKanji($inputitem, $version) {
- $inputitem['bstream'] = array();
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8);
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2));
- for ($i=0; $i<$inputitem['size']; $i+=2) {
- $val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]);
- if ($val <= 0x9ffc) {
- $val -= 0x8140;
- } else {
- $val -= 0xc140;
- }
- $h = ($val >> 8) * 0xc0;
- $val = ($val & 0xff) + $h;
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val);
- }
- return $inputitem;
- }
-
- /**
- * encodeModeStructure
- * @param $inputitem (array)
- * @return array input item
- */
- protected function encodeModeStructure($inputitem) {
- $inputitem['bstream'] = array();
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03);
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1);
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1);
- $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2]));
- return $inputitem;
- }
-
- /**
- * encodeBitStream
- * @param $inputitem (array)
- * @param $version (int)
- * @return array input item
- */
- protected function encodeBitStream($inputitem, $version) {
- $inputitem['bstream'] = array();
- $words = $this->maximumWords($inputitem['mode'], $version);
- if ($inputitem['size'] > $words) {
- $st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']);
- $st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words));
- $st1 = $this->encodeBitStream($st1, $version);
- $st2 = $this->encodeBitStream($st2, $version);
- $inputitem['bstream'] = array();
- $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']);
- $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']);
- } else {
- switch($inputitem['mode']) {
- case QR_MODE_NM: {
- $inputitem = $this->encodeModeNum($inputitem, $version);
- break;
- }
- case QR_MODE_AN: {
- $inputitem = $this->encodeModeAn($inputitem, $version);
- break;
- }
- case QR_MODE_8B: {
- $inputitem = $this->encodeMode8($inputitem, $version);
- break;
- }
- case QR_MODE_KJ: {
- $inputitem = $this->encodeModeKanji($inputitem, $version);
- break;
- }
- case QR_MODE_ST: {
- $inputitem = $this->encodeModeStructure($inputitem);
- break;
- }
- default: {
- break;
- }
- }
- }
- return $inputitem;
- }
-
- // - - - - - - - - - - - - - - - - - - - - - - - - -
-
- // QRinput
-
- /**
- * Append data to an input object.
- * The data is copied and appended to the input object.
- * @param $items (arrray) input items
- * @param $mode (int) encoding mode.
- * @param $size (int) size of data (byte).
- * @param $data (array) array of input data.
- * @return items
- *
- */
- protected function appendNewInputItem($items, $mode, $size, $data) {
- $newitem = $this->newInputItem($mode, $size, $data);
- if (!empty($newitem)) {
- $items[] = $newitem;
- }
- return $items;
- }
-
- /**
- * insertStructuredAppendHeader
- * @param $items (array)
- * @param $size (int)
- * @param $index (int)
- * @param $parity (int)
- * @return array items
- */
- protected function insertStructuredAppendHeader($items, $size, $index, $parity) {
- if ($size > MAX_STRUCTURED_SYMBOLS) {
- return -1;
- }
- if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) {
- return -1;
- }
- $buf = array($size, $index, $parity);
- $entry = $this->newInputItem(QR_MODE_ST, 3, buf);
- array_unshift($items, $entry);
- return $items;
- }
-
- /**
- * calcParity
- * @param $items (array)
- * @return int parity
- */
- protected function calcParity($items) {
- $parity = 0;
- foreach ($items as $item) {
- if ($item['mode'] != QR_MODE_ST) {
- for ($i=$item['size']-1; $i>=0; --$i) {
- $parity ^= $item['data'][$i];
- }
- }
- }
- return $parity;
- }
-
- /**
- * checkModeNum
- * @param $size (int)
- * @param $data (array)
- * @return boolean true or false
- */
- protected function checkModeNum($size, $data) {
- for ($i=0; $i<$size; ++$i) {
- if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){
- return false;
- }
- }
- return true;
- }
-
- /**
- * Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19).
- * @param $c (int) character value
- * @return value
- */
- protected function lookAnTable($c) {
- return (($c > 127)?-1:$this->anTable[$c]);
- }
-
- /**
- * checkModeAn
- * @param $size (int)
- * @param $data (array)
- * @return boolean true or false
- */
- protected function checkModeAn($size, $data) {
- for ($i=0; $i<$size; ++$i) {
- if ($this->lookAnTable(ord($data[$i])) == -1) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * estimateBitsModeNum
- * @param $size (int)
- * @return int number of bits
- */
- protected function estimateBitsModeNum($size) {
- $w = (int)($size / 3);
- $bits = ($w * 10);
- switch($size - ($w * 3)) {
- case 1: {
- $bits += 4;
- break;
- }
- case 2: {
- $bits += 7;
- break;
- }
- }
- return $bits;
- }
-
- /**
- * estimateBitsModeAn
- * @param $size (int)
- * @return int number of bits
- */
- protected function estimateBitsModeAn($size) {
- $bits = (int)($size * 5.5); // (size / 2 ) * 11
- if ($size & 1) {
- $bits += 6;
- }
- return $bits;
- }
-
- /**
- * estimateBitsMode8
- * @param $size (int)
- * @return int number of bits
- */
- protected function estimateBitsMode8($size) {
- return (int)($size * 8);
- }
-
- /**
- * estimateBitsModeKanji
- * @param $size (int)
- * @return int number of bits
- */
- protected function estimateBitsModeKanji($size) {
- return (int)($size * 6.5); // (size / 2 ) * 13
- }
-
- /**
- * checkModeKanji
- * @param $size (int)
- * @param $data (array)
- * @return boolean true or false
- */
- protected function checkModeKanji($size, $data) {
- if ($size & 1) {
- return false;
- }
- for ($i=0; $i<$size; $i+=2) {
- $val = (ord($data[$i]) << 8) | ord($data[$i+1]);
- if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Validate the input data.
- * @param $mode (int) encoding mode.
- * @param $size (int) size of data (byte).
- * @param $data (array) data to validate
- * @return boolean true in case of valid data, false otherwise
- */
- protected function check($mode, $size, $data) {
- if ($size <= 0) {
- return false;
- }
- switch($mode) {
- case QR_MODE_NM: {
- return $this->checkModeNum($size, $data);
- }
- case QR_MODE_AN: {
- return $this->checkModeAn($size, $data);
- }
- case QR_MODE_KJ: {
- return $this->checkModeKanji($size, $data);
- }
- case QR_MODE_8B: {
- return true;
- }
- case QR_MODE_ST: {
- return true;
- }
- default: {
- break;
- }
- }
- return false;
- }
-
- /**
- * estimateBitStreamSize
- * @param $items (array)
- * @param $version (int)
- * @return int bits
- */
- protected function estimateBitStreamSize($items, $version) {
- $bits = 0;
- if ($version == 0) {
- $version = 1;
- }
- foreach ($items as $item) {
- switch($item['mode']) {
- case QR_MODE_NM: {
- $bits = $this->estimateBitsModeNum($item['size']);
- break;
- }
- case QR_MODE_AN: {
- $bits = $this->estimateBitsModeAn($item['size']);
- break;
- }
- case QR_MODE_8B: {
- $bits = $this->estimateBitsMode8($item['size']);
- break;
- }
- case QR_MODE_KJ: {
- $bits = $this->estimateBitsModeKanji($item['size']);
- break;
- }
- case QR_MODE_ST: {
- return STRUCTURE_HEADER_BITS;
- }
- default: {
- return 0;
- }
- }
- $l = $this->lengthIndicator($item['mode'], $version);
- $m = 1 << $l;
- $num = (int)(($item['size'] + $m - 1) / $m);
- $bits += $num * (4 + $l);
- }
- return $bits;
- }
-
- /**
- * estimateVersion
- * @param $items (array)
- * @return int version
- */
- protected function estimateVersion($items) {
- $version = 0;
- $prev = 0;
- do {
- $prev = $version;
- $bits = $this->estimateBitStreamSize($items, $prev);
- $version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
- if ($version < 0) {
- return -1;
- }
- } while ($version > $prev);
- return $version;
- }
-
- /**
- * lengthOfCode
- * @param $mode (int)
- * @param $version (int)
- * @param $bits (int)
- * @return int size
- */
- protected function lengthOfCode($mode, $version, $bits) {
- $payload = $bits - 4 - $this->lengthIndicator($mode, $version);
- switch($mode) {
- case QR_MODE_NM: {
- $chunks = (int)($payload / 10);
- $remain = $payload - $chunks * 10;
- $size = $chunks * 3;
- if ($remain >= 7) {
- $size += 2;
- } elseif ($remain >= 4) {
- $size += 1;
- }
- break;
- }
- case QR_MODE_AN: {
- $chunks = (int)($payload / 11);
- $remain = $payload - $chunks * 11;
- $size = $chunks * 2;
- if ($remain >= 6) {
- ++$size;
- }
- break;
- }
- case QR_MODE_8B: {
- $size = (int)($payload / 8);
- break;
- }
- case QR_MODE_KJ: {
- $size = (int)(($payload / 13) * 2);
- break;
- }
- case QR_MODE_ST: {
- $size = (int)($payload / 8);
- break;
- }
- default: {
- $size = 0;
- break;
- }
- }
- $maxsize = $this->maximumWords($mode, $version);
- if ($size < 0) {
- $size = 0;
- }
- if ($size > $maxsize) {
- $size = $maxsize;
- }
- return $size;
- }
-
- /**
- * createBitStream
- * @param $items (array)
- * @return array of items and total bits
- */
- protected function createBitStream($items) {
- $total = 0;
- foreach ($items as $key => $item) {
- $items[$key] = $this->encodeBitStream($item, $this->version);
- $bits = count($items[$key]['bstream']);
- $total += $bits;
- }
- return array($items, $total);
- }
-
- /**
- * convertData
- * @param $items (array)
- * @return array items
- */
- protected function convertData($items) {
- $ver = $this->estimateVersion($items);
- if ($ver > $this->version) {
- $this->version = $ver;
- }
- while (true) {
- $cbs = $this->createBitStream($items);
- $items = $cbs[0];
- $bits = $cbs[1];
- if ($bits < 0) {
- return -1;
- }
- $ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
- if ($ver < 0) {
- return -1;
- } elseif ($ver > $this->version) {
- $this->version = $ver;
- } else {
- break;
- }
- }
- return $items;
- }
-
- /**
- * Append Padding Bit to bitstream
- * @param $bstream (array)
- * @return array bitstream
- */
- protected function appendPaddingBit($bstream) {
- if (is_null($bstream)) {
- return null;
- }
- $bits = count($bstream);
- $maxwords = $this->getDataLength($this->version, $this->level);
- $maxbits = $maxwords * 8;
- if ($maxbits == $bits) {
- return $bstream;
- }
- if ($maxbits - $bits < 5) {
- return $this->appendNum($bstream, $maxbits - $bits, 0);
- }
- $bits += 4;
- $words = (int)(($bits + 7) / 8);
- $padding = array();
- $padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0);
- $padlen = $maxwords - $words;
- if ($padlen > 0) {
- $padbuf = array();
- for ($i=0; $i<$padlen; ++$i) {
- $padbuf[$i] = ($i&1)?0x11:0xec;
- }
- $padding = $this->appendBytes($padding, $padlen, $padbuf);
- }
- return $this->appendBitstream($bstream, $padding);
- }
-
- /**
- * mergeBitStream
- * @param $items (array) items
- * @return array bitstream
- */
- protected function mergeBitStream($items) {
- $items = $this->convertData($items);
- if (!is_array($items)) {
- return null;
- }
- $bstream = array();
- foreach ($items as $item) {
- $bstream = $this->appendBitstream($bstream, $item['bstream']);
- }
- return $bstream;
- }
-
- /**
- * Returns a stream of bits.
- * @param $items (int)
- * @return array padded merged byte stream
- */
- protected function getBitStream($items) {
- $bstream = $this->mergeBitStream($items);
- return $this->appendPaddingBit($bstream);
- }
-
- /**
- * Pack all bit streams padding bits into a byte array.
- * @param $items (int)
- * @return array padded merged byte stream
- */
- protected function getByteStream($items) {
- $bstream = $this->getBitStream($items);
- return $this->bitstreamToByte($bstream);
- }
-
- // - - - - - - - - - - - - - - - - - - - - - - - - -
-
- // QRbitstream
-
- /**
- * Return an array with zeros
- * @param $setLength (int) array size
- * @return array
- */
- protected function allocate($setLength) {
- return array_fill(0, $setLength, 0);
- }
-
- /**
- * Return new bitstream from number
- * @param $bits (int) number of bits
- * @param $num (int) number
- * @return array bitstream
- */
- protected function newFromNum($bits, $num) {
- $bstream = $this->allocate($bits);
- $mask = 1 << ($bits - 1);
- for ($i=0; $i<$bits; ++$i) {
- if ($num & $mask) {
- $bstream[$i] = 1;
- } else {
- $bstream[$i] = 0;
- }
- $mask = $mask >> 1;
- }
- return $bstream;
- }
-
- /**
- * Return new bitstream from bytes
- * @param $size (int) size
- * @param $data (array) bytes
- * @return array bitstream
- */
- protected function newFromBytes($size, $data) {
- $bstream = $this->allocate($size * 8);
- $p=0;
- for ($i=0; $i<$size; ++$i) {
- $mask = 0x80;
- for ($j=0; $j<8; ++$j) {
- if ($data[$i] & $mask) {
- $bstream[$p] = 1;
- } else {
- $bstream[$p] = 0;
- }
- $p++;
- $mask = $mask >> 1;
- }
- }
- return $bstream;
- }
-
- /**
- * Append one bitstream to another
- * @param $bitstream (array) original bitstream
- * @param $append (array) bitstream to append
- * @return array bitstream
- */
- protected function appendBitstream($bitstream, $append) {
- if ((!is_array($append)) OR (count($append) == 0)) {
- return $bitstream;
- }
- if (count($bitstream) == 0) {
- return $append;
- }
- return array_values(array_merge($bitstream, $append));
- }
-
- /**
- * Append one bitstream created from number to another
- * @param $bitstream (array) original bitstream
- * @param $bits (int) number of bits
- * @param $num (int) number
- * @return array bitstream
- */
- protected function appendNum($bitstream, $bits, $num) {
- if ($bits == 0) {
- return 0;
- }
- $b = $this->newFromNum($bits, $num);
- return $this->appendBitstream($bitstream, $b);
- }
-
- /**
- * Append one bitstream created from bytes to another
- * @param $bitstream (array) original bitstream
- * @param $size (int) size
- * @param $data (array) bytes
- * @return array bitstream
- */
- protected function appendBytes($bitstream, $size, $data) {
- if ($size == 0) {
- return 0;
- }
- $b = $this->newFromBytes($size, $data);
- return $this->appendBitstream($bitstream, $b);
- }
-
- /**
- * Convert bitstream to bytes
- * @param $bstream (array) original bitstream
- * @return array of bytes
- */
- protected function bitstreamToByte($bstream) {
- if (is_null($bstream)) {
- return null;
- }
- $size = count($bstream);
- if ($size == 0) {
- return array();
- }
- $data = array_fill(0, (int)(($size + 7) / 8), 0);
- $bytes = (int)($size / 8);
- $p = 0;
- for ($i=0; $i<$bytes; $i++) {
- $v = 0;
- for ($j=0; $j<8; $j++) {
- $v = $v << 1;
- $v |= $bstream[$p];
- $p++;
- }
- $data[$i] = $v;
- }
- if ($size & 7) {
- $v = 0;
- for ($j=0; $j<($size & 7); $j++) {
- $v = $v << 1;
- $v |= $bstream[$p];
- $p++;
- }
- $data[$bytes] = $v;
- }
- return $data;
- }
-
- // - - - - - - - - - - - - - - - - - - - - - - - - -
-
- // QRspec
-
- /**
- * Replace a value on the array at the specified position
- * @param $srctab (array)
- * @param $x (int) X position
- * @param $y (int) Y position
- * @param $repl (string) value to replace
- * @param $replLen (int) length of the repl string
- * @return array srctab
- */
- protected function qrstrset($srctab, $x, $y, $repl, $replLen=false) {
- $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));
- return $srctab;
- }
-
- /**
- * Return maximum data code length (bytes) for the version.
- * @param $version (int) version
- * @param $level (int) error correction level
- * @return int maximum size (bytes)
- */
- protected function getDataLength($version, $level) {
- return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level];
- }
-
- /**
- * Return maximum error correction code length (bytes) for the version.
- * @param $version (int) version
- * @param $level (int) error correction level
- * @return int ECC size (bytes)
- */
- protected function getECCLength($version, $level){
- return $this->capacity[$version][QRCAP_EC][$level];
- }
-
- /**
- * Return the width of the symbol for the version.
- * @param $version (int) version
- * @return int width
- */
- protected function getWidth($version) {
- return $this->capacity[$version][QRCAP_WIDTH];
- }
-
- /**
- * Return the numer of remainder bits.
- * @param $version (int) version
- * @return int number of remainder bits
- */
- protected function getRemainder($version) {
- return $this->capacity[$version][QRCAP_REMINDER];
- }
-
- /**
- * Return a version number that satisfies the input code length.
- * @param $size (int) input code length (bytes)
- * @param $level (int) error correction level
- * @return int version number
- */
- protected function getMinimumVersion($size, $level) {
- for ($i = 1; $i <= QRSPEC_VERSION_MAX; ++$i) {
- $words = ($this->capacity[$i][QRCAP_WORDS] - $this->capacity[$i][QRCAP_EC][$level]);
- if ($words >= $size) {
- return $i;
- }
- }
- // the size of input data is greater than QR capacity, try to lover the error correction mode
- return -1;
- }
-
- /**
- * Return the size of length indicator for the mode and version.
- * @param $mode (int) encoding mode
- * @param $version (int) version
- * @return int the size of the appropriate length indicator (bits).
- */
- protected function lengthIndicator($mode, $version) {
- if ($mode == QR_MODE_ST) {
- return 0;
- }
- if ($version <= 9) {
- $l = 0;
- } elseif ($version <= 26) {
- $l = 1;
- } else {
- $l = 2;
- }
- return $this->lengthTableBits[$mode][$l];
- }
-
- /**
- * Return the maximum length for the mode and version.
- * @param $mode (int) encoding mode
- * @param $version (int) version
- * @return int the maximum length (bytes)
- */
- protected function maximumWords($mode, $version) {
- if ($mode == QR_MODE_ST) {
- return 3;
- }
- if ($version <= 9) {
- $l = 0;
- } else if ($version <= 26) {
- $l = 1;
- } else {
- $l = 2;
- }
- $bits = $this->lengthTableBits[$mode][$l];
- $words = (1 << $bits) - 1;
- if ($mode == QR_MODE_KJ) {
- $words *= 2; // the number of bytes is required
- }
- return $words;
- }
-
- /**
- * Return an array of ECC specification.
- * @param $version (int) version
- * @param $level (int) error correction level
- * @param $spec (array) an array of ECC specification contains as following: {# of type1 blocks, # of data code, # of ecc code, # of type2 blocks, # of data code}
- * @return array spec
- */
- protected function getEccSpec($version, $level, $spec) {
- if (count($spec) < 5) {
- $spec = array(0, 0, 0, 0, 0);
- }
- $b1 = $this->eccTable[$version][$level][0];
- $b2 = $this->eccTable[$version][$level][1];
- $data = $this->getDataLength($version, $level);
- $ecc = $this->getECCLength($version, $level);
- if ($b2 == 0) {
- $spec[0] = $b1;
- $spec[1] = (int)($data / $b1);
- $spec[2] = (int)($ecc / $b1);
- $spec[3] = 0;
- $spec[4] = 0;
- } else {
- $spec[0] = $b1;
- $spec[1] = (int)($data / ($b1 + $b2));
- $spec[2] = (int)($ecc / ($b1 + $b2));
- $spec[3] = $b2;
- $spec[4] = $spec[1] + 1;
- }
- return $spec;
- }
-
- /**
- * Put an alignment marker.
- * @param $frame (array) frame
- * @param $ox (int) X center coordinate of the pattern
- * @param $oy (int) Y center coordinate of the pattern
- * @return array frame
- */
- protected function putAlignmentMarker($frame, $ox, $oy) {
- $finder = array(
- "\xa1\xa1\xa1\xa1\xa1",
- "\xa1\xa0\xa0\xa0\xa1",
- "\xa1\xa0\xa1\xa0\xa1",
- "\xa1\xa0\xa0\xa0\xa1",
- "\xa1\xa1\xa1\xa1\xa1"
- );
- $yStart = $oy - 2;
- $xStart = $ox - 2;
- for ($y=0; $y < 5; $y++) {
- $frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]);
- }
- return $frame;
- }
-
- /**
- * Put an alignment pattern.
- * @param $version (int) version
- * @param $frame (array) frame
- * @param $width (int) width
- * @return array frame
- */
- protected function putAlignmentPattern($version, $frame, $width) {
- if ($version < 2) {
- return $frame;
- }
- $d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0];
- if ($d < 0) {
- $w = 2;
- } else {
- $w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2);
- }
- if ($w * $w - 3 == 1) {
- $x = $this->alignmentPattern[$version][0];
- $y = $this->alignmentPattern[$version][0];
- $frame = $this->putAlignmentMarker($frame, $x, $y);
- return $frame;
- }
- $cx = $this->alignmentPattern[$version][0];
- $wo = $w - 1;
- for ($x=1; $x < $wo; ++$x) {
- $frame = $this->putAlignmentMarker($frame, 6, $cx);
- $frame = $this->putAlignmentMarker($frame, $cx, 6);
- $cx += $d;
- }
- $cy = $this->alignmentPattern[$version][0];
- for ($y=0; $y < $wo; ++$y) {
- $cx = $this->alignmentPattern[$version][0];
- for ($x=0; $x < $wo; ++$x) {
- $frame = $this->putAlignmentMarker($frame, $cx, $cy);
- $cx += $d;
- }
- $cy += $d;
- }
- return $frame;
- }
-
- /**
- * Return BCH encoded version information pattern that is used for the symbol of version 7 or greater. Use lower 18 bits.
- * @param $version (int) version
- * @return BCH encoded version information pattern
- */
- protected function getVersionPattern($version) {
- if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) {
- return 0;
- }
- return $this->versionPattern[($version - 7)];
- }
-
- /**
- * Return BCH encoded format information pattern.
- * @param $mask (array)
- * @param $level (int) error correction level
- * @return BCH encoded format information pattern
- */
- protected function getFormatInfo($mask, $level) {
- if (($mask < 0) OR ($mask > 7)) {
- return 0;
- }
- if (($level < 0) OR ($level > 3)) {
- return 0;
- }
- return $this->formatInfo[$level][$mask];
- }
-
- /**
- * Put a finder pattern.
- * @param $frame (array) frame
- * @param $ox (int) X center coordinate of the pattern
- * @param $oy (int) Y center coordinate of the pattern
- * @return array frame
- */
- protected function putFinderPattern($frame, $ox, $oy) {
- $finder = array(
- "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
- "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
- "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
- "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
- "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
- "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
- "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
- );
- for ($y=0; $y < 7; $y++) {
- $frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]);
- }
- return $frame;
- }
-
- /**
- * Return a copy of initialized frame.
- * @param $version (int) version
- * @return Array of unsigned char.
- */
- protected function createFrame($version) {
- $width = $this->capacity[$version][QRCAP_WIDTH];
- $frameLine = str_repeat ("\0", $width);
- $frame = array_fill(0, $width, $frameLine);
- // Finder pattern
- $frame = $this->putFinderPattern($frame, 0, 0);
- $frame = $this->putFinderPattern($frame, $width - 7, 0);
- $frame = $this->putFinderPattern($frame, 0, $width - 7);
- // Separator
- $yOffset = $width - 7;
- for ($y=0; $y < 7; ++$y) {
- $frame[$y][7] = "\xc0";
- $frame[$y][$width - 8] = "\xc0";
- $frame[$yOffset][7] = "\xc0";
- ++$yOffset;
- }
- $setPattern = str_repeat("\xc0", 8);
- $frame = $this->qrstrset($frame, 0, 7, $setPattern);
- $frame = $this->qrstrset($frame, $width-8, 7, $setPattern);
- $frame = $this->qrstrset($frame, 0, $width - 8, $setPattern);
- // Format info
- $setPattern = str_repeat("\x84", 9);
- $frame = $this->qrstrset($frame, 0, 8, $setPattern);
- $frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8);
- $yOffset = $width - 8;
- for ($y=0; $y < 8; ++$y,++$yOffset) {
- $frame[$y][8] = "\x84";
- $frame[$yOffset][8] = "\x84";
- }
- // Timing pattern
- $wo = $width - 15;
- for ($i=1; $i < $wo; ++$i) {
- $frame[6][7+$i] = chr(0x90 | ($i & 1));
- $frame[7+$i][6] = chr(0x90 | ($i & 1));
- }
- // Alignment pattern
- $frame = $this->putAlignmentPattern($version, $frame, $width);
- // Version information
- if ($version >= 7) {
- $vinf = $this->getVersionPattern($version);
- $v = $vinf;
- for ($x=0; $x<6; ++$x) {
- for ($y=0; $y<3; ++$y) {
- $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
- $v = $v >> 1;
- }
- }
- $v = $vinf;
- for ($y=0; $y<6; ++$y) {
- for ($x=0; $x<3; ++$x) {
- $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
- $v = $v >> 1;
- }
- }
- }
- // and a little bit...
- $frame[$width - 8][8] = "\x81";
- return $frame;
- }
-
- /**
- * Set new frame for the specified version.
- * @param $version (int) version
- * @return Array of unsigned char.
- */
- protected function newFrame($version) {
- if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) {
- return NULL;
- }
- if (!isset($this->frames[$version])) {
- $this->frames[$version] = $this->createFrame($version);
- }
- if (is_null($this->frames[$version])) {
- return NULL;
- }
- return $this->frames[$version];
- }
-
- /**
- * Return block number 0
- * @param $spec (array)
- * @return int value
- */
- protected function rsBlockNum($spec) {
- return ($spec[0] + $spec[3]);
- }
-
- /**
- * Return block number 1
- * @param $spec (array)
- * @return int value
- */
- protected function rsBlockNum1($spec) {
- return $spec[0];
- }
-
- /**
- * Return data codes 1
- * @param $spec (array)
- * @return int value
- */
- protected function rsDataCodes1($spec) {
- return $spec[1];
- }
-
- /**
- * Return ecc codes 1
- * @param $spec (array)
- * @return int value
- */
- protected function rsEccCodes1($spec) {
- return $spec[2];
- }
-
- /**
- * Return block number 2
- * @param $spec (array)
- * @return int value
- */
- protected function rsBlockNum2($spec) {
- return $spec[3];
- }
-
- /**
- * Return data codes 2
- * @param $spec (array)
- * @return int value
- */
- protected function rsDataCodes2($spec) {
- return $spec[4];
- }
-
- /**
- * Return ecc codes 2
- * @param $spec (array)
- * @return int value
- */
- protected function rsEccCodes2($spec) {
- return $spec[2];
- }
-
- /**
- * Return data length
- * @param $spec (array)
- * @return int value
- */
- protected function rsDataLength($spec) {
- return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]);
- }
-
- /**
- * Return ecc length
- * @param $spec (array)
- * @return int value
- */
- protected function rsEccLength($spec) {
- return ($spec[0] + $spec[3]) * $spec[2];
- }
-
- // - - - - - - - - - - - - - - - - - - - - - - - - -
-
- // QRrs
-
- /**
- * Initialize a Reed-Solomon codec and add it to existing rsitems
- * @param $symsize (int) symbol size, bits
- * @param $gfpoly (int) Field generator polynomial coefficients
- * @param $fcr (int) first root of RS code generator polynomial, index form
- * @param $prim (int) primitive element to generate polynomial roots
- * @param $nroots (int) RS code generator polynomial degree (number of roots)
- * @param $pad (int) padding bytes at front of shortened block
- * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>.
- */
- protected function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) {
- foreach ($this->rsitems as $rs) {
- if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize)
- OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) {
- continue;
- }
- return $rs;
- }
- $rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
- array_unshift($this->rsitems, $rs);
- return $rs;
- }
-
- // - - - - - - - - - - - - - - - - - - - - - - - - -
-
- // QRrsItem
-
- /**
- * modnn
- * @param $rs (array) RS values
- * @param $x (int) X position
- * @return int X osition
- */
- protected function modnn($rs, $x) {
- while ($x >= $rs['nn']) {
- $x -= $rs['nn'];
- $x = ($x >> $rs['mm']) + ($x & $rs['nn']);
- }
- return $x;
- }
-
- /**
- * Initialize a Reed-Solomon codec and returns an array of values.
- * @param $symsize (int) symbol size, bits
- * @param $gfpoly (int) Field generator polynomial coefficients
- * @param $fcr (int) first root of RS code generator polynomial, index form
- * @param $prim (int) primitive element to generate polynomial roots
- * @param $nroots (int) RS code generator polynomial degree (number of roots)
- * @param $pad (int) padding bytes at front of shortened block
- * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>.
- */
- protected function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) {
- // Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2)
- $rs = null;
- // Check parameter ranges
- if (($symsize < 0) OR ($symsize > 8)) {
- return $rs;
- }
- if (($fcr < 0) OR ($fcr >= (1<<$symsize))) {
- return $rs;
- }
- if (($prim <= 0) OR ($prim >= (1<<$symsize))) {
- return $rs;
- }
- if (($nroots < 0) OR ($nroots >= (1<<$symsize))) {
- return $rs;
- }
- if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) {
- return $rs;
- }
- $rs = array();
- $rs['mm'] = $symsize;
- $rs['nn'] = (1 << $symsize) - 1;
- $rs['pad'] = $pad;
- $rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0);
- $rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0);
- // PHP style macro replacement ;)
- $NN =& $rs['nn'];
- $A0 =& $NN;
- // Generate Galois field lookup tables
- $rs['index_of'][0] = $A0; // log(zero) = -inf
- $rs['alpha_to'][$A0] = 0; // alpha**-inf = 0
- $sr = 1;
- for ($i=0; $i<$rs['nn']; ++$i) {
- $rs['index_of'][$sr] = $i;
- $rs['alpha_to'][$i] = $sr;
- $sr <<= 1;
- if ($sr & (1 << $symsize)) {
- $sr ^= $gfpoly;
- }
- $sr &= $rs['nn'];
- }
- if ($sr != 1) {
- // field generator polynomial is not primitive!
- return NULL;
- }
- // Form RS code generator polynomial from its roots
- $rs['genpoly'] = array_fill(0, ($nroots + 1), 0);
- $rs['fcr'] = $fcr;
- $rs['prim'] = $prim;
- $rs['nroots'] = $nroots;
- $rs['gfpoly'] = $gfpoly;
- // Find prim-th root of 1, used in decoding
- for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) {
- ; // intentional empty-body loop!
- }
- $rs['iprim'] = (int)($iprim / $prim);
- $rs['genpoly'][0] = 1;
- for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
- $rs['genpoly'][$i+1] = 1;
- // Multiply rs->genpoly[] by @**(root + x)
- for ($j = $i; $j > 0; --$j) {
- if ($rs['genpoly'][$j] != 0) {
- $rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)];
- } else {
- $rs['genpoly'][$j] = $rs['genpoly'][$j-1];
- }
- }
- // rs->genpoly[0] can never be zero
- $rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)];
- }
- // convert rs->genpoly[] to index form for quicker encoding
- for ($i = 0; $i <= $nroots; ++$i) {
- $rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]];
- }
- return $rs;
- }
-
- /**
- * Encode a Reed-Solomon codec and returns the parity array
- * @param $rs (array) RS values
- * @param $data (array) data
- * @param $parity (array) parity
- * @return parity array
- */
- protected function encode_rs_char($rs, $data, $parity) {
- $MM =& $rs['mm']; // bits per symbol
- $NN =& $rs['nn']; // the total number of symbols in a RS block
- $ALPHA_TO =& $rs['alpha_to']; // the address of an array of NN elements to convert Galois field elements in index (log) form to polynomial form
- $INDEX_OF =& $rs['index_of']; // the address of an array of NN elements to convert Galois field elements in polynomial form to index (log) form
- $GENPOLY =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form
- $NROOTS =& $rs['nroots']; // the number of roots in the RS code generator polynomial, which is the same as the number of parity symbols in a block
- $FCR =& $rs['fcr']; // first consecutive root, index form
- $PRIM =& $rs['prim']; // primitive element, index form
- $IPRIM =& $rs['iprim']; // prim-th root of 1, index form
- $PAD =& $rs['pad']; // the number of pad symbols in a block
- $A0 =& $NN;
- $parity = array_fill(0, $NROOTS, 0);
- for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) {
- $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
- if ($feedback != $A0) {
- // feedback term is non-zero
- // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
- // always be for the polynomials constructed by init_rs()
- $feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback);
- for ($j=1; $j < $NROOTS; ++$j) {
- $parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])];
- }
- }
- // Shift
- array_shift($parity);
- if ($feedback != $A0) {
- array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]);
- } else {
- array_push($parity, 0);
- }
- }
- return $parity;
- }
-
-} // end QRcode class
-
-//============================================================+
-// END OF FILE
-//============================================================+
diff --git a/libs/tcpdf/tcpdf_barcodes_1d.php b/libs/tcpdf/tcpdf_barcodes_1d.php
deleted file mode 100644
index 83a44ece9d..0000000000
--- a/libs/tcpdf/tcpdf_barcodes_1d.php
+++ /dev/null
@@ -1,2287 +0,0 @@
-<?php
-//============================================================+
-// File name : tcpdf_barcodes_1d.php
-// Version : 1.0.025
-// Begin : 2008-06-09
-// Last Update : 2013-03-17
-// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
-// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
-// -------------------------------------------------------------------
-// Copyright (C) 2008-2013 Nicola Asuni - Tecnick.com LTD
-//
-// This file is part of TCPDF software library.
-//
-// TCPDF 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 3 of the
-// License, or (at your option) any later version.
-//
-// TCPDF 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 TCPDF. If not, see <http://www.gnu.org/licenses/>.
-//
-// See LICENSE.TXT file for more information.
-// -------------------------------------------------------------------
-//
-// Description : PHP class to creates array representations for
-// common 1D barcodes to be used with TCPDF.
-//
-//============================================================+
-
-/**
- * @file
- * PHP class to creates array representations for common 1D barcodes to be used with TCPDF.
- * @package com.tecnick.tcpdf
- * @author Nicola Asuni
- * @version 1.0.025
- */
-
-/**
- * @class TCPDFBarcode
- * PHP class to creates array representations for common 1D barcodes to be used with TCPDF (http://www.tcpdf.org).<br>
- * @package com.tecnick.tcpdf
- * @version 1.0.025
- * @author Nicola Asuni
- */
-class TCPDFBarcode {
-
- /**
- * Array representation of barcode.
- * @protected
- */
- protected $barcode_array;
-
- /**
- * This is the class constructor.
- * Return an array representations for common 1D barcodes:<ul>
- * <li>$arrcode['code'] code to be printed on text label</li>
- * <li>$arrcode['maxh'] max barcode height</li>
- * <li>$arrcode['maxw'] max barcode width</li>
- * <li>$arrcode['bcode'][$k] single bar or space in $k position</li>
- * <li>$arrcode['bcode'][$k]['t'] bar type: true = bar, false = space.</li>
- * <li>$arrcode['bcode'][$k]['w'] bar width in units.</li>
- * <li>$arrcode['bcode'][$k]['h'] bar height in units.</li>
- * <li>$arrcode['bcode'][$k]['p'] bar top position (0 = top, 1 = middle)</li></ul>
- * @param $code (string) code to print
- * @param $type (string) type of barcode: <ul><li>C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.</li><li>C39+ : CODE 39 with checksum</li><li>C39E : CODE 39 EXTENDED</li><li>C39E+ : CODE 39 EXTENDED + CHECKSUM</li><li>C93 : CODE 93 - USS-93</li><li>S25 : Standard 2 of 5</li><li>S25+ : Standard 2 of 5 + CHECKSUM</li><li>I25 : Interleaved 2 of 5</li><li>I25+ : Interleaved 2 of 5 + CHECKSUM</li><li>C128 : CODE 128</li><li>C128A : CODE 128 A</li><li>C128B : CODE 128 B</li><li>C128C : CODE 128 C</li><li>EAN2 : 2-Digits UPC-Based Extention</li><li>EAN5 : 5-Digits UPC-Based Extention</li><li>EAN8 : EAN 8</li><li>EAN13 : EAN 13</li><li>UPCA : UPC-A</li><li>UPCE : UPC-E</li><li>MSI : MSI (Variation of Plessey code)</li><li>MSI+ : MSI + CHECKSUM (modulo 11)</li><li>POSTNET : POSTNET</li><li>PLANET : PLANET</li><li>RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)</li><li>KIX : KIX (Klant index - Customer index)</li><li>IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200</li><li>CODABAR : CODABAR</li><li>CODE11 : CODE 11</li><li>PHARMA : PHARMACODE</li><li>PHARMA2T : PHARMACODE TWO-TRACKS</li></ul>
- * @public
- */
- public function __construct($code, $type) {
- $this->setBarcode($code, $type);
- }
-
- /**
- * Return an array representations of barcode.
- * @return array
- * @public
- */
- public function getBarcodeArray() {
- return $this->barcode_array;
- }
-
- /**
- * Send barcode as SVG image object to the standard output.
- * @param $w (int) Minimum width of a single bar in user units.
- * @param $h (int) Height of barcode in user units.
- * @param $color (string) Foreground color (in SVG format) for bar elements (background is transparent).
- * @public
- */
- public function getBarcodeSVG($w=2, $h=30, $color='black') {
- // send headers
- $code = $this->getBarcodeSVGcode($w, $h, $color);
- header('Content-Type: application/svg+xml');
- header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
- header('Pragma: public');
- header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
- header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
- header('Content-Disposition: inline; filename="'.md5($code).'.svg";');
- //header('Content-Length: '.strlen($code));
- echo $code;
- }
-
- /**
- * Return a SVG string representation of barcode.
- * @param $w (int) Minimum width of a single bar in user units.
- * @param $h (int) Height of barcode in user units.
- * @param $color (string) Foreground color (in SVG format) for bar elements (background is transparent).
- * @return string SVG code.
- * @public
- */
- public function getBarcodeSVGcode($w=2, $h=30, $color='black') {
- // replace table for special characters
- $repstr = array("\0" => '', '&' => '&amp;', '<' => '&lt;', '>' => '&gt;');
- $svg = '<'.'?'.'xml version="1.0" standalone="no"'.'?'.'>'."\n";
- $svg .= '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'."\n";
- $svg .= '<svg width="'.round(($this->barcode_array['maxw'] * $w), 3).'" height="'.$h.'" version="1.1" xmlns="http://www.w3.org/2000/svg">'."\n";
- $svg .= "\t".'<desc>'.strtr($this->barcode_array['code'], $repstr).'</desc>'."\n";
- $svg .= "\t".'<g id="bars" fill="'.$color.'" stroke="none">'."\n";
- // print bars
- $x = 0;
- foreach ($this->barcode_array['bcode'] as $k => $v) {
- $bw = round(($v['w'] * $w), 3);
- $bh = round(($v['h'] * $h / $this->barcode_array['maxh']), 3);
- if ($v['t']) {
- $y = round(($v['p'] * $h / $this->barcode_array['maxh']), 3);
- // draw a vertical bar
- $svg .= "\t\t".'<rect x="'.$x.'" y="'.$y.'" width="'.$bw.'" height="'.$bh.'" />'."\n";
- }
- $x += $bw;
- }
- $svg .= "\t".'</g>'."\n";
- $svg .= '</svg>'."\n";
- return $svg;
- }
-
- /**
- * Return an HTML representation of barcode.
- * @param $w (int) Width of a single bar element in pixels.
- * @param $h (int) Height of a single bar element in pixels.
- * @param $color (string) Foreground color for bar elements (background is transparent).
- * @return string HTML code.
- * @public
- */
- public function getBarcodeHTML($w=2, $h=30, $color='black') {
- $html = '<div style="font-size:0;position:relative;width:'.($this->barcode_array['maxw'] * $w).'px;height:'.($h).'px;">'."\n";
- // print bars
- $x = 0;
- foreach ($this->barcode_array['bcode'] as $k => $v) {
- $bw = round(($v['w'] * $w), 3);
- $bh = round(($v['h'] * $h / $this->barcode_array['maxh']), 3);
- if ($v['t']) {
- $y = round(($v['p'] * $h / $this->barcode_array['maxh']), 3);
- // draw a vertical bar
- $html .= '<div style="background-color:'.$color.';width:'.$bw.'px;height:'.$bh.'px;position:absolute;left:'.$x.'px;top:'.$y.'px;">&nbsp;</div>'."\n";
- }
- $x += $bw;
- }
- $html .= '</div>'."\n";
- return $html;
- }
-
- /**
- * Return a PNG image representation of barcode (requires GD or Imagick library).
- * @param $w (int) Width of a single bar element in pixels.
- * @param $h (int) Height of a single bar element in pixels.
- * @param $color (array) RGB (0-255) foreground color for bar elements (background is transparent).
- * @return image or false in case of error.
- * @public
- */
- public function getBarcodePNG($w=2, $h=30, $color=array(0,0,0)) {
- // calculate image size
- $width = ($this->barcode_array['maxw'] * $w);
- $height = $h;
- if (function_exists('imagecreate')) {
- // GD library
- $imagick = false;
- $png = imagecreate($width, $height);
- $bgcol = imagecolorallocate($png, 255, 255, 255);
- imagecolortransparent($png, $bgcol);
- $fgcol = imagecolorallocate($png, $color[0], $color[1], $color[2]);
- } elseif (extension_loaded('imagick')) {
- $imagick = true;
- $bgcol = new imagickpixel('rgb(255,255,255');
- $fgcol = new imagickpixel('rgb('.$color[0].','.$color[1].','.$color[2].')');
- $png = new Imagick();
- $png->newImage($width, $height, 'none', 'png');
- $bar = new imagickdraw();
- $bar->setfillcolor($fgcol);
- } else {
- return false;
- }
- // print bars
- $x = 0;
- foreach ($this->barcode_array['bcode'] as $k => $v) {
- $bw = round(($v['w'] * $w), 3);
- $bh = round(($v['h'] * $h / $this->barcode_array['maxh']), 3);
- if ($v['t']) {
- $y = round(($v['p'] * $h / $this->barcode_array['maxh']), 3);
- // draw a vertical bar
- if ($imagick) {
- $bar->rectangle($x, $y, ($x + $bw - 1), ($y + $bh - 1));
- } else {
- imagefilledrectangle($png, $x, $y, ($x + $bw - 1), ($y + $bh - 1), $fgcol);
- }
- }
- $x += $bw;
- }
- // send headers
- header('Content-Type: image/png');
- header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
- header('Pragma: public');
- header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
- header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
- if ($imagick) {
- $png->drawimage($bar);
- echo $png;
- } else {
- imagepng($png);
- imagedestroy($png);
- }
- }
-
- /**
- * Set the barcode.
- * @param $code (string) code to print
- * @param $type (string) type of barcode: <ul><li>C39 : CODE 39 - ANSI MH10.8M-1983 - USD-3 - 3 of 9.</li><li>C39+ : CODE 39 with checksum</li><li>C39E : CODE 39 EXTENDED</li><li>C39E+ : CODE 39 EXTENDED + CHECKSUM</li><li>C93 : CODE 93 - USS-93</li><li>S25 : Standard 2 of 5</li><li>S25+ : Standard 2 of 5 + CHECKSUM</li><li>I25 : Interleaved 2 of 5</li><li>I25+ : Interleaved 2 of 5 + CHECKSUM</li><li>C128 : CODE 128</li><li>C128A : CODE 128 A</li><li>C128B : CODE 128 B</li><li>C128C : CODE 128 C</li><li>EAN2 : 2-Digits UPC-Based Extention</li><li>EAN5 : 5-Digits UPC-Based Extention</li><li>EAN8 : EAN 8</li><li>EAN13 : EAN 13</li><li>UPCA : UPC-A</li><li>UPCE : UPC-E</li><li>MSI : MSI (Variation of Plessey code)</li><li>MSI+ : MSI + CHECKSUM (modulo 11)</li><li>POSTNET : POSTNET</li><li>PLANET : PLANET</li><li>RMS4CC : RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)</li><li>KIX : KIX (Klant index - Customer index)</li><li>IMB: Intelligent Mail Barcode - Onecode - USPS-B-3200</li><li>CODABAR : CODABAR</li><li>CODE11 : CODE 11</li><li>PHARMA : PHARMACODE</li><li>PHARMA2T : PHARMACODE TWO-TRACKS</li></ul>
- * @return array barcode array
- * @public
- */
- 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 '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 'C128': { // CODE 128
- $arrcode = $this->barcode_c128($code, '');
- 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 'EAN2': { // 2-Digits UPC-Based Extention
- $arrcode = $this->barcode_eanext($code, 2);
- break;
- }
- case 'EAN5': { // 5-Digits UPC-Based Extention
- $arrcode = $this->barcode_eanext($code, 5);
- 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 'MSI': { // MSI (Variation of Plessey code)
- $arrcode = $this->barcode_msi($code, false);
- 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 'PLANET': { // PLANET
- $arrcode = $this->barcode_postnet($code, true);
- break;
- }
- case 'RMS4CC': { // RMS4CC (Royal Mail 4-state Customer Code) - CBC (Customer Bar Code)
- $arrcode = $this->barcode_rms4cc($code, false);
- break;
- }
- case 'KIX': { // KIX (Klant index - Customer index)
- $arrcode = $this->barcode_rms4cc($code, true);
- 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 'CODE11': { // CODE 11
- $arrcode = $this->barcode_code11($code);
- break;
- }
- case 'PHARMA': { // PHARMACODE
- $arrcode = $this->barcode_pharmacode($code);
- break;
- }
- case 'PHARMA2T': { // PHARMACODE TWO-TRACKS
- $arrcode = $this->barcode_pharmacode2t($code);
- break;
- }
- default: {
- $this->barcode_array = false;
- $arrcode = false;
- break;
- }
- }
- $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 $code (string) code to represent.
- * @param $extended (boolean) if true uses the extended mode.
- * @param $checksum (boolean) if true add a checksum to the code.
- * @return array barcode representation.
- * @protected
- */
- protected function barcode_code39($code, $extended=false, $checksum=false) {
- $chr['0'] = '111331311';
- $chr['1'] = '311311113';
- $chr['2'] = '113311113';
- $chr['3'] = '313311111';
- $chr['4'] = '111331113';
- $chr['5'] = '311331111';
- $chr['6'] = '113331111';
- $chr['7'] = '111311313';
- $chr['8'] = '311311311';
- $chr['9'] = '113311311';
- $chr['A'] = '311113113';
- $chr['B'] = '113113113';
- $chr['C'] = '313113111';
- $chr['D'] = '111133113';
- $chr['E'] = '311133111';
- $chr['F'] = '113133111';
- $chr['G'] = '111113313';
- $chr['H'] = '311113311';
- $chr['I'] = '113113311';
- $chr['J'] = '111133311';
- $chr['K'] = '311111133';
- $chr['L'] = '113111133';
- $chr['M'] = '313111131';
- $chr['N'] = '111131133';
- $chr['O'] = '311131131';
- $chr['P'] = '113131131';
- $chr['Q'] = '111111333';
- $chr['R'] = '311111331';
- $chr['S'] = '113111331';
- $chr['T'] = '111131331';
- $chr['U'] = '331111113';
- $chr['V'] = '133111113';
- $chr['W'] = '333111111';
- $chr['X'] = '131131113';
- $chr['Y'] = '331131111';
- $chr['Z'] = '133131111';
- $chr['-'] = '131111313';
- $chr['.'] = '331111311';
- $chr[' '] = '133111311';
- $chr['$'] = '131313111';
- $chr['/'] = '131311131';
- $chr['+'] = '131113131';
- $chr['%'] = '111313131';
- $chr['*'] = '131131311';
- $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;
- }
- // intercharacter gap
- $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 $code (string) code to represent.
- * @return encoded string.
- * @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 $code (string) code to represent.
- * @return char checksum.
- * @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 $code (string) code to represent.
- * @return array barcode representation.
- * @protected
- */
- protected function barcode_code93($code) {
- $chr[48] = '131112'; // 0
- $chr[49] = '111213'; // 1
- $chr[50] = '111312'; // 2
- $chr[51] = '111411'; // 3
- $chr[52] = '121113'; // 4
- $chr[53] = '121212'; // 5
- $chr[54] = '121311'; // 6
- $chr[55] = '111114'; // 7
- $chr[56] = '131211'; // 8
- $chr[57] = '141111'; // 9
- $chr[65] = '211113'; // A
- $chr[66] = '211212'; // B
- $chr[67] = '211311'; // C
- $chr[68] = '221112'; // D
- $chr[69] = '221211'; // E
- $chr[70] = '231111'; // F
- $chr[71] = '112113'; // G
- $chr[72] = '112212'; // H
- $chr[73] = '112311'; // I
- $chr[74] = '122112'; // J
- $chr[75] = '132111'; // K
- $chr[76] = '111123'; // L
- $chr[77] = '111222'; // M
- $chr[78] = '111321'; // N
- $chr[79] = '121122'; // O
- $chr[80] = '131121'; // P
- $chr[81] = '212112'; // Q
- $chr[82] = '212211'; // R
- $chr[83] = '211122'; // S
- $chr[84] = '211221'; // T
- $chr[85] = '221121'; // U
- $chr[86] = '222111'; // V
- $chr[87] = '112122'; // W
- $chr[88] = '112221'; // X
- $chr[89] = '122121'; // Y
- $chr[90] = '123111'; // Z
- $chr[45] = '121131'; // -
- $chr[46] = '311112'; // .
- $chr[32] = '311211'; //
- $chr[36] = '321111'; // $
- $chr[47] = '112131'; // /
- $chr[43] = '113121'; // +
- $chr[37] = '211131'; // %
- $chr[128] = '121221'; // ($)
- $chr[129] = '311121'; // (/)
- $chr[130] = '122211'; // (+)
- $chr[131] = '312111'; // (%)
- $chr[42] = '111141'; // start-stop
- $code = strtoupper($code);
- $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_ext .= $this->checksum_code93($code_ext);
- // add start and stop codes
- $code = '*'.$code_ext.'*';
- $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
- $k = 0;
- $clen = strlen($code);
- for ($i = 0; $i < $clen; ++$i) {
- $char = ord($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 $code (string) code to represent.
- * @return string checksum code.
- * @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(131).chr(129).chr(130), '<=>?');
- $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;
- }
- }
- $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;
- }
- }
- $check %= 47;
- $k = $chars[$check];
- $checksum = $c.$k;
- // resto respecial characters
- $checksum = strtr($checksum, '<=>?', chr(128).chr(131).chr(129).chr(130));
- return $checksum;
- }
-
- /**
- * Checksum for standard 2 of 5 barcodes.
- * @param $code (string) code to process.
- * @return int checksum.
- * @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;
- }
-
- /**
- * MSI.
- * Variation of Plessey code, with similar applications
- * Contains digits (0 to 9) and encodes the data only in the width of bars.
- * @param $code (string) code to represent.
- * @param $checksum (boolean) if true add a checksum to the code (modulo 11)
- * @return array barcode representation.
- * @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;
- }
- }
- $check %= 11;
- if ($check > 0) {
- $check = 11 - $check;
- }
- $code .= $check;
- }
- $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);
- }
-
- /**
- * 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 $code (string) code to represent.
- * @param $checksum (boolean) if true add a checksum to the code
- * @return array barcode representation.
- * @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;
- }
- $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);
- }
-
- /**
- * Convert binary barcode sequence to TCPDF barcode array.
- * @param $seq (string) barcode as binary sequence.
- * @param $bararray (array) barcode array.
- * òparam array $bararray TCPDF barcode array to fill up
- * @return array barcode representation.
- * @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 $code (string) code to represent.
- * @param $checksum (boolean) if true add a checksum to the code
- * @return array barcode representation.
- * @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 ($checksum) {
- // add checksum
- $code .= $this->checksum_s25($code);
- }
- 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;
- $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};
- }
- $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 $code (string) code to represent.
- * @param $type (string) barcode type: A, B, C or empty for automatic switch (AUTO mode)
- * @return array barcode representation.
- * @protected
- */
- protected function barcode_c128($code, $type='') {
- $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 */
- );
- // ASCII characters for code A (ASCII 00 - 95)
- $keys_a = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_';
- $keys_a .= chr(0).chr(1).chr(2).chr(3).chr(4).chr(5).chr(6).chr(7).chr(8).chr(9);
- $keys_a .= chr(10).chr(11).chr(12).chr(13).chr(14).chr(15).chr(16).chr(17).chr(18).chr(19);
- $keys_a .= chr(20).chr(21).chr(22).chr(23).chr(24).chr(25).chr(26).chr(27).chr(28).chr(29);
- $keys_a .= chr(30).chr(31);
- // ASCII characters for code B (ASCII 32 - 127)
- $keys_b = ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~'.chr(127);
- // special codes
- $fnc_a = array(241 => 102, 242 => 97, 243 => 96, 244 => 101);
- $fnc_b = array(241 => 102, 242 => 97, 243 => 96, 244 => 100);
- // array of symbols
- $code_data = array();
- // lenght of the code
- $len = strlen($code);
- switch(strtoupper($type)) {
- case 'A': { // MODE A
- $startid = 103;
- for ($i = 0; $i < $len; ++$i) {
- $char = $code{$i};
- $char_id = ord($char);
- if (($char_id >= 241) AND ($char_id <= 244)) {
- $code_data[] = $fnc_a[$char_id];
- } elseif (($char_id >= 0) AND ($char_id <= 95)) {
- $code_data[] = strpos($keys_a, $char);
- } else {
- return false;
- }
- }
- break;
- }
- case 'B': { // MODE B
- $startid = 104;
- for ($i = 0; $i < $len; ++$i) {
- $char = $code{$i};
- $char_id = ord($char);
- if (($char_id >= 241) AND ($char_id <= 244)) {
- $code_data[] = $fnc_b[$char_id];
- } elseif (($char_id >= 32) AND ($char_id <= 127)) {
- $code_data[] = strpos($keys_b, $char);
- } else {
- return false;
- }
- }
- break;
- }
- case 'C': { // MODE C
- $startid = 105;
- if (ord($code{0}) == 241) {
- $code_data[] = 102;
- $code = substr($code, 1);
- --$len;
- }
- if (($len % 2) != 0) {
- // the length must be even
- return false;
- }
- for ($i = 0; $i < $len; $i+=2) {
- $chrnum = $code{$i}.$code{$i+1};
- if (preg_match('/([0-9]{2})/', $chrnum) > 0) {
- $code_data[] = intval($chrnum);
- } else {
- return false;
- }
- }
- break;
- }
- default: { // MODE AUTO
- // split code into sequences
- $sequence = array();
- // get numeric sequences (if any)
- $numseq = array();
- preg_match_all('/([0-9]{4,})/', $code, $numseq, PREG_OFFSET_CAPTURE);
- if (isset($numseq[1]) AND !empty($numseq[1])) {
- $end_offset = 0;
- foreach ($numseq[1] as $val) {
- $offset = $val[1];
- if ($offset > $end_offset) {
- // non numeric sequence
- $sequence = array_merge($sequence, $this->get128ABsequence(substr($code, $end_offset, ($offset - $end_offset))));
- }
- // numeric sequence
- $slen = strlen($val[0]);
- if (($slen % 2) != 0) {
- // the length must be even
- --$slen;
- }
- $sequence[] = array('C', substr($code, $offset, $slen), $slen);
- $end_offset = $offset + $slen;
- }
- if ($end_offset < $len) {
- $sequence = array_merge($sequence, $this->get128ABsequence(substr($code, $end_offset)));
- }
- } else {
- // text code (non C mode)
- $sequence = array_merge($sequence, $this->get128ABsequence($code));
- }
- // process the sequence
- foreach ($sequence as $key => $seq) {
- switch($seq[0]) {
- case 'A': {
- if ($key == 0) {
- $startid = 103;
- } elseif ($sequence[($key - 1)][0] != 'A') {
- if (($seq[2] == 1) AND ($key > 0) AND ($sequence[($key - 1)][0] == 'B') AND (!isset($sequence[($key - 1)][3]))) {
- // single character shift
- $code_data[] = 98;
- // mark shift
- $sequence[$key][3] = true;
- } elseif (!isset($sequence[($key - 1)][3])) {
- $code_data[] = 101;
- }
- }
- for ($i = 0; $i < $seq[2]; ++$i) {
- $char = $seq[1]{$i};
- $char_id = ord($char);
- if (($char_id >= 241) AND ($char_id <= 244)) {
- $code_data[] = $fnc_a[$char_id];
- } else {
- $code_data[] = strpos($keys_a, $char);
- }
- }
- break;
- }
- case 'B': {
- if ($key == 0) {
- $tmpchr = ord($seq[1]{0});
- if (($seq[2] == 1) AND ($tmpchr >= 241) AND ($tmpchr <= 244) AND isset($sequence[($key + 1)]) AND ($sequence[($key + 1)][0] != 'B')) {
- switch ($sequence[($key + 1)][0]) {
- case 'A': {
- $startid = 103;
- $sequence[$key][0] = 'A';
- $code_data[] = $fnc_a[$tmpchr];
- break;
- }
- case 'C': {
- $startid = 105;
- $sequence[$key][0] = 'C';
- $code_data[] = $fnc_a[$tmpchr];
- break;
- }
- }
- break;
- } else {
- $startid = 104;
- }
- } elseif ($sequence[($key - 1)][0] != 'B') {
- if (($seq[2] == 1) AND ($key > 0) AND ($sequence[($key - 1)][0] == 'A') AND (!isset($sequence[($key - 1)][3]))) {
- // single character shift
- $code_data[] = 98;
- // mark shift
- $sequence[$key][3] = true;
- } elseif (!isset($sequence[($key - 1)][3])) {
- $code_data[] = 100;
- }
- }
- for ($i = 0; $i < $seq[2]; ++$i) {
- $char = $seq[1]{$i};
- $char_id = ord($char);
- if (($char_id >= 241) AND ($char_id <= 244)) {
- $code_data[] = $fnc_b[$char_id];
- } else {
- $code_data[] = strpos($keys_b, $char);
- }
- }
- break;
- }
- case 'C': {
- if ($key == 0) {
- $startid = 105;
- } elseif ($sequence[($key - 1)][0] != 'C') {
- $code_data[] = 99;
- }
- for ($i = 0; $i < $seq[2]; $i+=2) {
- $chrnum = $seq[1]{$i}.$seq[1]{$i+1};
- $code_data[] = intval($chrnum);
- }
- break;
- }
- }
- }
- }
- }
- // calculate check character
- $sum = $startid;
- foreach ($code_data as $key => $val) {
- $sum += ($val * ($key + 1));
- }
- // add check character
- $code_data[] = ($sum % 103);
- // add stop sequence
- $code_data[] = 106;
- $code_data[] = 107;
- // add start code at the beginning
- array_unshift($code_data, $startid);
- // build barcode array
- $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
- foreach ($code_data as $val) {
- $seq = $chr[$val];
- for ($j = 0; $j < 6; ++$j) {
- if (($j % 2) == 0) {
- $t = true; // bar
- } else {
- $t = false; // space
- }
- $w = $seq{$j};
- $bararray['bcode'][] = array('t' => $t, 'w' => $w, 'h' => 1, 'p' => 0);
- $bararray['maxw'] += $w;
- }
- }
- return $bararray;
- }
-
- /**
- * Split text code in A/B sequence for 128 code
- * @param $code (string) code to split.
- * @return array sequence
- * @protected
- */
- protected function get128ABsequence($code) {
- $len = strlen($code);
- $sequence = array();
- // get A sequences (if any)
- $numseq = array();
- preg_match_all('/([\0-\31])/', $code, $numseq, PREG_OFFSET_CAPTURE);
- if (isset($numseq[1]) AND !empty($numseq[1])) {
- $end_offset = 0;
- foreach ($numseq[1] as $val) {
- $offset = $val[1];
- if ($offset > $end_offset) {
- // B sequence
- $sequence[] = array('B', substr($code, $end_offset, ($offset - $end_offset)), ($offset - $end_offset));
- }
- // A sequence
- $slen = strlen($val[0]);
- $sequence[] = array('A', substr($code, $offset, $slen), $slen);
- $end_offset = $offset + $slen;
- }
- if ($end_offset < $len) {
- $sequence[] = array('B', substr($code, $end_offset), ($len - $end_offset));
- }
- } else {
- // only B sequence
- $sequence[] = array('B', $code, $len);
- }
- return $sequence;
- }
-
- /**
- * 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 $code (string) code to represent.
- * @param $len (string) barcode type: 6 = UPC-E, 8 = EAN8, 13 = EAN13, 12 = UPC-A
- * @return array barcode representation.
- * @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 {
- $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);
- }
- }
- }
- }
- //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')
- );
- $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}];
- }
- $seq .= '010101'; // right guard bar
- } else {
- $bararray = array('code' => $code, 'maxw' => 0, 'maxh' => 1, 'bcode' => array());
- $half_len = intval(ceil($len / 2));
- if ($len == 8) {
- for ($i = 0; $i < $half_len; ++$i) {
- $seq .= $codes['A'][$code{$i}];
- }
- } else {
- $p = $parities[$code{0}];
- for ($i = 1; $i < $half_len; ++$i) {
- $seq .= $codes[$p[$i-1]][$code{$i}];
- }
- }
- $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 $code (string) code to represent.
- * @param $len (string) barcode type: 2 = 2-Digit, 5 = 5-Digit
- * @return array barcode representation.
- * @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 $code (string) zip code to represent. Must be a string containing a zip code of the form DDDDD or DDDDD-DDDD.
- * @param $planet (boolean) if true print the PLANET barcode, otherwise print POSTNET
- * @return array barcode representation.
- * @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 $code (string) code to print
- * @param $kix (boolean) 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.
- * @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;
- }
- $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 $code (string) code to represent.
- * @return array barcode representation.
- * @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 $code (string) code to represent.
- * @return array barcode representation.
- * @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);
- // calculate check digit C
- $p = 1;
- $check = 0;
- for ($i = ($len - 1); $i >= 0; --$i) {
- $digit = $code{$i};
- if ($digit == '-') {
- $dval = 10;
- } else {
- $dval = intval($digit);
- }
- $check += ($dval * $p);
- ++$p;
- if ($p > 10) {
- $p = 1;
- }
- }
- $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 {
- $dval = intval($digit);
- }
- $check += ($dval * $p);
- ++$p;
- if ($p > 9) {
- $p = 1;
- }
- }
- $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 $code (string) code to represent.
- * @return array barcode representation.
- * @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;
- }
- $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 $code (string) code to represent.
- * @return array barcode representation.
- * @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;
- }
-
-
- /**
- * 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:<ul><li>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.</li><li>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.</li><li>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.</li><li>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.</li></ul>
- * @param $code (string) code to print, separate the ZIP (routing code) from the rest using a minus char '-' (BarcodeID_ServiceTypeID_MailerID_SerialNumber-RoutingCode)
- * @return array barcode representation.
- * @protected
- */
- 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 = '';
- }
- // Conversion of Routing Code
- switch (strlen($routing_code)) {
- case 0: {
- $binary_code = 0;
- break;
- }
- case 5: {
- $binary_code = bcadd($routing_code, '1');
- break;
- }
- case 9: {
- $binary_code = bcadd($routing_code, '100001');
- break;
- }
- case 11: {
- $binary_code = bcadd($routing_code, '1000100001');
- break;
- }
- default: {
- return false;
- break;
- }
- }
- $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);
- }
- $codewords[9] = $data;
- if (($fcs >> 10) == 1) {
- $codewords[9] += 659;
- }
- // 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;
- }
- $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;
- }
-
- /**
- * Convert large integer number to hexadecimal representation.
- * (requires PHP bcmath extension)
- * @param $number (string) number to convert specified as a string
- * @return string hexadecimal representation
- */
- public function dec_to_hex($number) {
- $i = 0;
- $hex = array();
- if($number == 0) {
- return '00';
- }
- while($number > 0) {
- if($number == 0) {
- array_push($hex, '0');
- } else {
- array_push($hex, strtoupper(dechex(bcmod($number, '16'))));
- $number = bcdiv($number, '16', 0);
- }
- }
- $hex = array_reverse($hex);
- return implode($hex);
- }
-
- /**
- * Convert large hexadecimal number to decimal representation (string).
- * (requires PHP bcmath extension)
- * @param $hex (string) hexadecimal number to convert specified as a string
- * @return string hexadecimal representation
- */
- 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 $code_arr (string) array of hexadecimal values (13 bytes holding 102 bits right justified).
- * @return int 11 bit Frame Check Sequence as integer (decimal base)
- * @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);
- }
- $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 {
- $fcs = ($fcs << 1);
- }
- $fcs &= 0x7FF;
- $data <<= 1;
- }
- }
- return $fcs;
- }
-
- /**
- * Reverse unsigned short value
- * @param $num (int) value to reversr
- * @return int reversed value
- * @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 $n (int) is the type of table: 2 for 2of13 table, 5 for 5of13table
- * @param $size (int) size of table (78 for n=2 and 1287 for n=5)
- * @return array requested table
- * @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/libs/tcpdf/tcpdf_barcodes_2d.php b/libs/tcpdf/tcpdf_barcodes_2d.php
deleted file mode 100644
index fd6ff06911..0000000000
--- a/libs/tcpdf/tcpdf_barcodes_2d.php
+++ /dev/null
@@ -1,332 +0,0 @@
-<?php
-//============================================================+
-// File name : tcpdf_barcodes_2d.php
-// Version : 1.0.014
-// Begin : 2009-04-07
-// Last Update : 2013-03-17
-// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
-// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
-// -------------------------------------------------------------------
-// Copyright (C) 2009-2013 Nicola Asuni - Tecnick.com LTD
-//
-// This file is part of TCPDF software library.
-//
-// TCPDF 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 3 of the
-// License, or (at your option) any later version.
-//
-// TCPDF 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 TCPDF. If not, see <http://www.gnu.org/licenses/>.
-//
-// See LICENSE.TXT file for more information.
-// -------------------------------------------------------------------
-//
-// Description : PHP class to creates array representations for
-// 2D barcodes to be used with TCPDF.
-//
-//============================================================+
-
-/**
- * @file
- * PHP class to creates array representations for 2D barcodes to be used with TCPDF.
- * @package com.tecnick.tcpdf
- * @author Nicola Asuni
- * @version 1.0.014
- */
-
-/**
- * @class TCPDF2DBarcode
- * PHP class to creates array representations for 2D barcodes to be used with TCPDF (http://www.tcpdf.org).
- * @package com.tecnick.tcpdf
- * @version 1.0.014
- * @author Nicola Asuni
- */
-class TCPDF2DBarcode {
-
- /**
- * Array representation of barcode.
- * @protected
- */
- protected $barcode_array = false;
-
- /**
- * This is the class constructor.
- * Return an array representations for 2D barcodes:<ul>
- * <li>$arrcode['code'] code to be printed on text label</li>
- * <li>$arrcode['num_rows'] required number of rows</li>
- * <li>$arrcode['num_cols'] required number of columns</li>
- * <li>$arrcode['bcode'][$r][$c] value of the cell is $r row and $c column (0 = transparent, 1 = black)</li></ul>
- * @param $code (string) code to print
- * @param $type (string) type of barcode: <ul><li>DATAMATRIX : Datamatrix (ISO/IEC 16022)</li><li>PDF417 : PDF417 (ISO/IEC 15438:2006)</li><li>PDF417,a,e,t,s,f,o0,o1,o2,o3,o4,o5,o6 : PDF417 with parameters: a = aspect ratio (width/height); e = error correction level (0-8); t = total number of macro segments; s = macro segment index (0-99998); f = file ID; o0 = File Name (text); o1 = Segment Count (numeric); o2 = Time Stamp (numeric); o3 = Sender (text); o4 = Addressee (text); o5 = File Size (numeric); o6 = Checksum (numeric). NOTES: Parameters t, s and f are required for a Macro Control Block, all other parametrs are optional. To use a comma character ',' on text options, replace it with the character 255: "\xff".</li><li>QRCODE : QRcode Low error correction</li><li>QRCODE,L : QRcode Low error correction</li><li>QRCODE,M : QRcode Medium error correction</li><li>QRCODE,Q : QRcode Better error correction</li><li>QRCODE,H : QR-CODE Best error correction</li><li>RAW: raw mode - comma-separad list of array rows</li><li>RAW2: raw mode - array rows are surrounded by square parenthesis.</li><li>TEST : Test matrix</li></ul>
- */
- public function __construct($code, $type) {
- $this->setBarcode($code, $type);
- }
-
- /**
- * Return an array representations of barcode.
- * @return array
- */
- public function getBarcodeArray() {
- return $this->barcode_array;
- }
-
- /**
- * Send barcode as SVG image object to the standard output.
- * @param $w (int) Width of a single rectangle element in user units.
- * @param $h (int) Height of a single rectangle element in user units.
- * @param $color (string) Foreground color (in SVG format) for bar elements (background is transparent).
- * @public
- */
- public function getBarcodeSVG($w=3, $h=3, $color='black') {
- // send headers
- $code = $this->getBarcodeSVGcode($w, $h, $color);
- header('Content-Type: application/svg+xml');
- header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
- header('Pragma: public');
- header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
- header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
- header('Content-Disposition: inline; filename="'.md5($code).'.svg";');
- //header('Content-Length: '.strlen($code));
- echo $code;
- }
-
- /**
- * Return a SVG string representation of barcode.
- * @param $w (int) Width of a single rectangle element in user units.
- * @param $h (int) Height of a single rectangle element in user units.
- * @param $color (string) Foreground color (in SVG format) for bar elements (background is transparent).
- * @return string SVG code.
- * @public
- */
- public function getBarcodeSVGcode($w=3, $h=3, $color='black') {
- // replace table for special characters
- $repstr = array("\0" => '', '&' => '&amp;', '<' => '&lt;', '>' => '&gt;');
- $svg = '<'.'?'.'xml version="1.0" standalone="no"'.'?'.'>'."\n";
- $svg .= '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'."\n";
- $svg .= '<svg width="'.round(($this->barcode_array['num_cols'] * $w), 3).'" height="'.round(($this->barcode_array['num_rows'] * $h), 3).'" version="1.1" xmlns="http://www.w3.org/2000/svg">'."\n";
- $svg .= "\t".'<desc>'.strtr($this->barcode_array['code'], $repstr).'</desc>'."\n";
- $svg .= "\t".'<g id="elements" fill="'.$color.'" stroke="none">'."\n";
- // print barcode elements
- $y = 0;
- // for each row
- for ($r = 0; $r < $this->barcode_array['num_rows']; ++$r) {
- $x = 0;
- // for each column
- for ($c = 0; $c < $this->barcode_array['num_cols']; ++$c) {
- if ($this->barcode_array['bcode'][$r][$c] == 1) {
- // draw a single barcode cell
- $svg .= "\t\t".'<rect x="'.$x.'" y="'.$y.'" width="'.$w.'" height="'.$h.'" />'."\n";
- }
- $x += $w;
- }
- $y += $h;
- }
- $svg .= "\t".'</g>'."\n";
- $svg .= '</svg>'."\n";
- return $svg;
- }
-
- /**
- * Return an HTML representation of barcode.
- * @param $w (int) Width of a single rectangle element in pixels.
- * @param $h (int) Height of a single rectangle element in pixels.
- * @param $color (string) Foreground color for bar elements (background is transparent).
- * @return string HTML code.
- * @public
- */
- public function getBarcodeHTML($w=10, $h=10, $color='black') {
- $html = '<div style="font-size:0;position:relative;width:'.($w * $this->barcode_array['num_cols']).'px;height:'.($h * $this->barcode_array['num_rows']).'px;">'."\n";
- // print barcode elements
- $y = 0;
- // for each row
- for ($r = 0; $r < $this->barcode_array['num_rows']; ++$r) {
- $x = 0;
- // for each column
- for ($c = 0; $c < $this->barcode_array['num_cols']; ++$c) {
- if ($this->barcode_array['bcode'][$r][$c] == 1) {
- // draw a single barcode cell
- $html .= '<div style="background-color:'.$color.';width:'.$w.'px;height:'.$h.'px;position:absolute;left:'.$x.'px;top:'.$y.'px;">&nbsp;</div>'."\n";
- }
- $x += $w;
- }
- $y += $h;
- }
- $html .= '</div>'."\n";
- return $html;
- }
-
- /**
- * Return a PNG image representation of barcode (requires GD or Imagick library).
- * @param $w (int) Width of a single rectangle element in pixels.
- * @param $h (int) Height of a single rectangle element in pixels.
- * @param $color (array) RGB (0-255) foreground color for bar elements (background is transparent).
- * @return image or false in case of error.
- * @public
- */
- public function getBarcodePNG($w=3, $h=3, $color=array(0,0,0)) {
- // calculate image size
- $width = ($this->barcode_array['num_cols'] * $w);
- $height = ($this->barcode_array['num_rows'] * $h);
- if (function_exists('imagecreate')) {
- // GD library
- $imagick = false;
- $png = imagecreate($width, $height);
- $bgcol = imagecolorallocate($png, 255, 255, 255);
- imagecolortransparent($png, $bgcol);
- $fgcol = imagecolorallocate($png, $color[0], $color[1], $color[2]);
- } elseif (extension_loaded('imagick')) {
- $imagick = true;
- $bgcol = new imagickpixel('rgb(255,255,255');
- $fgcol = new imagickpixel('rgb('.$color[0].','.$color[1].','.$color[2].')');
- $png = new Imagick();
- $png->newImage($width, $height, 'none', 'png');
- $bar = new imagickdraw();
- $bar->setfillcolor($fgcol);
- } else {
- return false;
- }
- // print barcode elements
- $y = 0;
- // for each row
- for ($r = 0; $r < $this->barcode_array['num_rows']; ++$r) {
- $x = 0;
- // for each column
- for ($c = 0; $c < $this->barcode_array['num_cols']; ++$c) {
- if ($this->barcode_array['bcode'][$r][$c] == 1) {
- // draw a single barcode cell
- if ($imagick) {
- $bar->rectangle($x, $y, ($x + $w - 1), ($y + $h - 1));
- } else {
- imagefilledrectangle($png, $x, $y, ($x + $w - 1), ($y + $h - 1), $fgcol);
- }
- }
- $x += $w;
- }
- $y += $h;
- }
- // send headers
- header('Content-Type: image/png');
- header('Cache-Control: public, must-revalidate, max-age=0'); // HTTP/1.1
- header('Pragma: public');
- header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past
- header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
- if ($imagick) {
- $png->drawimage($bar);
- echo $png;
- } else {
- imagepng($png);
- imagedestroy($png);
- }
- }
-
- /**
- * Set the barcode.
- * @param $code (string) code to print
- * @param $type (string) type of barcode: <ul><li>DATAMATRIX : Datamatrix (ISO/IEC 16022)</li><li>PDF417 : PDF417 (ISO/IEC 15438:2006)</li><li>PDF417,a,e,t,s,f,o0,o1,o2,o3,o4,o5,o6 : PDF417 with parameters: a = aspect ratio (width/height); e = error correction level (0-8); t = total number of macro segments; s = macro segment index (0-99998); f = file ID; o0 = File Name (text); o1 = Segment Count (numeric); o2 = Time Stamp (numeric); o3 = Sender (text); o4 = Addressee (text); o5 = File Size (numeric); o6 = Checksum (numeric). NOTES: Parameters t, s and f are required for a Macro Control Block, all other parametrs are optional. To use a comma character ',' on text options, replace it with the character 255: "\xff".</li><li>QRCODE : QRcode Low error correction</li><li>QRCODE,L : QRcode Low error correction</li><li>QRCODE,M : QRcode Medium error correction</li><li>QRCODE,Q : QRcode Better error correction</li><li>QRCODE,H : QR-CODE Best error correction</li><li>RAW: raw mode - comma-separad list of array rows</li><li>RAW2: raw mode - array rows are surrounded by square parenthesis.</li><li>TEST : Test matrix</li></ul>
- * @return array
- */
- public function setBarcode($code, $type) {
- $mode = explode(',', $type);
- $qrtype = strtoupper($mode[0]);
- switch ($qrtype) {
- case 'DATAMATRIX': { // DATAMATRIX (ISO/IEC 16022)
- require_once(dirname(__FILE__).'/include/barcodes/datamatrix.php');
- $qrcode = new Datamatrix($code);
- $this->barcode_array = $qrcode->getBarcodeArray();
- $this->barcode_array['code'] = $code;
- break;
- }
- case 'PDF417': { // PDF417 (ISO/IEC 15438:2006)
- require_once(dirname(__FILE__).'/include/barcodes/pdf417.php');
- if (!isset($mode[1]) OR ($mode[1] === '')) {
- $aspectratio = 2; // default aspect ratio (width / height)
- } else {
- $aspectratio = floatval($mode[1]);
- }
- if (!isset($mode[2]) OR ($mode[2] === '')) {
- $ecl = -1; // default error correction level (auto)
- } else {
- $ecl = intval($mode[2]);
- }
- // set macro block
- $macro = array();
- if (isset($mode[3]) AND ($mode[3] !== '') AND isset($mode[4]) AND ($mode[4] !== '') AND isset($mode[5]) AND ($mode[5] !== '')) {
- $macro['segment_total'] = intval($mode[3]);
- $macro['segment_index'] = intval($mode[4]);
- $macro['file_id'] = strtr($mode[5], "\xff", ',');
- for ($i = 0; $i < 7; ++$i) {
- $o = $i + 6;
- if (isset($mode[$o]) AND ($mode[$o] !== '')) {
- // add option
- $macro['option_'.$i] = strtr($mode[$o], "\xff", ',');
- }
- }
- }
- $qrcode = new PDF417($code, $ecl, $aspectratio, $macro);
- $this->barcode_array = $qrcode->getBarcodeArray();
- $this->barcode_array['code'] = $code;
- break;
- }
- case 'QRCODE': { // QR-CODE
- require_once(dirname(__FILE__).'/include/barcodes/qrcode.php');
- if (!isset($mode[1]) OR (!in_array($mode[1],array('L','M','Q','H')))) {
- $mode[1] = 'L'; // Ddefault: Low error correction
- }
- $qrcode = new QRcode($code, strtoupper($mode[1]));
- $this->barcode_array = $qrcode->getBarcodeArray();
- $this->barcode_array['code'] = $code;
- break;
- }
- case 'RAW':
- case 'RAW2': { // RAW MODE
- // remove spaces
- $code = preg_replace('/[\s]*/si', '', $code);
- if (strlen($code) < 3) {
- break;
- }
- if ($qrtype == 'RAW') {
- // comma-separated rows
- $rows = explode(',', $code);
- } else { // RAW2
- // rows enclosed in square parentheses
- $code = substr($code, 1, -1);
- $rows = explode('][', $code);
- }
- $this->barcode_array['num_rows'] = count($rows);
- $this->barcode_array['num_cols'] = strlen($rows[0]);
- $this->barcode_array['bcode'] = array();
- foreach ($rows as $r) {
- $this->barcode_array['bcode'][] = str_split($r, 1);
- }
- $this->barcode_array['code'] = $code;
- break;
- }
- 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));
- $this->barcode_array['code'] = $code;
- break;
- }
- default: {
- $this->barcode_array = false;
- }
- }
- }
-} // end of class
-
-//============================================================+
-// END OF FILE
-//============================================================+