day@grand.UUCP (Dave Yost) (11/07/88)
Here is a Code39 barcode font. Code39 is a widely-used, standard, extremely reliable and very dense (bits of information per unit of length) form of barcode. It is also known as "3 of 9 code". This is not a real, fully-fleshed-out font, but it works. If someone would like to take it and finish it, great. The following PostScript file contains both the font and some demo code. Send it to your printer and you'll see what it does. Let's see more fonts posted to this group! --dave yost %! %%Creator: Dave Yost, Grand Software, Inc. % 213-650-1089 {uunet,attmail}!grand!dyost or dyost@grand.COM % Permission granted to all to copy, enhance, and use. %%Title: Download font: Code39 %%CreationDate: November 5, 1988 %%Pages: 0 % Code 39 barcode font % A code39 barcode strip must begin and end with asterisk (*WHATEVER*) % The characters printable by this font are: % ( $%*+-./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ) % There is no distinction between upper and lower case; % that is, the font will show (A) and (a) as the same barcode. % The graphic representations of Code39 characters are independent % of each other, so if you want to see how many characters there are, % you can separate them with whitespace. % % Todo: % The font should automatically round its size to an integral % number of device pixels, at least at small sizes % % Thanks to Pat Wood for his UPC barcode font, % which showed how to do a barcode font. % % An excellent book on bar code is "Reading Between the Lines" % published by North American Technology, Inc. +1 603-924-7136 % ISBN 0-911261-00-1 % %%EndComments % FontDirectory /flow known{(flow in place--not loaded\n)print flush stop} % {0 serverdict begin exitserver}ifelse % - or - % 0 serverdict begin exitserver /Code39FontDict 8 dict def /workdict 19 dict def % load up drawing procedures workdict begin /slimwidth 6 def /widewidth 14 def % optimal wide/slim ratio is 2.25 /nslim 6 def % number of slim elements /nwide 3 def % number of wide elements /unit nslim slimwidth mul nwide widewidth mul add def /width nslim 1 add slimwidth mul nwide widewidth mul add def /T true def /F false def /gray 0 def /c39 { dup 0 get { b1 } { b0 } ifelse dup 5 get { s1 } { s0 } ifelse dup 1 get { b1 } { b0 } ifelse dup 6 get { s1 } { s0 } ifelse dup 2 get { b1 } { b0 } ifelse dup 7 get { s1 } { s0 } ifelse dup 3 get { b1 } { b0 } ifelse dup 8 get { s1 } { s0 } ifelse dup 4 get { b1 } { b0 } ifelse pop } bind def /b0 { 0 setgray slimwidth dup dup setlinewidth .5 mul dup 0 moveto unit lineto stroke 0 translate } bind def /b1 { 0 setgray widewidth dup dup setlinewidth .5 mul dup 0 moveto unit lineto stroke 0 translate } bind def /s0 { slimwidth 0 translate } bind def /s1 { widewidth 0 translate } bind def Code39FontDict begin /FontType 3 def /FontMatrix [1 unit div 0 0 1 unit div 0 0] def /FontBBox [0 0 width width] def /Encoding 128 array def /Widths 128 array def % fill the Encoding array with the procs to run for each character 0 1 127 {Encoding exch /.notdef put} for 0 1 127 {Widths exch width put} for Encoding (0) 0 get /C0 put Encoding (1) 0 get /C1 put Encoding (2) 0 get /C2 put Encoding (3) 0 get /C3 put Encoding (4) 0 get /C4 put Encoding (5) 0 get /C5 put Encoding (6) 0 get /C6 put Encoding (7) 0 get /C7 put Encoding (8) 0 get /C8 put Encoding (9) 0 get /C9 put Encoding (A) 0 get /Ca put Encoding (a) 0 get /Ca put Encoding (B) 0 get /Cb put Encoding (b) 0 get /Cb put Encoding (C) 0 get /Cc put Encoding (c) 0 get /Cc put Encoding (D) 0 get /Cd put Encoding (d) 0 get /Cd put Encoding (E) 0 get /Ce put Encoding (e) 0 get /Ce put Encoding (F) 0 get /Cf put Encoding (f) 0 get /Cf put Encoding (G) 0 get /Cg put Encoding (g) 0 get /Cg put Encoding (H) 0 get /Ch put Encoding (h) 0 get /Ch put Encoding (I) 0 get /Ci put Encoding (i) 0 get /Ci put Encoding (J) 0 get /Cj put Encoding (j) 0 get /Cj put Encoding (K) 0 get /Ck put Encoding (k) 0 get /Ck put Encoding (L) 0 get /Cl put Encoding (l) 0 get /Cl put Encoding (M) 0 get /Cm put Encoding (m) 0 get /Cm put Encoding (N) 0 get /Cn put Encoding (n) 0 get /Cn put Encoding (O) 0 get /Co put Encoding (o) 0 get /Co put Encoding (P) 0 get /Cp put Encoding (p) 0 get /Cp put Encoding (Q) 0 get /Cq put Encoding (q) 0 get /Cq put Encoding (R) 0 get /Cr put Encoding (r) 0 get /Cr put Encoding (S) 0 get /Cs put Encoding (s) 0 get /Cs put Encoding (T) 0 get /Ct put Encoding (t) 0 get /Ct put Encoding (U) 0 get /Cu put Encoding (u) 0 get /Cu put Encoding (V) 0 get /Cv put Encoding (v) 0 get /Cv put Encoding (W) 0 get /Cw put Encoding (w) 0 get /Cw put Encoding (X) 0 get /Cx put Encoding (x) 0 get /Cx put Encoding (Y) 0 get /Cy put Encoding (y) 0 get /Cy put Encoding (Z) 0 get /Cz put Encoding (z) 0 get /Cz put Encoding (-) 0 get /Cminus put Encoding (.) 0 get /Cperiod put Encoding ( ) 0 get /Cspace put Encoding ($) 0 get /Cdollar put Encoding (/) 0 get /Cslash put Encoding (+) 0 get /Cplus put Encoding (%) 0 get /Cpercent put Encoding (*) 0 get /Cstar put % define the procs /CharProcs 45 dict def CharProcs /.notdef {} put CharProcs /C0 { [ F F T T F F T F F ] c39 } put CharProcs /C1 { [ T F F F T F T F F ] c39 } put CharProcs /C2 { [ F T F F T F T F F ] c39 } put CharProcs /C3 { [ T T F F F F T F F ] c39 } put CharProcs /C4 { [ F F T F T F T F F ] c39 } put CharProcs /C5 { [ T F T F F F T F F ] c39 } put CharProcs /C6 { [ F T T F F F T F F ] c39 } put CharProcs /C7 { [ F F F T T F T F F ] c39 } put CharProcs /C8 { [ T F F T F F T F F ] c39 } put CharProcs /C9 { [ F T F T F F T F F ] c39 } put CharProcs /Ca { [ T F F F T F F T F ] c39 } put CharProcs /Cb { [ F T F F T F F T F ] c39 } put CharProcs /Cc { [ T T F F F F F T F ] c39 } put CharProcs /Cd { [ F F T F T F F T F ] c39 } put CharProcs /Ce { [ T F T F F F F T F ] c39 } put CharProcs /Cf { [ F T T F F F F T F ] c39 } put CharProcs /Cg { [ F F F T T F F T F ] c39 } put CharProcs /Ch { [ T F F T F F F T F ] c39 } put CharProcs /Ci { [ F T F T F F F T F ] c39 } put CharProcs /Cj { [ F F T T F F F T F ] c39 } put CharProcs /Ck { [ T F F F T F F F T ] c39 } put CharProcs /Cl { [ F T F F T F F F T ] c39 } put CharProcs /Cm { [ T T F F F F F F T ] c39 } put CharProcs /Cn { [ F F T F T F F F T ] c39 } put CharProcs /Co { [ T F T F F F F F T ] c39 } put CharProcs /Cp { [ F T T F F F F F T ] c39 } put CharProcs /Cq { [ F F F T T F F F T ] c39 } put CharProcs /Cr { [ T F F T F F F F T ] c39 } put CharProcs /Cs { [ F T F T F F F F T ] c39 } put CharProcs /Ct { [ F F T T F F F F T ] c39 } put CharProcs /Cu { [ T F F F T T F F F ] c39 } put CharProcs /Cv { [ F T F F T T F F F ] c39 } put CharProcs /Cw { [ T T F F F T F F F ] c39 } put CharProcs /Cx { [ F F T F T T F F F ] c39 } put CharProcs /Cy { [ T F T F F T F F F ] c39 } put CharProcs /Cz { [ F T T F F T F F F ] c39 } put CharProcs /Cminus { [ F F F T T T F F F ] c39 } put CharProcs /Cperiod { [ T F F T F T F F F ] c39 } put CharProcs /Cspace { [ F T F T F T F F F ] c39 } put CharProcs /Cdollar { [ F F F F F T T T F ] c39 } put CharProcs /Cslash { [ F F F F F T T F T ] c39 } put CharProcs /Cplus { [ F F F F F T F T T ] c39 } put CharProcs /Cpercent { [ F F F F F F T T T ] c39 } put CharProcs /Cstar { [ F F T T F T F F F ] c39 } put % BuildChar is called by PS % whenever a character is to be imaged out of Code39 /BuildChar { workdict begin /char exch def /fontdict exch def /charname fontdict /Encoding get char get def /charproc fontdict /CharProcs get charname get def /charwidth fontdict /Widths get char get def charwidth 0 setcharwidth gsave charproc grestore end % workdict } bind def end % Code39FontDict end % workdict % register font in postscript font machinery /Code39 Code39FontDict definefont pop /Code39minsize workdict begin unit % pixels per point: gsave initmatrix 1 0 dtransform pop grestore div end def /DoDemo true def DoDemo { /inch { 72 mul } def /Times-Roman findfont 48 scalefont setfont 1 inch 10 inch moveto (Code 39 Barcode) show % show the smallest printable size % show setting the height separately from the width /Height 48 def /Code39 findfont [ Code39minsize 0 0 Height 0 0 ] makefont setfont 1 inch 9 inch moveto (*ABCDE*) show % show the size that would normally correspond to the height above /Height 48 def /Code39 findfont [ Height 0 0 Height 0 0 ] makefont setfont 1 inch 8 inch moveto (*ABCDE*) show % show what each character looks like /Code39 findfont 24 scalefont setfont /C { show 12 0 rmoveto } def 1 inch 7 inch moveto (*)C (A)C (B)C (C)C (D)C (E)C (*)C showpage } if