From 24398306113185bbcdef2e726bbf96d851d3c4f8 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Thu, 27 Sep 2007 22:24:43 +0000 Subject: [PATCH] Ajout de php-barcode et de genbarcode pour windows --- htdocs/admin/barcode.php | 42 +- htdocs/genbarcode.php | 56 +++ htdocs/includes/barcode/genbarcode/GPL | 341 ++++++++++++++ htdocs/includes/barcode/genbarcode/README | 122 +++++ .../barcode/genbarcode/genbarcode.exe | Bin 0 -> 41984 bytes htdocs/includes/barcode/php-barcode/README | 162 +++++++ htdocs/includes/barcode/php-barcode/black.png | Bin 0 -> 138 bytes .../barcode/php-barcode/encode_bars.php | 91 ++++ .../barcode/php-barcode/php-barcode.php | 441 ++++++++++++++++++ htdocs/includes/barcode/php-barcode/white.png | Bin 0 -> 138 bytes 10 files changed, 1227 insertions(+), 28 deletions(-) create mode 100644 htdocs/genbarcode.php create mode 100644 htdocs/includes/barcode/genbarcode/GPL create mode 100644 htdocs/includes/barcode/genbarcode/README create mode 100644 htdocs/includes/barcode/genbarcode/genbarcode.exe create mode 100644 htdocs/includes/barcode/php-barcode/README create mode 100644 htdocs/includes/barcode/php-barcode/black.png create mode 100644 htdocs/includes/barcode/php-barcode/encode_bars.php create mode 100644 htdocs/includes/barcode/php-barcode/php-barcode.php create mode 100644 htdocs/includes/barcode/php-barcode/white.png diff --git a/htdocs/admin/barcode.php b/htdocs/admin/barcode.php index 6939949fbc1..857b97cefba 100644 --- a/htdocs/admin/barcode.php +++ b/htdocs/admin/barcode.php @@ -94,8 +94,8 @@ $var=true; print "Codes numériques utilisés exclusivement à l'identification des produits susceptibles d'être vendus au grand public."; print ''; - // Affiche example - print ''; + // Affiche exemple + print ''; print ''; if ($barcode_encode_type_set == "EAN8") @@ -119,8 +119,8 @@ $var=true; print "Codes numériques utilisés exclusivement à l'identification des produits susceptibles d'être vendus au grand public."; print ''; - // Affiche example - print ''; + // Affiche exemple + print ''; print ''; if ($barcode_encode_type_set == "EAN13") @@ -144,8 +144,8 @@ $var=true; print "Codes numériques utilisés exclusivement à l'identification des produits susceptibles d'être vendus au grand public."; print ''; - // Affiche example - print ''; + // Affiche exemple + print ''; print ''; if ($barcode_encode_type_set == "UPC") @@ -166,8 +166,8 @@ $var=true; print "Le code ISBN est un code dédié au milieu de la presse écrite."; print ''; - // Affiche example - print ''; + // Affiche exemple + print ''; print ''; if ($barcode_encode_type_set == "ISBN") @@ -192,8 +192,8 @@ $var=true; print "La longueur est variable mais en général ne dépasse pas 32 caractères."; print ''; - // Affiche example - print ''; + // Affiche exemple + print ''; print ''; if ($barcode_encode_type_set == "code39") @@ -219,8 +219,8 @@ $var=true; print "La longueur est variable mais en général ne dépasse pas 20 caractères."; print ''; - // Affiche example - print ''; + // Affiche exemple + print ''; print ''; if ($barcode_encode_type_set == "code128") @@ -241,8 +241,8 @@ $var=true; print "information"; print ''; - // Affiche example - print ''; + // Affiche exemple + print ''; print ''; if ($barcode_encode_type_set == "I25") @@ -255,20 +255,6 @@ $var=true; } print "\n"; - - - -/* -print ''.$langs->trans('Name').''.$langs->trans('Description').''; -print ''; -print "\n"; -print ' '.$langs->trans('OptionModeTrue').''; -print ''.nl2br($langs->trans('OptionModeTrueDesc'))."\n"; -print ' '.$langs->trans('OptionModeVirtual').''; -print ''.$langs->trans('OptionModeVirtualDesc')."\n"; -print ''; -*/ - print "\n"; diff --git a/htdocs/genbarcode.php b/htdocs/genbarcode.php new file mode 100644 index 00000000000..a3b8e0cc112 --- /dev/null +++ b/htdocs/genbarcode.php @@ -0,0 +1,56 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Id$ + * $Source$ + */ + +/** + \file htdocs/genbarcode.php + \brief Générateur de codes barres + \ingroup barcode + \version $Revision$ +*/ + +require_once('master.inc.php'); +require_once(DOL_DOCUMENT_ROOT.'/includes/barcode/php-barcode/php-barcode.php'); + +function getvar($name){ + global $_GET, $_POST; + if (isset($_GET[$name])) return $_GET[$name]; + else if (isset($_POST[$name])) return $_POST[$name]; + else return false; +} + +if (get_magic_quotes_gpc()){ + $code=stripslashes(getvar('code')); +} else { + $code=getvar('code'); +} +if (!$code) $code='123456789012'; + +barcode_print($code,getvar('encoding'),getvar('scale'),getvar('mode')); + +/* + * call + * http://........./barcode.php?code=012345678901 + * or + * http://........./barcode.php?code=012345678901&encoding=EAN&scale=4&mode=png + * + */ + +?> \ No newline at end of file diff --git a/htdocs/includes/barcode/genbarcode/GPL b/htdocs/includes/barcode/genbarcode/GPL new file mode 100644 index 00000000000..e782cef80d1 --- /dev/null +++ b/htdocs/includes/barcode/genbarcode/GPL @@ -0,0 +1,341 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. +$Id$ diff --git a/htdocs/includes/barcode/genbarcode/README b/htdocs/includes/barcode/genbarcode/README new file mode 100644 index 00000000000..f1e55cd8fe3 --- /dev/null +++ b/htdocs/includes/barcode/genbarcode/README @@ -0,0 +1,122 @@ +Genbarcode 0.4 + +Genbarcode can't generate barcode-images, but a string which can +be used by image-creators, such as my PHP-Barcode + +Encoding is done using GNU-Barcode (libbarcode), which can be found +at http://www.gnu.org/software/barcode/ + +(C) 2001,2002,2003 by Folke Ashberg + +The newest Version can be found at http://www.ashberg.de/bar + + +UNIX-INSTALLATION: + +First of all you need GNU barcode, a barcode creation/encoding library. +GNU barcode can be foud at http://www.gnu.org/software/barcode/ , or +install it using your favourite package-manager, e.g. + debian: # apt-get install barcode + SuSE : # rpm -i /path-to/barcode.rpm ; rpm -i /path-to/barcode/devel.rpm +Or compile and install the source yourself: + $ tar xfvz barcode-0.98.tar.gz + $ cd barcode-0.98 + $ ./configure + $ make + become root ( $ su ) + # make install + # ldconfig + +Then compile genbarcode: + Just type + $ make + become root ( $ su ) + # make install + +BSD Notice: +You have to use gmake (GNU version of make), which can be found in the +ports-collection. Take a look at /usr/ports/devel/gmake and 'make install'. +Then type instead of 'make' 'gmake' + + +WINDOWS-INSTALLATION: + +You can compile genbarcode with Borlands Free C++Builder Command Lines Tools 5.5 +You need the windows-source-package, which includes gnu-barcode-0.98 and libpaper +Make-win.inc assumes that C++Builder has been installed to c:\borland\bcc55 +run + c:\borland\bcc55\bin\bcc32 -f Makefile-win +and copy the created file genarcode.exe to any directory. + + + +That's all. + + +USAGE: + +$ genbarcode +Genbarcode 0.4, Copyright (C) 2001,2002,2003 by Folke Ashberg +Genbarcode comes with ABSOLUTELY NO WARRANTY. + +Usage genbarcode [] + +You can use the following types: +ANY choose best-fit (default) +EAN 8 or 13 EAN-Code +UPC 12-digit EAN +ISBN isbn numbers (still EAN-13) +39 code 39 +128 code 128 (a,b,c: autoselection) +128C code 128 (compact form for digits) +128B code 128, full printable ascii +I25 interleaved 2 of 5 (only digits) +128RAW Raw code 128 (by Leonid A. Broukhis) +CBR Codabar (by Leonid A. Broukhis) +MSI MSI (by Leonid A. Broukhis) +PLS Plessey (by Leonid A. Broukhis) + +Example: + +$ genbarcode 012345678901 +9a1a2221212214111132123111141a1a1131212133112321122212122a1a +0:12:0 12:12:1 19:12:2 26:12:3 33:12:4 40:12:5 47:12:6 59:12:7 66:12:8 73:12:9 80:12:0 87:12:1 94:12:2 +EAN-13 + +The three lines: +Line 1: The bars +Line 2: The positions for the single characters +Line 3: What encoding has been used + +The bar-string: +Read char by char, all odd chars represent a space, all even a bar: +... + +An alphabetic character defines a tall bar, all others small ones. + +The character-string: +:: ... + +For programmers: +1. Count the total width using bar-string +2. Allocate the image +3. Paint the bars (bar-string) +4. Write the Text + + + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + diff --git a/htdocs/includes/barcode/genbarcode/genbarcode.exe b/htdocs/includes/barcode/genbarcode/genbarcode.exe new file mode 100644 index 0000000000000000000000000000000000000000..db208f487f3af0a6babe523e36198cc424451e0f GIT binary patch literal 41984 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 + +The newest version can be found at http://www.ashberg.de/bar + + +INSTALLATION: + + WHAT YOU NEED TO BE ABLE TO USE PHP-BARCODE + You need php>4 on your system. + You need the gd2-extension to be able to render images. + You need a TrueTypeFont if you want to see the CODE below the bars. + You need genbarcode (from www.ashberg.de/bar) in you want to use + another encoding than EAN-12/EAN-12/ISBN + + Copy the following files into your html/php-directory + - php-barcode.php - main library + - encode_bars.php - built-in encoders + optional: + - barcode.php - Sample-File + - white.png - for HTML-Images + - black.png - for HTML-Images + + FONT-Installation + UNIX: + A TrueTypeFont isn't included in this distribution! + Copy one into the html/php-directory and change in php-barcode.php + $font_loc (change the arialbd.tff to your font name). + arialbd.ttf from Windows looks great. + + WINDOWS: + If you use Windows the font should be located automatically. + + OPTIONAL - genbarcode: + If you want to generate not only EAN-12/EAN-13/ISBN-Codes you have to install + genbarcode, a small unix-commandline tool which uses GNU-Barcode. + genbarcode is available http://www.ashberg.de/bar , read genbarcodes + README for installation. + If you have installed genbarcode not to /usr/bin set the $genbarcode_loc + in php-barcode.php . + + TESTING + If everything works fine you should see an image if you call + http://localhost/path/barcode.php + + Or call http://localhost/path/barcode.php?code=&encoding=&mode=&size=<1,2,3,...> + + + +If you need more then the sample barcode.php can do, you need to build your own. + +FUNCTIONS - API-Reference + +-------------------------------------------------------------------------- +function barcode_encode(code, encoding) + encodes $code with $encoding using genbarcode OR built-in encoder + if you don't have genbarcode only EAN-13/ISBN is possible + +You can use the following encodings (when you have genbarcode): + ANY choose best-fit (default) + EAN 8 or 13 EAN-Code + UPC 12-digit EAN + ISBN isbn numbers (still EAN-13) + 39 code 39 + 128 code 128 (a,b,c: autoselection) + 128C code 128 (compact form for digits) + 128B code 128, full printable ascii + I25 interleaved 2 of 5 (only digits) + 128RAW Raw code 128 (by Leonid A. Broukhis) + CBR Codabar (by Leonid A. Broukhis) + MSI MSI (by Leonid A. Broukhis) + PLS Plessey (by Leonid A. Broukhis) + + return: + array[encoding] : the encoding which has been used + array[bars] : the bars + array[text] : text-positioning info + +-------------------------------------------------------------------------- +function barcode_outimage(text, bars [, scale [, mode [, total_y [, space ]]]] ) + + Outputs an image using libgd + + text : the text-line (:: ...) + bars : where to place the bars (...) + scale : scale factor ( 1 < scale < unlimited (scale 50 will produce + 5400x300 pixels when + using EAN-13!!!)) + mode : png,gif,jpg, depending on libgd ! (default='png') + total_y: the total height of the image ( default: scale * 60 ) + space : space + default: + $space[top] = 2 * $scale; + $space[bottom]= 2 * $scale; + $space[left] = 2 * $scale; + $space[right] = 2 * $scale; + +-------------------------------------------------------------------------- +function barcode_outhtml(text, bars [, scale [, total_y [, space ]]] ) + + returns(!) HTML-Code for barcode-image using html-code (using a table and with black.png and white.png) + + text : the text-line (:: ...) + bars : where to place the bars (...) + scale : scale factor ( 1 < scale < unlimited (scale 50 will produce + 5400x300 pixels when + using EAN-13!!!)) + total_y: the total height of the image ( default: scale * 60 ) + space : space + default: + $space[top] = 2 * $scale; + $space[bottom]= 2 * $scale; + $space[left] = 2 * $scale; + $space[right] = 2 * $scale; + +-------------------------------------------------------------------------- +function barcode_outtext(code, bars) + + Returns (!) a barcode as plain-text + ATTENTION: this is very silly! + + text : the text-line (:: ...) + bars : where to place the bars (...) + +-------------------------------------------------------------------------- +For more function see php-barcode.php +Also see barcode.php or just use them :) + + + + + + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + diff --git a/htdocs/includes/barcode/php-barcode/black.png b/htdocs/includes/barcode/php-barcode/black.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f33fe3db87a267cc7f7dd119b15c05b10745d4 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)gaYymzYu0Z<#|Nl#G&c6$iPV#nl zVd!9$^#F1>3p^r=85p>QK$!8;-MT+OLG}_)Usv`^+yeZ{h5-j0bAUozo-U3d6?2jk YfNUlPMvwJN3V|#JPgg&ebxsLQ0RJB!zyJUM literal 0 HcmV?d00001 diff --git a/htdocs/includes/barcode/php-barcode/encode_bars.php b/htdocs/includes/barcode/php-barcode/encode_bars.php new file mode 100644 index 00000000000..e24b7b1c05d --- /dev/null +++ b/htdocs/includes/barcode/php-barcode/encode_bars.php @@ -0,0 +1,91 @@ + + + * The newest version can be found at http://www.ashberg.de/bar + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + */ + +function barcode_gen_ean_sum($ean){ + $even=true; $esum=0; $osum=0; + for ($i=strlen($ean)-1;$i>=0;$i--){ + if ($even) $esum+=$ean[$i]; else $osum+=$ean[$i]; + $even=!$even; + } + return (10-((3*$esum+$osum)%10))%10; +} + +/* barcode_encode_ean(code [, encoding]) + * encodes $ean with EAN-13 using builtin functions + * + * return: + * array[encoding] : the encoding which has been used (EAN-13) + * array[bars] : the bars + * array[text] : text-positioning info + */ +function barcode_encode_ean($ean, $encoding = "EAN-13"){ + $digits=array(3211,2221,2122,1411,1132,1231,1114,1312,1213,3112); + $mirror=array("000000","001011","001101","001110","010011","011001","011100","010101","010110","011010"); + $guards=array("9a1a","1a1a1","a1a"); + + $ean=trim($ean); + if (eregi("[^0-9]",$ean)){ + return array("text"=>"Invalid EAN-Code"); + } + $encoding=strtoupper($encoding); + if ($encoding=="ISBN"){ + if (!ereg("^978", $ean)) $ean="978".$ean; + } + if (ereg("^978", $ean)) $encoding="ISBN"; + if (strlen($ean)<12 || strlen($ean)>13){ + return array("text"=>"Invalid $encoding Code (must have 12/13 numbers)"); + } + + $ean=substr($ean,0,12); + $eansum=barcode_gen_ean_sum($ean); + $ean.=$eansum; + $line=$guards[0]; + for ($i=1;$i<13;$i++){ + $str=$digits[$ean[$i]]; + if ($i<7 && $mirror[$ean[0]][$i-1]==1) $line.=strrev($str); else $line.=$str; + if ($i==6) $line.=$guards[1]; + } + $line.=$guards[2]; + + /* create text */ + $pos=0; + $text=""; + for ($a=0;$a<13;$a++){ + if ($a>0) $text.=" "; + $text.="$pos:12:{$ean[$a]}"; + if ($a==0) $pos+=12; + else if ($a==6) $pos+=12; + else $pos+=7; + } + + return array( + "encoding" => $encoding, + "bars" => $line, + "text" => $text + ); +} + +?> diff --git a/htdocs/includes/barcode/php-barcode/php-barcode.php b/htdocs/includes/barcode/php-barcode/php-barcode.php new file mode 100644 index 00000000000..a5a2505fb49 --- /dev/null +++ b/htdocs/includes/barcode/php-barcode/php-barcode.php @@ -0,0 +1,441 @@ + + + * The newest version can be found at http://www.ashberg.de/bar + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + */ + +/* CONFIGURATION */ + +/* ******************************************************************** */ +/* COLORS */ +/* ******************************************************************** */ +$bar_color=Array(0,0,0); +$bg_color=Array(255,255,255); +$text_color=Array(0,0,0); + + +/* ******************************************************************** */ +/* FONT FILE */ +/* ******************************************************************** */ +/* location the the ttf-font */ +/* the file arialbd.ttf isn't included! */ + +/* SAMPLE1 : + * use arialbd.ttf located in same directory like the script + * which includes/requires php-barcode.php + */ +$font_loc=dirname($_SERVER["PATH_TRANSLATED"])."/"."arialbd.ttf"; + +/* SAMPLE2 : + * use font specified by full-path + */ +//$font_loc="/path/font.ttf" + +/* Automatic-Detection of Font if running Windows + * kick this lines if you don't need them! */ +if (isset($_ENV['windir']) && file_exists($_ENV['windir'])){ + $font_loc=$_ENV['windir']."\Fonts\arialbd.ttf"; +} + +/* ******************************************************************** */ +/* GENBARCODE */ +/* ******************************************************************** */ +/* location of 'genbarcode' + * leave blank if you don't have them :( + * genbarcode is needed to render encodings other than EAN-12/EAN-13/ISBN + */ +if (isset($_ENV['windir']) && file_exists($_ENV['windir'])) +{ + require_once('master.inc.php'); + $genbarcode_loc = DOL_DOCUMENT_ROOT.'/includes/barcode/genbarcode/genbarcode.exe'; +} +else +{ + $genbarcode_loc="/usr/local/bin/genbarcode"; +} + + +/* CONFIGURATION ENDS HERE */ + +require("encode_bars.php"); /* build-in encoders */ + +/* + * barcode_outimage(text, bars [, scale [, mode [, total_y [, space ]]]] ) + * + * Outputs an image using libgd + * + * text : the text-line (:: ...) + * bars : where to place the bars (...) + * scale : scale factor ( 1 < scale < unlimited (scale 50 will produce + * 5400x300 pixels when + * using EAN-13!!!)) + * mode : png,gif,jpg, depending on libgd ! (default='png') + * total_y: the total height of the image ( default: scale * 60 ) + * space : space + * default: + * $space[top] = 2 * $scale; + * $space[bottom]= 2 * $scale; + * $space[left] = 2 * $scale; + * $space[right] = 2 * $scale; + */ + + +function barcode_outimage($text, $bars, $scale = 1, $mode = "png", + $total_y = 0, $space = ''){ + global $bar_color, $bg_color, $text_color; + global $font_loc; + /* set defaults */ + if ($scale<1) $scale=2; + $total_y=(int)($total_y); + if ($total_y<1) $total_y=(int)$scale * 60; + if (!$space) + $space=array('top'=>2*$scale,'bottom'=>2*$scale,'left'=>2*$scale,'right'=>2*$scale); + + /* count total width */ + $xpos=0; + $width=true; + for ($i=0;$i\n"; + print "
\n"; + print "
\n"; + print "Short HOWTO
\n"; + print "
\n"; + print "Debian: # apt-get install php4-gd2
\n"; + print "
\n"; + print "SuSE: ask YaST
\n"; + print "
\n"; + print "OpenBSD: # pkg_add /path/php4-gd-4.X.X.tgz (read output, you have to enable it)
\n"; + print "
\n"; + print "Windows: Download the PHP zip package from php.net, NOT the windows-installer, unzip the php_gd2.dll to C:\PHP (this is the default install dir) and uncomment 'extension=php_gd2.dll' in C:\WINNT\php.ini (or where ever your os is installed)
\n"; + print "
\n"; + print "
\n"; + print "The author of php-barcode will give not support on this topic!
\n"; + print "
\n"; + print "
\n"; + print "Folke Ashberg's OpenSource PHP-Barcode
\n"; + return ""; + } + $im=imagecreate($total_x, $total_y); + /* create two images */ + $col_bg=ImageColorAllocate($im,$bg_color[0],$bg_color[1],$bg_color[2]); + $col_bar=ImageColorAllocate($im,$bar_color[0],$bar_color[1],$bar_color[2]); + $col_text=ImageColorAllocate($im,$text_color[0],$text_color[1],$text_color[2]); + $height=round($total_y-($scale*10)); + $height2=round($total_y-$space['bottom']); + + + /* paint the bars */ + $width=true; + for ($i=0;$i:: ...) + * bars : where to place the bars (...) + */ + +function barcode_outtext($code,$bars){ + $width=true; + $xpos=$heigh2=0; + $bar_line=""; + for ($i=0;$i:: ...) + * bars : where to place the bars (...) + * scale : scale factor ( 1 < scale < unlimited (scale 50 will produce + * 5400x300 pixels when + * using EAN-13!!!)) + * total_y: the total height of the image ( default: scale * 60 ) + * space : space + * default: + * $space[top] = 2 * $scale; + * $space[bottom]= 2 * $scale; + * $space[left] = 2 * $scale; + * $space[right] = 2 * $scale; + */ + + + +function barcode_outhtml($code, $bars, $scale = 1, $total_y = 0, $space = ''){ + /* set defaults */ + $total_y=(int)($total_y); + if ($scale<1) $scale=2; + if ($total_y<1) $total_y=(int)$scale * 60; + if (!$space) + $space=array('top'=>2*$scale,'bottom'=>2*$scale,'left'=>2*$scale,'right'=>2*$scale); + + + /* generate html-code */ + $height=round($total_y-($scale*10)); + $height2=round($total_y)-$space['bottom']; + $out= + ''."\n". + ''."\n". + ''."\n". + ''."\n". + '
'."\n". + ''; + + $width=true; + for ($i=0;$i0) $out.=""; + $width=false; + continue; + } + if (ereg("[a-z]", $val)){ + //hoher strich + $val=ord($val)-ord('a')+1; + $h=$height2; + }else $h=$height; + $w=$val*$scale; + if ($w>0) $out.=''; + $width=true; + } + $out.= + ''. + '
'."\n"; + //for ($i=0;$i".$line[$i+1]." "; + return $out; +} + + +/* barcode_encode_genbarcode(code, encoding) + * encodes $code with $encoding using genbarcode + * + * return: + * array[encoding] : the encoding which has been used + * array[bars] : the bars + * array[text] : text-positioning info + */ +function barcode_encode_genbarcode($code,$encoding){ + global $genbarcode_loc; + /* delete EAN-13 checksum */ + if (eregi("^ean$", $encoding) && strlen($code)==13) $code=substr($code,0,12); + if (!$encoding) $encoding="ANY"; + $encoding=ereg_replace("[|\\]", "_", $encoding); + $code=ereg_replace("[|\\]", "_", $code); + $cmd=$genbarcode_loc." \"" + .str_replace("\"", "\\\"",$code)."\" \"" + .str_replace("\"", "\\\"",strtoupper($encoding))."\""; + //print "'$cmd'
\n"; + $fp=popen($cmd, "r"); + if ($fp){ + $bars=fgets($fp, 1024); + $text=fgets($fp, 1024); + $encoding=fgets($fp, 1024); + pclose($fp); + } else return false; + $ret=array( + "encoding" => trim($encoding), + "bars" => trim($bars), + "text" => trim($text) + ); + if (!$ret['encoding']) return false; + if (!$ret['bars']) return false; + if (!$ret['text']) return false; + return $ret; +} + +/* barcode_encode(code, encoding) + * encodes $code with $encoding using genbarcode OR built-in encoder + * if you don't have genbarcode only EAN-13/ISBN is possible + * + * You can use the following encodings (when you have genbarcode): + * ANY choose best-fit (default) + * EAN 8 or 13 EAN-Code + * UPC 12-digit EAN + * ISBN isbn numbers (still EAN-13) + * 39 code 39 + * 128 code 128 (a,b,c: autoselection) + * 128C code 128 (compact form for digits) + * 128B code 128, full printable ascii + * I25 interleaved 2 of 5 (only digits) + * 128RAW Raw code 128 (by Leonid A. Broukhis) + * CBR Codabar (by Leonid A. Broukhis) + * MSI MSI (by Leonid A. Broukhis) + * PLS Plessey (by Leonid A. Broukhis) + * + * return: + * array[encoding] : the encoding which has been used + * array[bars] : the bars + * array[text] : text-positioning info + */ +function barcode_encode($code,$encoding){ + global $genbarcode_loc; + if ( + ((eregi("^ean$", $encoding) + && ( strlen($code)==12 || strlen($code)==13))) + + || (($encoding) && (eregi("^isbn$", $encoding)) + && (( strlen($code)==9 || strlen($code)==10) || + (((ereg("^978", $code) && strlen($code)==12) || + (strlen($code)==13))))) + + || (( !isset($encoding) || !$encoding || (eregi("^ANY$", $encoding) )) + && (ereg("^[0-9]{12,13}$", $code))) + + ){ + /* use built-in EAN-Encoder */ + $bars=barcode_encode_ean($code, $encoding); + } else if (file_exists($genbarcode_loc)){ + /* use genbarcode */ + $bars=barcode_encode_genbarcode($code, $encoding); + } else { + print "php-barcode needs an external programm for encodings other then EAN/ISBN
\n"; + print "
    \n"; + print "
  • download gnu-barcode from www.gnu.org/software/barcode/\n"; + print "
  • compile and install them\n"; + print "
  • download genbarcode from www.ashberg.de/bar/\n"; + print "
  • compile and install them\n"; + print "
  • specify path the genbarcode in php-barcode.php\n"; + print "
