From 7922d3254cac75cf2311a1ff9fc0543c72b63e32 Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Wed, 3 Aug 2011 23:58:17 +0200 Subject: [PATCH] Add current demo code of Freitagskasse Barcode Client and related HOWTO paper --- client-barcode/doc/codes/code93-commit.eps | 409 +++ .../doc/codes/code93-deposit-0001.eps | 409 +++ .../doc/codes/code93-deposit-0005.eps | 409 +++ .../doc/codes/code93-deposit-0010.eps | 409 +++ .../doc/codes/code93-deposit-0050.eps | 409 +++ .../doc/codes/code93-deposit-0100.eps | 409 +++ .../doc/codes/code93-deposit-0500.eps | 409 +++ .../doc/codes/code93-deposit-1000.eps | 409 +++ .../doc/codes/code93-deposit-5000.eps | 409 +++ client-barcode/doc/codes/code93-undo.eps | 409 +++ client-barcode/doc/freitagskasse.svg | 3011 +++++++++++++++++ client-barcode/freitagskasse.py | 180 + 12 files changed, 7281 insertions(+) create mode 100644 client-barcode/doc/codes/code93-commit.eps create mode 100644 client-barcode/doc/codes/code93-deposit-0001.eps create mode 100644 client-barcode/doc/codes/code93-deposit-0005.eps create mode 100644 client-barcode/doc/codes/code93-deposit-0010.eps create mode 100644 client-barcode/doc/codes/code93-deposit-0050.eps create mode 100644 client-barcode/doc/codes/code93-deposit-0100.eps create mode 100644 client-barcode/doc/codes/code93-deposit-0500.eps create mode 100644 client-barcode/doc/codes/code93-deposit-1000.eps create mode 100644 client-barcode/doc/codes/code93-deposit-5000.eps create mode 100644 client-barcode/doc/codes/code93-undo.eps create mode 100644 client-barcode/doc/freitagskasse.svg create mode 100644 client-barcode/freitagskasse.py diff --git a/client-barcode/doc/codes/code93-commit.eps b/client-barcode/doc/codes/code93-commit.eps new file mode 100644 index 0000000..2abed16 --- /dev/null +++ b/client-barcode/doc/codes/code93-commit.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 42 141 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <434f4d4d4954> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/codes/code93-deposit-0001.eps b/client-barcode/doc/codes/code93-deposit-0001.eps new file mode 100644 index 0000000..5d428bf --- /dev/null +++ b/client-barcode/doc/codes/code93-deposit-0001.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 40 195 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <4445504f53495420302e3031> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/codes/code93-deposit-0005.eps b/client-barcode/doc/codes/code93-deposit-0005.eps new file mode 100644 index 0000000..d445a47 --- /dev/null +++ b/client-barcode/doc/codes/code93-deposit-0005.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 40 195 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <4445504f53495420302e3035> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/codes/code93-deposit-0010.eps b/client-barcode/doc/codes/code93-deposit-0010.eps new file mode 100644 index 0000000..51e7c86 --- /dev/null +++ b/client-barcode/doc/codes/code93-deposit-0010.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 40 195 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <4445504f53495420302e3130> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/codes/code93-deposit-0050.eps b/client-barcode/doc/codes/code93-deposit-0050.eps new file mode 100644 index 0000000..d2ef903 --- /dev/null +++ b/client-barcode/doc/codes/code93-deposit-0050.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 40 195 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <4445504f53495420302e3530> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/codes/code93-deposit-0100.eps b/client-barcode/doc/codes/code93-deposit-0100.eps new file mode 100644 index 0000000..5a118ca --- /dev/null +++ b/client-barcode/doc/codes/code93-deposit-0100.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 40 195 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <4445504f53495420312e3030> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/codes/code93-deposit-0500.eps b/client-barcode/doc/codes/code93-deposit-0500.eps new file mode 100644 index 0000000..52e0503 --- /dev/null +++ b/client-barcode/doc/codes/code93-deposit-0500.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 40 195 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <4445504f53495420352e3030> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/codes/code93-deposit-1000.eps b/client-barcode/doc/codes/code93-deposit-1000.eps new file mode 100644 index 0000000..4b21f12 --- /dev/null +++ b/client-barcode/doc/codes/code93-deposit-1000.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 40 204 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <4445504f5349542031302e3030> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/codes/code93-deposit-5000.eps b/client-barcode/doc/codes/code93-deposit-5000.eps new file mode 100644 index 0000000..8a97a91 --- /dev/null +++ b/client-barcode/doc/codes/code93-deposit-5000.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 40 204 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <4445504f5349542035302e3030> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/codes/code93-undo.eps b/client-barcode/doc/codes/code93-undo.eps new file mode 100644 index 0000000..f67e955 --- /dev/null +++ b/client-barcode/doc/codes/code93-undo.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 42 123 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <554e444f> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/freitagskasse.svg b/client-barcode/doc/freitagskasse.svg new file mode 100644 index 0000000..66e3302 --- /dev/null +++ b/client-barcode/doc/freitagskasse.svg @@ -0,0 +1,3011 @@ + + + + + HOWTO Freitagskasse v2 + + + + + + + + + + + + + image/svg+xml + + HOWTO Freitagskasse v2 + + + Sebastian Pipping <sebastian@pipping.org> + + + + + + + + + + + + + + + + + HOWTO Freitagskasse + + + + + Waren kaufen(0) Zum Einloggen deine ID-Karte scannen (1) Ware scannen(2) Code COMMIT scannenGeld einzahlen(0) Zum Einloggen deine ID-Karte scannen(1) Betrag X echtes Geld in die Kasse tun(2) Mittels Aufladecodes rechts Einzahlung nachspielen(3) Code COMMIT scannen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DEPOSIT 0.01 + + + + + 1 Cent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DEPOSIT 0.05 + + + + + 5 Cent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DEPOSIT 0.10 + + + + + 10 Cent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DEPOSIT 0.50 + + + + + 50 Cent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DEPOSIT 1.00 + + + + + 1 Euro + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DEPOSIT 5.00 + + + + + 5 Euro + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DEPOSIT 10.00 + + + + + 10 Euro + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DEPOSIT 50.00 + + + + + 50 Euro + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + COMMIT + + + + + COMMIT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + UNDO + + + + + UNDO + + + + + + + + 1 1 2 3 4 2 3 + diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py new file mode 100644 index 0000000..20381a3 --- /dev/null +++ b/client-barcode/freitagskasse.py @@ -0,0 +1,180 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2011 Sebastian Pipping +# Licensed under GPL v3 or later + +from __future__ import print_function + +import sys +import decimal +import os +import time + + +def clear(): + os.system('clear') + + +CODES = { + 'UNDO':('undo',), + 'COMMIT':('commit',), + + 'DEPOSIT 0.01':('deposit', decimal.Decimal('0.01')), + 'DEPOSIT 0.05':('deposit', decimal.Decimal('0.05')), + 'DEPOSIT 0.10':('deposit', decimal.Decimal('0.10')), + 'DEPOSIT 0.50':('deposit', decimal.Decimal('0.50')), + 'DEPOSIT 1.00':('deposit', decimal.Decimal('1.00')), + 'DEPOSIT 5.00':('deposit', decimal.Decimal('5.00')), + 'DEPOSIT 10.00':('deposit', decimal.Decimal('10.00')), + 'DEPOSIT 50.00':('deposit', decimal.Decimal('50.00')), + + '731453722620':('buy', 'CD Eagle Eye-Cherry - Desireless', decimal.Decimal('8.00')), + # http://www.gearfuse.com/wp-content/uploads/2008/07/mate.png + '4029764001807':('buy', 'Club Mate 0.5l', decimal.Decimal('0.60')), + '4013595054149':('buy', 'Vita Cola 1.0l', decimal.Decimal('0.79')), +} + + +def delay(what, seconds): + for i in xrange(seconds, 0, -1): + if i < seconds: + sys.stdout.write('\r') + sys.stdout.write('%s in %d Sekunden... ' % (what, i)) + sys.stdout.flush() + time.sleep(1) + + +def warn_balance(): + print('Kontostrand im Minus, NICHT cool!') + + +def error_page(message): + clear() + print(message) + print() + delay('Weiter', 3) + + +class Status: + def __init__(self): + self._reset() + + def _reset(self): + self.login_code = None + self.login_name = None + self.balance = None + self.transfers = None + + def dump(self): + if self.logged_in(): + print('Eingeloggt als: %s' % (self.login_name)) + print() + if self.transfers: + print('Geplante Änderungen:') + initial_balance = self.transfers[0][2] + print(('%3s %-40s %c %6.2f Euro') % ('', '', ' ' if initial_balance > 0 else '-', abs(initial_balance))) + for i, (label, difference, balance_backup) in enumerate(self.transfers): + print(('%2d) %-40s %c %6.2f Euro') % (i + 1, label, '+' if difference > 0 else '-', abs(difference))) + print(('%3s %-40s %8s') % ('', '', '=============')) + print(('%3s %-40s %c %6.2f Euro') % ('', '', ' ' if self.balance > 0 else '-', abs(self.balance))) + + if self.balance < 0: + warn_balance() + print() + + print('Committen nicht vergessen!') + else: + print('Kontostand beträgt: %.2f Euro' % (self.balance)) + if self.balance < 0: + print() + warn_balance() + else: + print('Bitte einloggen.') + print() + print('Scanne dazu deine ID-Karte mit dem Barcode-Leser.') + print() + + def logged_in(self): + return self.login_code is not None + + def login(self, code): + assert(not self.logged_in()) + self.login_code = code + self.login_name = 'Sebastian Pipping' ############ + self.balance = decimal.Decimal('0.20') ###################### + self.transfers = list() + + def commit(self): + assert(self.logged_in()) + # TODO save balance + self.transfers = None + + # Show final balance for some time + clear() + self.dump() + delay('Logout', 3) + + # Logout + self._reset() + + def _do_money(self, label, difference): + log_entry = (label, difference, self.balance) + self.transfers.append(log_entry) + self.balance = self.balance + difference + + def buy(self, title, price): + assert(self.logged_in()) + self._do_money(title, -price) + + def deposit(self, amount): + assert(self.logged_in()) + self._do_money('%.2f Euro einzahlen' % amount, amount) + + def undo(self): + assert(self.logged_in()) + if self.transfers: + (label, difference, balance_backup) = self.transfers[-1] + self.transfers.pop() + self.balance = balance_backup + else: + error_page('FEHLER: Nichts da, was ich rückgängig machen könnte.') + + +def print_prompt(): + sys.stdout.write(">>> ") + + +def handle(line, status): + if line == 'exit': + clear() + sys.exit(0) + + if status.logged_in(): + if line in CODES: + call = CODES[line] + method = call[0] + params = call[1:] + getattr(status, method)(*params) + else: + error_page('FEHLER: Aktion oder Ware "%s" nicht bekannt' % line) + else: + status.login(line) + + +def main(): + status = Status() + + while True: + clear() + status.dump() + print_prompt() + l = sys.stdin.readline() + if not l: + break + line = l.rstrip() + handle(line, status) + + +if __name__ == '__main__': + main()