From bedcbe8a0a39081cfe83c1234d161e98c1c651ca Mon Sep 17 00:00:00 2001 From: rlt3 Date: Tue, 28 Feb 2017 22:19:30 -0500 Subject: [PATCH] Updating the repo with the updated version from a long time ago. --- FreeSansBold.ttf | Bin 0 -> 91432 bytes README.md | 29 +++++- barcode.php | 242 +++++++++++++++++++++++++++++++++++++++++++---- ean.php | 173 --------------------------------- ean_parity.php | 77 --------------- 5 files changed, 252 insertions(+), 269 deletions(-) create mode 100644 FreeSansBold.ttf delete mode 100644 ean.php delete mode 100644 ean_parity.php diff --git a/FreeSansBold.ttf b/FreeSansBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e75685be37c70786b9d13bf0cec28be06044bf0f GIT binary patch literal 91432 zcmd?S2Y6dW);E6VUKPt-mSwqHw%qNw$+Bd*_ufn5mflGxB%uUIrx=z5FdY_1LINyH z4J|C}yVS5i=!6bl0tDCqOWh>W|99qI*|HPLzTf+QpXYnNm{FNKGxzj4=ghf6V1gh7 z3Fixvu%fQIrZ%P~UWcCJX#I8VZC#J~JliD*Y?>fA8|%7yD*tu2Pm3TF?Zox3+q$yz zc3#>NAqd4+;Ct_!rL$I)1sqMq_b&xO6*6bdYO@e8o+$_wxGbm^%sPFA+l@O36)Jr9 zS+L~H`Tn}@N__Vhgb!9NoHuLkJOA~!M1h&l$Mu4R=>KobEBp)JzGK4zW0$Z?1c_ZLy)7{59qAoG zl-`w&;`7(iH~9RmDpp{sI8~e=s>~`g<`P~a8c2rbE93~Jf>>SK+${tynYDVE5Xnaf zpaNZ|(Voxjw0WzR2|nmx_!9+<5Xe_zLa_YqbFaXB&f;^zgaV;jSS+j)ZWMM3w+jbZ zAj@a{Y&E-9oGaz21l9ZM6`BOiL)wi#^@1cl?fzJL&i#RO)cv5K6B2QEyZafT(EW+v zbpI$6yPps?pl>tU7PPH^o92vS&WB@jUcj6yFy~&(c@lHBW6leh^8)6)AZ&FX0=0f{ z{~53UaPQ%Fc@Q&x7778q6SOUM{|hr7#Eb_q<3Y^$FUVbx`xQa&eibm?C)5F+PWQ(` zkNX>;*L_5o>OL;?xsM6`pvR#51ZLld+4o`geVF|hevkdQhYR=6;2y!a$B!7bAEWkT z)P9V5hL3twuw#uvL5op(jQSa)9>u6fG3rr1N+Tpf6722=fZ>C{@CA(82}*?X`LE#0 z)wr?`SDwX{D>45S%zp**U%~wMgghZha0n@Asc30v8A6eeDU=IS@Rx<}*=RXJiI9ta zD?Z!M3ee-gU$Of&T*(1Xn}iy?)#pWB5h zp#%5m#A;ob*^SnN@4dJ_6`!Wzdq3_zfWIN3O#;8A!$O1fsn8^Sj_*eVhxCQ}2kA?p zLi$Q*2d}>ZY>BuxVUrA)yfI40cMn#RG0FqPgjGJUlQF9X&4~^U&^!mdRhT`*v1<^f z|0*_w31Kl+m<{e?U{Wi6=Kc}bZ4)B>9U zVDmL#I+-tp;7cjE;_%{25%^N*#TSCx4!*nzs7cov0aGRTQU%)74B| zoF^r~g=C}#u-Bs10p5B*(}3BHz@-USo6%Z;Nh?0J;d48BX;ddhbm2-jKK1ZftypP_ z!mBi3RshU0!K*A_R}1X=fL#%=8w7SbVAluidV$?Pz^hq`i*&^iEV1|W3+DhD8HQ0UzPh-?bI%K%Xe=sgM?WO`>#(1Q$U zUMA==4pk{=T|7y89Dt~tQ?Leb)#9%XbgSpDO`v26s7g@QfVL%|t&>C92`suGA>E)a zLEDS#GHnUsN7gps54UJA^6j zVJ{3Ez`!wvLACo~+}9!0!XDPS9}()YRwF()p|2IK4XqPaxEt297h?y6ROzt$I5hFU zq|e=7NJrfNlD+_^zl1g(b$>f%9SaqiEd~!N0Y#mng~f`@Rs)JkK;cwmRo221(6*Y} zwk9sMvIf>bR?9%qRzOt+T2_H#<@{S4KDXma2iEVzT3xu>jZr=LP7*#9yqku;e%xgM zGlqnE(6$0HS_ArafWE${Uoa~d#d0By;Z z^KAAH_Jj14^tAM>^qh1+dRh8JIxKxEeI|V_9g)6}zLdTq4=Go}J(YIhcD7$! zCUr~is}`z0R)3~>U;CQR0o~QUk$$26o&Mhivhq z{u#a};>O78sLtr_7-wvLT)H_YJ~_cZ;Rnmk#OX=R$@5ckQVY@&(*rZinPTRbQ{Ko@ zWv$8Dne|F`b@n6KPh`KC{g3Q#bA+789CJ=`PIXRW&XSz7axTaj$=R86Z_X1rFXp_P zb0p_$@FPet05dIcGsybx{s8(uF01L--#zl01zD8st1PQ|?)SO8=3|V!@1?_6__N?} ze+Yl!FWi$T;@sa2?mL8P_*XS(wa|(>ctrK^SQ;Qzjrjhna*Vx<%dz`AF2_^d{}iU- zbD#Sip&xQNAZ&$?^d4k+k+8)5y08s6i~zQ40LQgx*P&gHcANWKcy@n-XZN^t(ES!< zeg>o^1Co*h3CRYpZ-ZVYV&utkF58W9t0&uxJooowcB2qppcDI4G5n_zSeI&OKG_kn z8?v>NZAUx4d)s8%lLpX+Fn$B>y%B8_+GeyZXj|Q13OjJ0%h9et8$r9;eT;>;UBF-p zc$ElieKN#q;8La77*XL{IjCJK?pAMH!%7)v^O8vw1Xe{;77K+BMEuniw&A<6B2;sJEy=>vFGr!C-cVRXWDU>LP&=b zbS%PqF}&E{!w!Tl5N{0QJnbpOO@kPI9r`pM+|d${85Whxq@&?F!4 zvdyT3%{Yp04shvRnM;r#;!+9jQ;pq%xFySDF(_Z9$l|HBN|r+h5K0wsO|C4K@WegY+a0wsQeHBo`?20u|7lfVK#@7UQ$*tyU{kD1_dX;tF{H{lLNb zi}q!l5@iY{${sDFnI6VK4 zVhvmT-{ZAx1;%+@4qg+diO&x3nIs9jBQ$?p(#ba}0kYY0jr;h`(@#KHgqZnx|NH*Jof?2Y!vd5E3u)!0C^3&5CCi`f+j!U1TY985AdxYpAgk!zwd+p#<6lg4y;yT4>9lk8^sZ`e(W4JgM@rr1r2xo4w?EJh({+W^|O zD;9%tB+ZI6Re)o)kfs)lm<_H}j#-QrM9-dx#^aU9Q9IesI>l<#fx{h&M0J7-(?RipA-TLOvjbdF$$cFy&oivu&+|Er#Pbp z*!yD#X$AKEz>kIUQ^&At9D__~g>8_H%aO+%LAx3E--)&hZ8zFp-2Xo8 z)%(yMLfbF+gL=)NUNflIqEL@^`UZu1ouD3Kaln)M3*L{MWgGW7CT7^|@Ob1s^$U1D z??S4d0#&j>6^g_1Km|`$jUwBLS+(&zR37L30BB2lCV502PiU+AFrcT5K{`c9?pxr8 z+yY1+had79?)WI~_$svhXK49P+y~i!Yn#!wplyZ5-i&KI(RQKj#+bcmTuq+|x@R0k;`f43W}&xVw=fM$!q<=LRqOmMjkT+W4#G=a-Au&Z`} zc9i7{hHfNc4UQ#bX@W-u4_Wr8ioCo_PyFHS$ydUL9S6q`!-gG|tpT_t?=AVjv<$F` zz_4me{#!twR`j=lGVRcd4x$g%=t4Z+gU`K?ys7v+4dePSs~?{Rkb55#)WB>uY~V4E z2M@b<95OC~f5%~ckFyY*9T;$0@Co*n!$Lo>uLt&-z`hXJ7edCCXfUW^#91YEBMJ~iC>72vf1*cSkM%8rl) z__bJuGRhRo6oLvA%hZDk47k?=`vzcM1wHr@lKdqk`AbOhPrxzAy4!(cGjNgsX9#3H930DmP6tEh9t7sIu*2>{qUI zq2#gp5Er-+7n}g^XW_1WLc9B7p~HOvcz?gp<-P>Dts4<9JdFI-KJ0@JVIRB;``~@T z0KN~p?-qs-BLD6tnF^j>(-dqI)CpvYcO%h9etyAo{#?P?x1 zj{@6KVEa6Zg$T?%Qu4bpfgpr;J`enlEja2wc)>#{^X0*mx2 zr1DR&Mt1=6gRn-QfIl~aKevNFw}U^ogFm-}KevNFw}U_Xz@G!)&jIk~0Qe)v2UkN2 zc0c-oQ|#uz=mv0w;-d`6 zRX)C@!^)%ss|xU>0$7!T8x6p!0z9F;sRI0{1xKcUCl%mUFRTomB$WWe?_ueyz#|8E z^dsLxKgHhpnR_=Z3VGN?*jXB3P1=9~*BL-Mt}{;DH|rO%kk7>^mY5>*1u|uKUjxtK zB}f(J0(Wq18i2y67=z9@X647OOOZpU(N>>fM0gh5fJpnkmYJ{gK~j&kh6L;qJ1OYC*}nuKwk*y zDF^f=fW8vY=Yj_%fS&TLb%4GMl2Zz(>14G5bWaE5HGrJX%qSB5GazpVsbmHB|v61sv<)C66s7$dK#T!+4_3XkWz>PejK43_h z&)>@Al>$S`-AOt`Mg3srWdS6Hi+0&<9z{UIeeM0w$HXe+eM}6#X!)+6N0nXL0b3u^TtQXK2KA zI_qx6_ZGw+tr*jW&+T~c0KGerPwv8eS#MyqU>T-j-ZZS#2blZuI)J+kaw!}{9Lx|0 zGsM9R@f~GnenfomBdqX`i0@8FPvgY#6Ja{2KrzAq_(tAyKPXWSO3VV!svz%)z~R3q zsi(-kxz}-i7GYgEI+DDkvk)}&0VR4siC@bU$fxSvz_bUL_2S**Blcmne$Z+FoT2)a zA<%Oty!2gYyV3Sy{rfOyACHbG3s(iqs}-qLGI8!#L4om198P%v^KVgLT!KA%IvIP4 zmSpS;;j_usezQV_GA}B4Jmn(5e=1K|KEoQ%F?;flLycz^I6i*V(^*jJP1>Y1B*cK--G3;Ez)F6%Yf-|&S%*o6=D5K#UfE{Lg^%IsoJP} z0=6y447OqgIXa$tmFS#?_CK;p)!=(OFz*20DNbwz*0lFg?Lw7;bvdx6{qGfE zT@S3QxK$!sT=bj#{e76@L7B z%&1kct^?MxMHqzT8p0m=32d)iQGg01&TIMfIL@cn-D zQby1T%va0O4PMp=b7AGa0k$>pH@^V31TST2D7QBkvj=gB+v zQeOoAw}J}&;Qee+p#bpxk4ina%pTtV=TiS4Nj$v0F^LEEzbf&N18<4{pR{P}Ill`L z8*oX-eqD{fagT#e%*Z38)0E#jG1Gv4-X~_1{eo_D-xm8fNet=_hLE)-uTa+QIxpK@ z4Bb8mOvyW}z})*sO1l)DUeN9|(XW#8HIuQM=)vEqU`4g17jvG;=RvY1 zYQegbC9(@M$o5V}c39@k=kV5lfNzB=JLudHvJ6k7>gN-lgQAaoJ zj2j`#p537ZncvAg8TSOn&)wyCLOtUD=?(2! z>-Y{)i;ToG*dg9SM&cP{BtAh#;*&{|Rs8*3=_%26o#h`?z7NroBaA2=Y zF2fI%x+j#EA{nwNo5d18uIuY`#xo<~ZMN;Cs0u&1K+ZF(^_2iey6{ zi$M|6NjE4`3~JfTda;)45ep6L; zH85Swc|Fc&trF|}0KWbJeo{rrR8V0KsL%r{)PV|Jpa6M*sMhB2{{I`}czgF0bX1n)lt@83t3@voEg+EXc83!YD`JoHq_ zl0Ng(9#jia%@gT!Eo`Xl<>AQz?&Vd2$Ccn3RmhS~9|Mo6Lbg`%@|uBNExf#=;B6gv zx&i!LCj1fWQ9aZxXt$z`*F}9T?7?^P@@_}F7dwu}+k43UC3w6TJe~pxUkTpkLOOy_ ziy&8NeW+M4s@J1B_9{qt1th!{(%lT{?f|B>knVCwcPr*LLq@A1)#Z>|s;%4wF3`^Z zI{+&gfu zPGtYPpw-=wogRFb^MI70+6bzw0#)Wh&$odxX9IKcEa(Z0(}CqeU|9kzYk?u1*OM;i zLr=z~`y)vA2VT-W{_MgpJ-0y5ERcP+yRTQI8@m-M@c8ozkm!0;>NSA3vUE>+R)Kab z;L4v>0QOW-!=F>Y9C{*VK-dH%@^6O}n_UB5dax@6FKfU{@{a0}L!{?`O2IjL4ycxEMIPkV3cloX38&qt zi(^cCmZwrk&dyMdnXEMBb<43@1ODigp0YC@?5S$V^Q1L zDeE-|zAgea*5cDFU_jYYdQyW|K2f@>9RBTYKG}TEbgP&9vP4&-I z`#ibkxfoSM(R{S0vikSTI8}8tRYrG$3*D$&nq2iv70;-4hSmKWPBY&658?aY#^(28 zqSR&!G5@Rd^W2p|PyYeG&Qm!<6*Fq|y))M1g#JP_kJWd)rb)gfN|Lofr${EL3WApxv2xNSf@o#c` zMX?p#Vf-88F_@aadip(47(G);=L-UKbO^rj`N9_H`ZoMIg&nAnDiW?1u7^JV5uQ^G zJmlTb?!EAe8-;s?`=QJG@Ylwl2&HF9E1{9VB>?GIh?P;_`47KbMT$s=b}ZT`Cz05)mrof z>?`z&Y72T!H54rmYxpAyNX2Iro}Lw9>EzLPMi!?MU*olzU!&)0TkuJOMQq@Gvh^gp)?<^hbMCufEB`89J< z<7jr>sM_YbLFiX)V{_2`_|e|+N}^Wu6N5y97$rU@|x zs-M*ltDjUKQGch2*2HU4H5r;LjWx~~7ZX<#*Ah21t}kvNZYXYj-2HJ+#=RQ%PTbMB z@8VqMP;;a?)|_BYHs_d~=4$h5^Jeqy<~!pP;%6j?37UkEgvf-M3GUq^c)lcfX)sLzVs=wBlIOOS?DS%vv3y(9$)yK6fkk5!a zKW<;#({XRay%+aw+z)1hIoup=Hgm`eIpiBAK(6PI&jsX#9CCIn=9mMJmmjM-R!fk( zzju$i|LT6ieV2Q^`yBUK?se`n+$-J7-Amo4xfi(?xaYYZb=~1Iy7aC^ZUf#Lg2ppSbDx=f^)g{@(Goj_*5u@9{g2-*No*Wzw2f$abH{bL#! zfXnVCz;9rZaN}QO4H1O(=bU-&>8lnHZjwr^(fa6o{rm$0gM#%ThEQXeDLf)FDmo@M z&K#d$NlZ#kNli=7$efauos*kq&9@cU9fi)K;*!#`@`}nT{GvczeM4hYb4zPmdq-zi zcTexsX?^_zgG1A2%$y}`-m>k&?IYLU{Ks2%-n#3yy?buI<4smazMw^JXulFH6oAg!4CD$@}s0pzyfo z<63;!c+rN7FSz8=KMY@fg|Oq=>#jl9awEFq z6Z7N6X;^gyR@I1az@p)|6_`=7NH&AfVq=>0sSYnaKFY|FP7*lkv0SR4ye+cd^dQ<%wE zV9OWP=ZgVONxUX4tXikDwpDl9dN-+i{=O)^uzEv&ps(v_N4=_{n|+&5?#G@>Z%(l< zbZRwb-J(T4$t5dvi-TUz-hF1CQC(1=on?t%_CRoRaU{F^Nn>+^04jwc;+!Eq1-~>N zUN}|T3x+)0nS*FaNa0|a60{s1Yn~kdr6ea=nT25#p>gUl*(~|RK6|u}sxrT_*Pc;j zt;~t=PYVstj`Ytkurr%oXSA@_`wLP}zMN+A6(6g%WQG_z?HQHUiXMCVoHT(WW2?|l~SJ8=j@xark00>Z>&f!PAJn!(do6;>eI3Vee=RI zR>%I7oiQcGoKrumSeKLGFB#Ywe(KYj{dCtlDt)D%f|fpeT)e-Okmu;kO{|TMjH|PT z$6i+G%#4Y#+LOcWtTNtaQ=7FqQxpIuDHir~DOO~dq*oSPTupU5ST?Te!7D3J;-X@K zBoR8#&s`Gc>x{9@y~wCq8ZI6>xW!p<*^Y+!2k%Wzd-(BmT0IQ&W90cJOM%SN6v!Z_ z!dVmMKRbCk6HM$XHV?A{arYFv2@-2JX-(P`ZOZ1QVN2`Ls+?6-PSKoLlel_yVy$I* z#`NhK94q$^qLCdU&16OkgdfU=>7sGp+I{=hG7G)#+eahI-JQZ4@bZEL!ERNQ1;(+U zgjvc*5_Enkh0QwFyW_(CWSuTn>j-Z4^9Se2+j@zmGs>*u4)HdY?)sYbZresH!eG&g zxMIhh-x%3J_5wbf`&(uZ4^Y3sDp?Lzy;vn4IFSm=5CbVvi?6{~OTa*nkdXMCS}B-* zeT6Eoxay2ED^*fnapjtlh>);I2Y(e`o1^J?;;D{-8ESRsBhR-FtgOnveE=xOr3w57 z)%23++c@m{2a|RUKg{&2Z@6I%yVupsvRy9|oufEcpW=I!FRhiB$6Q5dtMMhuw;O2T;SAIj6x;8p- zZnO_8U>6gFX52{&%B8|1hV3WQp8yJJ!LPBOLZ*v7C-oqv6_P9qgm z>HL-yrcEuKw!F$;XU$Wo%g)nkRupR^-l>cUv_-@g$LR~h#KZ!vSRWhPRH$Y>#XT3) z=eGm|b=w3#%Q zggemN9ue%iNqlPA!DspwJaK+NV9PRd$a?5a81M`Lo(YI$DzV0-y~D1k3&+kBO3JL5 z)iEiNCgXg~%wSc2<&4d>d98Y5hcD|W?Kz_&G)&40++7ppYYUI5i1xRInH!?~icQfC z(SBuNY@@Zu7;$=ePES$S{6c@fj28cZnfCOCsH9A_rXeHXU~Z_%8R3_0jBtkgxjrq4 zFtTiGm0z^9EaQX92%T6Q8eS0-SQ54?H%NWJqKoV=AKX}*x4PqoyXL7? z%j)w)q1qA@JQU+w5}Pt)_5(!l)tFZF0evCvNw8Sl=h2Rgkl|u$V7xHK-O0yLUg;z| zN#j?J+e*xvU@b)-+5V-%ChOVTh}*#Z0A@_GiF(&YcCO3B-d?(8)AD`z0V;S^LcSQr zu9Kl5%c@2b!(7qqA86ODUHkP~IE%D1jjd*~O<@?8ilsKP&wa<&f+ZF+#m|thodV1( zimZ)UGGi!g8J9n0VVij}%c*b%1ZG7CnJUeCXMBcAEiQ4YRDC^h*0R>T7=36$s9_$bUlg9OyHCV#`JiS) zU{-02r{i{Y%hmM(7Pl3L*u=qI+NM^u>;1>neKR0snXov266qAzV^>K)JPK(im&n5oVw5RN zy!{XU#`KQUa|~*6dWv;FIw=q->(F9N{3HOae=7mW%K zAEn)z`NBOSM|0vt;VMAVUR@4*)T%j#;D+0aDC8uJ>5weMi6h z4p2S8%3V*pX0b}lX$K}%m;)s+5WV$>*^ny$ci0K0;5zm<$p@eCyLSY+H40F|dg z1360tCl7;@Cio5TI%N$a@#dyRF)^me8xY%i{q)(Yx#m#L@5i9sL)R~{hlF88lxazp6) z=~|z;I?9n|xDSY*1EWZs;0Q?w6ege|D=7C0Ov)ZGzPYA|*R(hHb}hbcdY?b*()kj0 zQv<{z-zPicyK}2$1grBCTNX5TbmYyOc}0lfswIAY^X5&zEY!GZR`AWOm4jDQrzlt& z8UPJ(co#5?M;2AVkUM~|5^;=&+|ZSLvgF*=9YZ?Ba(IMo8_czzT^Jmu5~D@&W~0bh zNnpsG4-|$)MMYa5VDYXG#6x+7{hMO11|WVhjPn4Sv#kLwJGJ6hfI_ z@(s@fP2g3Jdxj+9q^#VmaCXa%hztsRQhA3ViitCZwQB-``lEbUdTiyY?UsPE>leOR z9xCn7EDwuV6038@*&?ASbiW((8$WEq13!lDN(*_RYsF3oVv4UvlV zMrUMzE;Onk+4+Zps4gChAhHvCK_hq`B(N4_P}qi%_r!W}@Wf7Wa6RdKGcdRmV-SNv z2RwNINOqX1z|MXesq4Jpg3h`T-woST5buz6<&BNy>)1bCA?K>JXJbD3@34>Lcf?yH zQY3cCc|Tlr%S~57eclntw3BBq?Zg;pTfD^&x=X|GpZNB+v(|2V@urn4uUND6Cb96u zGnn(fm~i4f(L(dWu=XXGM{%aXk^)CwvYPBxcI%OQhcCYC@cZ|kzx6J*+BJOQ1Y6D) zfBiMhLD(%`ggIn7NToSMw~l;!+m#pZVS%o1@gtGXyZ!w7-&c|q?CfOl0mcL@fx8kAsCo<+sH>2DA9iq^9 zISP#ep7tYEM<@yv-@^P5%m)o=K7wsSL#^k?Ubug^a|gWxG)fry13HjPEYd2@P70(_lq zWj%B9hM8Cy@2@S6h%ZkFbwoonPqY;W1a_Z(VRuEVo!wn$i7_wDFw|r?=4U~Sn2><` z`GNw8_+mlI2#%iDHhKzI!*{DbGg_@FjfkoYi!6@x(QHK^Qg>r%{My2{i%JYS73*vX z(qviN&$9U2L&DFo$DLC-_-JkX?D$jz@S}J;p5uqCL%dAxF}mDf_Q8*< zqq0jR)x50eWi@mE)STHL6|a&?I{Z8GqT%#2${n#nV2QYebb@S*)s_!d8j~#vF^m;< z4L3Jml$H__mMrRr5WU|&RIyE3B&FL(DihqvVhraA*-vhLl>Jf8Jd{wxFu?;nDXPAD z%UQ`erpU9(^VxQNXJcHTqreb;ddZZwlJ2QRqPVUiF2o)gSDO%Oj}@a&ys|MTNG;}P zILqweaSdgDsyU6PUD8w8D@hRz8HMvRLTgj)vvc7zGt`v`fb9_K`NpKv2>g^Z4L(*4 zJLlHt+J}R~vnpc(h9QC9Pfg333zx1jBRoDoJl3_JaKt*oOIU};f8=XW*6O9<;bDOD z4>9^N7-5W3xs!!gFp5Wj2E`29ed-XAN2}Vw8lpq;A=3P zqY7do)*zo0DQ_~EWTu|E=cb3A+PT3oJj@zj`Mc}xf0o>XK{AF4WPJa82`DJu8-5p9 za)2-JTntvDClEqr1M)M0243VSzPO+?NIx@EB~=ctNeLQ;MW_wcc;3Y5stTQ0tOHuC0)m3jP8@5l^XwORx9PV$7_5%@H zJJs`&b3pZ$S&p!1ndTPgULjTqqO*Ws&u>HVrtGRpTu?RZ`kM69DrPh!gqFl4)meRC57<(^(UZ+Fv_m5u3zi?fV%8HFn|^x&8ivRjIK@T{W2sF*L4yn%v9>PhE;z`TPs(g|!G-egU*w5S8-10yvTo-)L;$l%OUh$bxywJxG zQ_$}(#%Xo8m716sJ2SuW>cR-Ntici#=BH9y;}*4BMKR|FKmWuaL%LcM=`Tt7p;Ovt{lre>II)!SJ*l{DM$ zJk~t4eLJn;1a2{6G_4VDK~hOh6~L5-a)(-P6=Nm}XE_&5w$8PSM3Z$A9AIWR*6{L{ zreFTp6=y8HLX38uLHR~TF^lNJn3KGvdD}aBFS~ksZ|87F=XSQ{i4vd4hNnc7tOj<` zW$#DC`Ua*Ihed}4S;PIGyLK(4XG4uqtI?|#X)=uw5)<=WJZnVMeGRL5`BTXCJn#CE zg}5r1-_K(7O4rjXS28Ch#e^jILnSaph$g@jjh5#YwB$L*kmFH=PUK=r81gO2IQ=Uk zPX*tQb!8<<=~6;Oa9EArM~d+APin4BFqnJ-%_^0Dv5GmPlf*-Fd~*L*9p?WY$mQ? zql3RzVCPvO?45uiB{_p3iEff1g_C45X3$;*z_DS~6LiM(8ol2bY$}x(aL>xH1!(*d zjp<&HiJ~`XfS_2oRMax397RJ|<#aYBc6myT#Ew1Os#`N9xzHSw=&xd}+I2aW!h|UL zY~B%>9vvsMXaW5qKLYr z&G44a63jd|qbDDcyb0x?lT(6DIN`A&%1V~>NZPRMf-tpet8cHZHgij1{2vlCGgp-+ ztG5PQeG0nReXc!7_ysR7N|NTy*R84?JXjK>?(GqK^6OiICD)y-E9|OENGjr>Wf9`@ zv~NNHR9W+OvWxjWM0E#*C!M zY-d_?jk&5kA-CAx6{0it6=$o&5{|zYH&7eCuQB{qQ+zp z^)!f08BWy*4GNgGkZ5g+ouYr7xPgl&S?$dYHBC`5Ej3N~iT*X|ZPl%@F>N(1R@4#{ znf1Am=0bBwc9a;5Q3bh$*5>M_Xfdv}rp0b8%4(}_iG%YJ?=T_BvpKZ z>o?9;5VOGhARi5l$5Ime=F&?q9p1iu`$f-ReDT(8Pp}z9wxav*#|xX~a=C6Ie8zPI zu?uO5tSRl#71!Bp%ZY!`E5^mU?WnMM6>{4EydfDLAKSA7cp_phI^1ePmB28MYSB9v zZ3(o34TxjJW_IX2U6F6DzmyUZf8MOJfRNg5N9)VtCMh^9wLq^9@lC&@E!7Yot%+*2 zH=kAzVA}GBG#0P(yF4pFG}o&wT3vLMe@Jb?oc1)GPj1fwo8>v*jG(Y2zksL^U(?*I z-s1Goh-jU~IxW{y9GvWWxj7=$V$x{Z&G8l_uu$bCE@e*fQ^kh^1>@1qU&d0GiJzW@ ze{h%F-@1>8M=>TIHOR>K5%%x^#zPF-WN%y=i+2>CcXCchKEg^#7E}98wXKm_k=2Hn zy8YOodRn@Dwaq+`Q!(EbdEdygB>`;lf@=c&w=X*_P+Ty7M{v;k{^*iv)7Ee7pEl6P z{@kc)4-NMZToLWlrjkxe51moierZu$t%V8m=k3r3U$<!w z;M~Chaj<{GhJk+ICd4rfYv49Ap5jM_K$&956nR6>=P@LYAd&F5=D`Tc@#8r1tODnF ziGwp>IB$#9e9G@U}CSakFb*>yI{B3jarjYd7F0Iym?t@Z?C%YjK02A zJLETLL#og#n%P>O6-0j17N5#~YH{_jwXP3d!~ch3jE6B8Nx!VXeFf$80vnSAiNxsz z@yQ0M^~i4qBgdFRE8;iL_xutonR(_v`@*%X)}qs@S&%3$2xO|l!39>GD$d`ypyM}r zS@U0?FXA1pDf9SVxqvK3yk$^SgKoZ$Uht6^Sp=zDN9IMXuMy zm)hDu*{e|T_q2G|@ARIt8>g6y)AH-H%*Cnsd65BWVd43a{^>^XuA($+^OU%vwEV`b zxU%%Hh@8m4%+QFOr~ur<;r<#GH8XK{R0iM_+y+|@og&MGI)Wfq8hi8ZwRhjWcEQ@U ztbsnwuJMOr09+o2B)!`Y>^j&5ejV zGhCBw%*fN}3~XsfD^i`#2z^w6j@h+3G0?|%d8DR4G~AJ5jJ5b^!g1#y76c7=5fwla zPS1^Wz{Nw9P;TR8g@A`EXIQuTH6?3(lKr*Qq=?k^8Hs`Um5qtHXT4lzVO&`G08WeM8uuX6lcIo;yE3rwb)sSoYX;9hdk0m zu>?ChPHB+sfg`G%WR86#4;L{4-*=waIvf&~SrQd69IV!91LBhkqBYuFTVP4byW&r- zd##c2)`(cv={l>_M^a7ITYUWTR7fW~hrd?q`W4XNV;&<>#Ek5-D#OP$lTYBg(Wne*VpYQWVRNjnw)?X+${8 z&~X+md^@rJ;_}nZFqY2{OG=ttQvrtw)@&-bW(LYVk@Op&z@)xJE!u-7*GaKf*Q+Bd zECDTv*$Yxa+AULZLVYrW^f?AymY!@D+cMoU1(vll*}5_Ln8ikhxY_(EFv^kF=cuT+#E$!dWG z<{E?CnZ>4+ab$m)>gt;+?#Y^Q->#)I7RxBJKc9%--!wGT$V8WWC;k2et=p=si%88= zry{R9QLiX~JB3;)w|hvw-LI%vR)Eeh4#vC*x)wZ9)y#fSHDDdYu_j%k-}gc;!n82C$$nEMzne%*aM$Y2M{FJqtCT@9PMZMzjU9B+sTc3@NEcbH z6xg|=I0P^D9DDJ3J!jy(#oeuWv55&r!`vM^P_>Da zmH4={Czzfj`@3*oF#U!CRlUpox1oQv@K@p9N&OhlHV99iH2#n1-zGeFQvbDBXOZyq zN&OFC{Fd=`KobVH0jHXBJ}b$BbLV(|K+0bukQrxpePFu=MGv>TcCaqjpV-C|pH;28 z`f7d<`q+A8M9$aVjMk>GVxRGc!NM^M5N+7-t6zyla|wjnfZvNehK z@ePm2n424@U+y_Y)}DOMtXSF!xP7e7>fB3UPs-7AxHO z3#T43YZLlc3%8!CAKbb3q<)zTUj2CD4(G7)`gkUqxR1C4>m!@S5_tb=?|wYbFR%>i zXB#H;|A_uLiLXE24{qWgKQlK{ei_z+N&+ajQd}O`&3J>6OtyT&l|q3=OAC(C|4?OY z@nuaKZSi?VlWTNjTYnN`Sy>sq+eTPdJ1Zy+n{}mLf9(=qpC))RU2j;KSh4QRihS|m zc7h*V7q66LX*|I3g7=AjezvO6^DEvDD>k8jweb3>`a#bRPwJP~KYUWZOy`e0{gB2s zA%y+R_VWyjQYuMt9NX2s;r#CN@!y8-4Qzk+2E5Vto(-_IaqdInzr?Rlot2Dd#{|0) z{waQgiGo899W4nurtExbUbqGuva8G5+u5VjO}~EAfLh&^-&dt!ZGHjMue$&q+jDuH zOYO<73z*a1v%;R3Kae$J+2z+R_Vb!57|-n-?3v_I-4H3b5&94kgaj-WEz?8L+czR%l=T7=sA`KSE}4c`AHIF07)4| z1}OyqHwAk+&sxJhgHhl`Yp}w$0_&KpvKU>RQB$fn)CY*eB{hrJm#0q6iqDaH?JcHU z1fjKY!42_oY-k3v1slqORZioHPesj&+-#{Kt89LPE-t%8tr@P#)U04Q?ube3it%Mc zMft?-``~1u>U06PLzXA>uAY91UbbP;li9X~lY2kKx{DT1>Xk%{-QrmRvKQt4 zOzJ~6mVR%o34XQ`g2E_zwj!_NKiEo&-Y6^K(d~G}p-ke(fu0S`ZcVl%h|gXWJI7vm zL3!7FU*ARP#!GZM`E0PKIz%IFl0G`aSvs_})~Hq+nQJ7}Tv}-MbKMx0l+&K)A2=gW zyyPvv*|V=+kQKRbmX@_7=Uosdit?dhlr1ID_-J0<9E+cSai_n3X>)?-^ba_*-=tE2;+{JXZ8>*60 z169}(A|f)b&j|7y_K9Psfyt59vIvbDi7qGhgIr(oL8G|~O4~tC=;e83$|<0cpAWVT zWSLo6kYR;0l_Wqus~eY#dM+2^y{qRFSG{|G09QAxoZQPLVAWVJ-veF}`MRG_?>Bs1 z%AzIk-qqv1vi+xCw!y2HTYr(S>*hiVrD^wlpS$R78nS=bg7d zG4+9loc12mRAg&)>NHQpS`4F`l3oTvpkoWSDk43*MXG0T1%LvA+@D`#ooq@ z(%Q6!hSP9%m8W94e^0N;aHg()F&igXS)h}AnjzC^2ghU@r<122bUKshG_jZHwE3jb zGCjQe<#Pp+M%m5{a?3BDnH|DOg&BT?eB`f$U9i=YPsDLzwy@H{&#opNmmPBbt8cLV z^ou*or@9VH_qpE0;nl*-&}x2M2HfPkb4fmpaKPQsEBnG5!Mo*xyiXYaXi22oB)$rNHNupn_ z%HVRcoTypLd*#uul7GsAg!j?!HChUze&IYJe$w~{(Z3nv4^A8}{+s$S-Y{uA`M(>5 zgPgZs>vOxf@vL!ZTEO7F1Up9G!AB$i1lZ}U^PqSrI7Rv=J1iNodL5SqdZ7x_|5a}p zGDz?Y;lAO#;!sYdQIQhPD!t70Nhc0hZrL(iTs)jVYkp-BuRU3ViW*PliP&9LSy^@B zPJ3&AJ4$OR+mc~L#!F8?1v$2nwdy`j9XYm-9xITJIWr(v+zbD(b zNN>!|3yaxQcrL;H0(Vw;R)ikJOfr&+^%5oH;w^vFMt&Oju@l# zFXjF4d!ZXXc%d3%gM60C)0j8`P!9j&ZB{KZ6XN#b;t`ZO;}yluSGhi9W^roOi7$E8 zb7cV_;`)c*!zcZdXW*QW1<3mMG3g&hb06Czd<9HHX}5+n z^YrqV0-)f#FU2pw6qOP;Gg`N@o63jEs}lVsY!FU7rdEuZRO4k5KILnK|H3M~AgU|O z5Ec}ZYMK+}v#dofj&jz<2KZquXhB_tTqy+(!|y|`gWCjPK>IQ<0Ic9Vs+pqUTk#W0 zR5S7VDw+Yi_z$wvILUW$>5_4-awoG}cz+9a0is?rmm$=yi%vy`zT+}91#64$uP{DC zqW^mlswGaU(L%i?3RJzyv<#;$XzlE51{mJ8TK^iEI~OoDLgFEhT;iYS_eK>2`iszy z8m{1E>7Qp1M6JBH7`IOnqk}af>PIlD9p9_u-4wn&(EynR^pm$Art}};{jj$*9;>1n zp5N^Tem7;j>jkO+qr1INcT+~w>dNT1`Mx&3`ngK~6;kNQoC`<3yY)!`AynUIOAlc%uBGak^(cl|%BYWvTgKlmTHC+H|= z+T`7REE9%)Im&v8`_dP1Oyzh=9xw0jA9DMW$0^Lm!@khIzfB+u<2|1CtqYiq^T}&G zJTdeO?|9aSHG%gn9Y8)fTCN&`=uCdP&xFHy`cvbG3Kd%8&ma_tD_FlP%xVjZ+1%YR zr*mDC&Cj2`>3W!DxXMzh)tVW(dVO<-vnfraXLpLq1Juh;+xf_nX&E~Id_2c<0b5+7 znx1B>+)=E0amROKuJrI; zvL$%#g6qVKoHNR3*9%lHNVeo{uhGyHzBV-Can4_PbO9{Y8M3E6WqdS$nnHo(3O*X+ zAZ>D0A%}!#M|yd$JX-c*4s$#0H5y(FvKuQXM!;z3pc(lhdQt=4{BPuo_!IPU*v*Sm z#?KX~<{^1Zrj#rh>(-k>{wWofuFukHH6t) zB}qPgmCsAAP7VIW+Dxx9&d$Pi`Pif>NQz|gSuG{XxfYmkrhta)NjN?K}Sbx}xEQQpPM z14<+LdS^vT3?e80u+oC8Kz*>+vr6>L((GzuNnMVW?12-}Vm|!E)L*LR)g$>oF~L&6 zUM`mN9|-1o#k91WB#DG$^;Gkvr=l0o=9(oRXvY~*sA<>XwY zIz5*XdA-deuYTSypP|S$?hZa4z981&87|qzEhZZ`=rtO?F-~daC{P~FpL0^|>N%Vj zC49UQgm_K1@U>)xhj_0%T8_GhPa4gm?(WH>W&OGMq|rR`>{3R{+QXlr3c|Cu6CV~a z9v*vAWb7dk;*$~DY{FCK@%Uo2P>C{<8M0Ng(@`X{YP82{x#eQtU07tu&1uQb2uB_? z*hf=*_CBbyWDqATalYifc61SImh`UWepaH=!G|p`1A{KAWa^P_>@NTI10Z7D6mwKkN${8 zf5X?1JwbWx_xWgV&+bQlPt=TJd?z0-+b?4C`oq^FOluohw<=OaMx6~ zhMtv1|5p5V@Hgo9$cl!ZL-0!W+&URp$~#yfjU<4Wm~J2iXq5>{T!0(KzWfe*FyL z1He3Xj*F`@x9DE0*M-`25tvcyonWS0Wx zlCgP8+yYouDf4p2=JjwmWt$}5@9D95UiL+qw|Q)yY+KBTkq~Qe-|=>Cw+r}sG3bY% zPB9YCi7Wmpdbz)f?B_5at$3h_sPN1ZjSeDyz+Z(V_@EvXPxYei8MS6S=d@Z$G<}cM z5{=MdM4d7M5BuYR>35V7Ge&03q7fExh-HXh$`zeT*(3dU9o(IKJIg4HPp?l7bLgr| z0+{%vUtLOAVM4lZWs#)9+!Z47s=O8+S$2!~O$h<{tWeh(J$e+10cpA_k%i}X`PY9$fhb0Y&Y!Xj`jCraxR?S}_^ba*AWr?|tIKd695 z;)>{Tn@J~Ndz(5#bj`6*DX9zNbRD7ABtvALCfm1AZ*0iIH0J&hb^Lv(#WCTF6@J9{ z^EAq12T0dPmTCIJLexHy<*Q7&pihn<9a%e ziq)_tek+B}(l2q>yWhfk+(NkLqkp^j8Sk%gzl#10e)old`gQRL@2_*ej(%<#+<$cc zOMLnNWA8n{+bXiY@jG+XEz6c=NiMQwNtWf_dj{%vZscV=zl)x$?}4!bL?s+# z1jW0-Z|HOwCqgIiKI}wD645&XAMaC6x)32_2Zry&WAHlu@K^9vrde14v)NDrW9b*L z!WXWC1>d4VrrX=&d{7ql;`w)0WR3_(i5+j@~fql7xhdm#j3Le|TC!*`;OnrkW+E z)^XwwLuO$HDoBRL3B z%MsnBu1;xYkM#^cgm@UUw z`4{h)yI{fG9r*u@#-^!Ln;ILNu4!syNA6sTKRa(cqj@rm~ z{BmFdas!x9dF=A@l}FC!ON@Np@QoZto&?7}el|v%LT{P~4x^!n2JI6kiYh2YOxRuW zvprcI?JKT6pN0DKS_=y7DHpeT!dG8AC6LYbbyU{mWGNr>Jw~hFUtCl*!J&I19oq?b zHNa|R19~8ezzCiqtkN4yFPt5Ge8cc%A3P4v&hxDXtKq`e%UP<0}zhdAC3%9oUiyF;78^J1z;T`#*Vc{v+xzMRn_5#$TLxoojUgF z^m>Z_VeXWTXKtJ_cka{;r*E7x@0^()-x7b4vUjQ9%F7Gc{8RcT7`wZT6Z%itGINrt zug^4T=BB0P$wuV{XTSe!Hs3WR(+el{3X0;*af^k7$Q?kHo+7?dF99>fc%`!lFfHSe z2kuX>=ze3?-;3}Z`*zw6D@?OoVN1A0`P}$rlFhKsYJe}zV&~@Cyu`;+Yzp0enF*Y~ z0DM5!s5A}W1!A}gEQWJNyPJGC$oCaT9pd25Udvx7Dedu3Vdt}BtL*l^p?tj|yAH?Y zhr1Go*y=^~4R*`9=VqF1&70X#I_1VGX*ddIuPR058D(r9t=Ne|4(`z~S%o9>n2jXy z6yeQ{hgF)>l6qjx-`ccMd1!f2QA6|L>&EHz>G}B!mB&w9zak@h+EE*(4;19HV{Tr! zXuY*G!*5QutepGh4m_I_HsysDD4ChAKsf zcZSvH(qHMhDzyL2__Ig_L|;=UX3{6QhLZIN%;_u^dY9O>%FKk*z3D5R4EK8Lw- znkav(B;z^W;NZD8@^@A$-e{hqqtcIvr%922uzm84qVz4&`Lruq@HKLuA(5{3&ApH> zIe=QsbW$vqGH{+w0Ras_f26Zz{8R zGQzD{Nq=0|Y&2y1p5vFUu1!v=TvTF&a{NUX zJ5&9+Ea%7-YkGreQ%{*Yt|dFGv;EZWns8QDvW`Y7I12%X08x`);jXt0bkR`k~!%f9dE5W zY1^8a^&6M;pR{0EQ;uJ6(3#u?=u6BU&^Qko9U-5%k6H!t?IAU`hcIfWt*HPcl=rwn z?{a15)T{-F5zg3@h7fF14fWO=@-`$#*v-QYQ2#lJ6l5Iywh50j~mKjPiy%0DuI~XD&CI8mFDv7_cQD)v(~) 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 z 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 5.4 +* [PHP GD](https://secure.php.net/manual/en/book.image.php) ### How do I use this? -Simply clone the repository and travel to ``/barcode.php``. You will get a random barcode. If you want a specific one, go to ``/barcode.php?code=`` and input a 12 digit number. +The signatures are fairly simple. Simply call `barcode` with the number of the +barcode and the scale of the barcode as an integer. The number needs to be +either 12 or 13 digits. The barcode will always be 13 digits even if only 12 +are supplied as the 13th digit is the checksum of the first 12. The barcode's +scale will not go lower than 2 for scaling reasons and no higher than 12 for +memory reasons. A scale of 4 has worked well for my purposes in the past. + + $barcode = new Barcode(1349875921348, 4); + $barcode = new Barcode(439457143245, 10); + +The key thing to keep up with is the `FreeSansBold.ttf` file. By default the +Barcode class will look into PHP's calling directory for the font file. You can +specify a path as a third parameter. + + $barcode = new Barcode(123456789120, 4, "/path/to/FreeSansBold.ttf"); + +There are only two public methods: `image()` and `display()`. The first +function `image()` returns the PHP created image as a reference. This may be +used to save an image to file, e.g. `imagepng($barcode->image(), +"/path/to/storage/barcode.png")`. The second function `display()` simply calls +the correct headers and displays the barcode in the browser. Useful for +debugging. diff --git a/barcode.php b/barcode.php index e4ed30a..37ddecd 100644 --- a/barcode.php +++ b/barcode.php @@ -1,38 +1,244 @@ "000000", 1 => "001011", 2 => "001101", 3 => "001110", + 4 => "010011", 5 => "011001", 6 => "011100", 7 => "010101", + 8 => "010110", 9 => "011010" + ); + + public static $LEFT_PARITY = array( + // Odd Encoding + 0 => array( + 0 => "0001101", 1 => "0011001", 2 => "0010011", 3 => "0111101", + 4 => "0100011", 5 => "0110001", 6 => "0101111", 7 => "0111011", + 8 => "0110111", 9 => "0001011" + ), + // Even Encoding + 1 => array ( + 0 => "0100111", 1 => "0110011", 2 => "0011011", 3 => "0100001", + 4 => "0011101", 5 => "0111001", 6 => "0000101", 7 => "0010001", + 8 => "0001001", 9 => "0010111" + ) + ); + + public static $RIGHT_PARITY = array( + 0 => "1110010", 1 => "1100110", 2 => "1101100", 3 => "1000010", + 4 => "1011100", 5 => "1001110", 6 => "1010000", 7 => "1000100", + 8 => "1001000", 9 => "1110100" + ); - function __construct($encoding, $number=null, $scale=null) + public static $GUARD = array( + 'start' => "101", 'middle' => "01010", 'end' => "101" + ); + + public static function checksum (string $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; + } + + /** + * Create the barcode. $number is the 12/13 digit barcode to be displayed. + * The $scale is the scale of the image in integers. The scale will not go + * lower than 2 or greater than 12. + */ + + public function __construct (string $number, $scale, $fontpath=null) { - $this->number = ($number==null) ? $this->_random() : $number; - $this->scale = ($scale==null || $scale<4) ? 4 : $scale; + /* Get the parity key, which is based on the first digit. */ + $this->_key = self::$PARITY_KEY[substr($number,0,1)]; + + if (!$fontpath) + $this->font = dirname(__FILE__) . "/" . "FreeSansBold.ttf"; + else + $this->font = $fontpath; - // Reflection Class : Method + /* Clamp scale between 2 and 12 */ + if ($scale < 2) + $this->scale = 2; + else if ($scale > 12) + $this->scale = 12; + else + $this->scale = $scale; - $this->_encoder = new EAN13($this->number, $this->scale); + $len = strlen($number); + if ($len != 13 && $len != 12) + trigger_error('Barcode expects 12 or 13 digit number', E_USER_ERROR); + + /* The checksum (13th digit) can be calculated or supplied */ + $this->number = $number; + if ($len === 12) + $this->number .= self::checksum($number); + + $this->_bars = $this->_encode(); + $this->_createImage(); + $this->_drawBars(); + $this->_drawText(); } - function __destruct() + public function __destruct() { - $this->_encoder->display(); + imagedestroy($this->_image); } - private function _random() + /** + * The following incantations use the parity key (based off the + * first digit of the unencoded number) to encode the first six + * digits of the barcode. The last 6 use the same parity. + * + * So, if the key is 010101, the first digit (of the first six + * digits) uses odd parity encoding. The second uses even. The + * third uses odd, and so on. + */ + + protected function _encode() { - return substr(number_format(time() * rand(),0,'',''),0,12); + $barcode[] = self::$GUARD['start']; + for($i=1;$i<=strlen($this->number)-1;$i++) + { + if($i < 7) + $barcode[] = self::$LEFT_PARITY[$this->_key[$i-1]][substr($this->number, $i, 1)]; + else + $barcode[] = self::$RIGHT_PARITY[substr($this->number, $i, 1)]; + if($i == 6) + $barcode[] = self::$GUARD['middle']; + } + $barcode[] = self::$GUARD['end']; + return $barcode; } -} -$encoding = (isset($_GET['encoding'])) ? $_GET['encoding'] : 'EAN-13'; -$number = (isset($_GET['code'])) ? $_GET['code'] : null; -$scale = (isset($_GET['scale'])) ? $_GET['scale'] : null; + /** + * Create the image. + * + * The Height is 60 times the scale and the width is simply + * 180% of the height. + */ + + protected function _createImage() + { + $this->_height = $this->scale * 60; + $this->_width = 1.8 * $this->_height; + $this->_image = imagecreate($this->_width, $this->_height); + ImageColorAllocate($this->_image, 0xFF, 0xFF, 0xFF); + } + + /** + * Draw the actual bars themselves. + * + * We have defined some constants. MAX is the y-value for the maximum + * height a bar should go. FLOOR is the y-value for the minimum height. + * + * The differences in margin for MAX and FLOOR are because most of the + * barcode doesn't extend to the bottom, only the guards do. + * + * WIDTH is the actual width of the bars. + * + * X is the starting position of the bars, which is a fifth of the way + * into the image. + * + * To draw the bars, we translate a binary string into bars: + * + * 10111001 - bar, empty, bar, bar, bar, empty, empty, bar + */ + + protected function _drawBars() + { + $bar_color=ImageColorAllocate($this->_image, 0x00, 0x00, 0x00); + + $MAX = $this->_height*0.025; + $FLOOR = $this->_height*0.825; + $WIDTH = $this->scale; + + $x = ($this->_height * 0.2) - $WIDTH; + + foreach($this->_bars as $bar) + { + $tall = 0; + + if(strlen($bar)==3 || strlen($bar)==5) + $tall = ($this->_height * 0.15); + + for($i = 1; $i <= strlen($bar); $i++) + { + if(substr($bar, $i-1, 1)==='1') + imagefilledrectangle($this->_image, $x, $MAX, $x + $WIDTH, + $FLOOR + $tall, $bar_color); + $x += $WIDTH; + } + } + } + + /** + * Draw the text: + * + * The first digit is left of the first guard. The kerning + * is how much space is in between the individual characters. + * + * We add kerning after the first character to skip over the + * first guard. Then we do it again after the 6th character + * to skip over the second guard. + * + * We don't need to skip over the last guard. + * + * The fontsize is 7 times the scale. + * X is the start point, which is .05 a way into the image + */ + + protected function _drawText() + { + $x = $this->_width*0.05; + $y = $this->_height*0.96; + + $text_color=ImageColorAllocate($this->_image, 0x00, 0x00, 0x00); + + $fontsize = $this->scale*7; + $kerning = $fontsize*1; -new Barcode($encoding, $number, $scale); + for($i=0;$inumber);$i++) + { + imagettftext($this->_image, $fontsize, 0, $x, $y, $text_color, $this->font, $this->number[$i]); + if($i==0 || $i==6) + $x += $kerning*0.5; + $x += $kerning; + } + } + + /** + * Return the barcode's image by reference. + */ + + public function &image() + { + return $this->_image; + } + + /** + * Send the headers and display the barcode. + */ + + public function display() + { + header("Content-Type: image/png; name=\"barcode.png\""); + imagepng($this->_image); + } +} diff --git a/ean.php b/ean.php deleted file mode 100644 index 6b83b7a..0000000 --- a/ean.php +++ /dev/null @@ -1,173 +0,0 @@ -= 13 error - - // Get the parity key, which is based on the first digit. - $this->_key = $PARITY_KEY[substr($number,0,1)]; - - // The checksum is appended to the 12 digit string - $this->_checksum = ean_checksum($number); - $this->number = $number.$this->_checksum; - - $this->scale = $scale; - - $this->_bars = $this->_encode(); - $this->_createImage(); - $this->_drawBars(); - $this->_drawText(); - } - - /** - * The following incantations use the parity key (based off the - * first digit of the unencoded number) to encode the first six - * digits of the barcode. The last 6 use the same parity. - * - * So, if the key is 010101, the first digit (of the first six - * digits) uses odd parity encoding. The second uses even. The - * third uses odd, and so on. - */ - - protected function _encode() - { - global $LEFT_PARITY, $RIGHT_PARITY, $GUARD; - - $barcode[] = $GUARD['start']; - for($i=1;$i<=strlen($this->number)-1;$i++) - { - if($i<7) - $barcode[] = $LEFT_PARITY[$this->_key[$i-1]][substr($this->number, $i, 1)]; - else - $barcode[] = $RIGHT_PARITY[substr($this->number, $i, 1)]; - if($i==6) - $barcode[] = $GUARD['middle']; - } - $barcode[] = $GUARD['end']; - - return $barcode; - } - - /** - * Create the image. - * - * The Height is 60 times the scale and the width is simply - * 180% of the height. - */ - - protected function _createImage() - { - $this->_height = $this->scale*60; - $this->_width = 1.8*$this->_height; - - $this->_image = imagecreate($this->_width, $this->_height); - $bg_color=ImageColorAllocate($this->_image, 0xFF, 0xFF, 0xFF); - } - - /** - * Draw the actual bars themselves. - * - * We have defined some constants. MAX is the y-value for the maximum - * height a bar should go. FLOOR is the y-value for the minimum height. - * - * The differences in margin for MAX and FLOOR are because most of the - * barcode doesn't extend to the bottom, only the guards do. - * - * WIDTH is the actual width of the bars. - * - * X is the starting position of the bars, which is a fifth of the way - * into the image. - * - * To draw the bars, we translate a binary string into bars: - * - * 10111001 - bar, empty, bar, bar, bar, empty, empty, bar - */ - - protected function _drawBars() - { - $bar_color=ImageColorAllocate($this->_image, 0x00, 0x00, 0x00); - - define("MAX", $this->_height*0.025); - define("FLOOR", $this->_height*0.825); - define("WIDTH", $this->scale); - - $x = ($this->_height*0.2)-WIDTH; - - foreach($this->_bars as $bar) - { - $tall = 0; - - if(strlen($bar)==3 || strlen($bar)==5) - $tall = ($this->_height*0.15); - - for($i=1;$i<=strlen($bar);$i++) - { - if(substr($bar, $i-1, 1)==='1') - imagefilledrectangle($this->_image, $x, MAX, $x+WIDTH, FLOOR+$tall, $bar_color); - $x += WIDTH; - } - } - } - - /** - * Draw the text: - * - * The first digit is left of the first guard. The kerning - * is how much space is in between the individual characters. - * - * We add kerning after the first character to skip over the - * first guard. Then we do it again after the 6th character - * to skip over the second guard. - * - * We don't need to skip over the last guard. - * - * The fontsize is 7 times the scale. - * X is the start point, which is .05 a way into the image - */ - - protected function _drawText() - { - $x = $this->_width*0.05; - $y = $this->_height*0.96; - - $text_color=ImageColorAllocate($this->_image, 0x00, 0x00, 0x00); - - $font=dirname(__FILE__)."/"."FreeSansBold.ttf"; - $fontsize = $this->scale*(7); - $kerning = $fontsize*1; - - for($i=0;$inumber);$i++) - { - imagettftext($this->_image, $fontsize, 0, $x, $y, $text_color, $font, $this->number[$i]); - if($i==0 || $i==6) - $x += $kerning*0.5; - $x += $kerning; - } - } - - /** - * Send the headers and display the barcode. - * - * Destroy the image afterwards because we're firing and forgetting - */ - - public function display() - { - header("Content-Type: image/png; name=\"barcode.png\""); - imagepng($this->_image); - imagedestroy($this->_image); - } -} diff --git a/ean_parity.php b/ean_parity.php deleted file mode 100644 index eb854dc..0000000 --- a/ean_parity.php +++ /dev/null @@ -1,77 +0,0 @@ - "000000", - 1 => "001011", - 2 => "001101", - 3 => "001110", - 4 => "010011", - 5 => "011001", - 6 => "011100", - 7 => "010101", - 8 => "010110", - 9 => "011010" - ))); - -define ("LEFT_PARITY", serialize (array( - // Odd Encoding - 0 => array ( - 0 => "0001101", - 1 => "0011001", - 2 => "0010011", - 3 => "0111101", - 4 => "0100011", - 5 => "0110001", - 6 => "0101111", - 7 => "0111011", - 8 => "0110111", - 9 => "0001011" - ), - // Even Encoding - 1 => array ( - 0 => "0100111", - 1 => "0110011", - 2 => "0011011", - 3 => "0100001", - 4 => "0011101", - 5 => "0111001", - 6 => "0000101", - 7 => "0010001", - 8 => "0001001", - 9 => "0010111" - ) - ))); - -define ("RIGHT_PARITY", serialize (array( - 0 => "1110010", - 1 => "1100110", - 2 => "1101100", - 3 => "1000010", - 4 => "1011100", - 5 => "1001110", - 6 => "1010000", - 7 => "1000100", - 8 => "1001000", - 9 => "1110100" - ))); - -define ("GUARDS", serialize (array( - 'start' => "101", - 'middle' => "01010", - 'end' => "101", - ))); - -$PARITY_KEY = unserialize(PARITY_KEY); -$LEFT_PARITY = unserialize(LEFT_PARITY); -$RIGHT_PARITY = unserialize(RIGHT_PARITY); -$GUARD = unserialize(GUARDS); - -function ean_checksum($ean){ - $ean=(string)$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; -}