\n"; + print "
\n"; + print "Folke Ashberg's OpenSource PHP-Barcode
\n"; + return false; + } + return $bars; +} + +/* barcode_print(code [, encoding [, scale [, mode ]]] ); + * + * encodes and prints a barcode + * + * return: + * array[encoding] : the encoding which has been used + * array[bars] : the bars + * array[text] : text-positioning info + */ + + +function barcode_print($code, $encoding="ANY", $scale = 2 ,$mode = "png" ){ + $bars=barcode_encode($code,$encoding); + if (!$bars) return; + if (!$mode) $mode="png"; + if (eregi($mode,"^(text|txt|plain)$")) print barcode_outtext($bars['text'],$bars['bars']); + elseif (eregi($mode,"^(html|htm)$")) print barcode_outhtml($bars['text'],$bars['bars'], $scale,0, 0); + else barcode_outimage($bars['text'],$bars['bars'],$scale, $mode); + return $bars; +} + +?> diff --git a/htdocs/includes/barcode/php-barcode/white.png b/htdocs/includes/barcode/php-barcode/white.png new file mode 100644 index 0000000000000000000000000000000000000000..6085731ad19326559a5582cc4216932db6e5e09a GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)gaYymzYu0Z<#|Nl#G&c6$iPV#nl zVd!9$^#F1>3p^r=85p>QK$!8;-MT+OLG}_)Usv`^+yeZ{%8M%vRDeQUo-U3d6?2j^ Yfb1rQ#`3d8+kh+vPgg&ebxsLQ01FNv%>V!Z literal 0 HcmV?d00001