PxPlus User Forum
Main Board => Knowledge Base / Training => Tips and Techniques => Topic started by: PxPlus on June 01, 2018, 04:19:07 PM
-
While most bar codes can be printed using a font, Code 128 bar codes are special in that the data requires a check digit to be added to the output.
A few years ago a program to produce Code 128 was submitted to our mailing list by Chris Kukuchka of Sequoia Group which we have updated and posted below.
! code128 - Outputs graphical bar code symbol code 128 thru *WINPRT*
!
! Originaally created 01/31/2005 by Chris Kukuchka, Sequoia Group, Inc.
! Updated 05/31/2018 by PVX Plus Technologies Ltd.
!
! For unlimited distribution without warranty and free of charge.
!
! CALL "code128", Channel, Text$, xPos, yPos, High, Scale
!
! Where:
!
! Channel = channel to direct output (open *WINPRT*/PDF file)
! Text$ = string to output as barcode
! xPos,yPos = graphical location to place barcode
! High = # of Graphical units high
! Dots = # of Graphical units wide per bar for thin line (Integer)
!
if stk(properties)="" \
then goto Demo ! Simple run of program does a test
!
CODE128:
enter Channel,(Text$),xPos,yPos,High,Scale
!
if len(Text$)=0 or High<1 or Scale<1 \
then exit
!
Bytes$="",ShiftCode$=chr(98)
!
for I=1 to len(Text$)
J=asc(Text$(I,1))
if J<32 \
then Bytes$+=ShiftCode$+chr(J+64) \
else if J<128 \
then Bytes$+=chr(J-32)
next I
!
Margin=Scale*10
BarWidth=(11*len(Bytes$)+35)*Scale
High=max(High,BarWidth*.15)
print (Channel)'pen'(0,1,0),'fill'(1,7),
print (Channel)'rectangle'(xPos-Margin,yPos,xPos+Margin+BarWidth,yPos-High),
print (Channel)'pen'(1,1,0),'fill'(1,0),
CheckDigit=0
for I=1 to len(Bytes$)
CheckDigit+=I*asc(Bytes$(I,1))
next I
CheckDigit=mod(104+CheckDigit,103)
Bytes$=chr(104)+Bytes$+chr(CheckDigit)+chr(106)
!
dim Patterns$[0:255] ! Max is 255 characters
for I=0 to 255
read data Patterns$[I],end=*break
next I
!
for I=1 to len(Bytes$)
ChrPattern$=Patterns$[asc(Bytes$(I,1))]
if ChrPattern$="" \
then continue
!
for J=1 to len(ChrPattern$)
CurBarWide=num(ChrPattern$(J,1))*Scale
if mod(J,2)=1 \
then print (Channel)'rectangle'(xPos,yPos,xPos+CurBarWide,yPos-High),
xPos+=CurBarWide
next J
!
next I
CODE128_DONE:
exit
!
! Code 128 data
!
data "212222" ! Set A: (SPACE ) B: (SPACE ) C: ( 00 )
data "222122" ! Set A: ( ! ) B: ( ! ) C: ( 01 )
data "222221" ! Set A: ( " ) B: ( " ) C: ( 02 )
data "121223" ! Set A: ( # ) B: ( # ) C: ( 03 )
data "121322" ! Set A: ( $ ) B: ( $ ) C: ( 04 )
data "131222" ! Set A: ( % ) B: ( % ) C: ( 05 )
data "122213" ! Set A: ( & ) B: ( & ) C: ( 06 )
data "122312" ! Set A: ( ' ) B: ( ' ) C: ( 07 )
data "132212" ! Set A: ( ( ) B: ( ( ) C: ( 08 )
data "221213" ! Set A: ( ) ) B: ( ) ) C: ( 09 )
data "221312" ! Set A: ( * ) B: ( * ) C: ( 10 )
data "231212" ! Set A: ( + ) B: ( + ) C: ( 11 )
data "112232" ! Set A: ( , ) B: ( , ) C: ( 12 )
data "122132" ! Set A: ( - ) B: ( - ) C: ( 13 )
data "122231" ! Set A: ( . ) B: ( . ) C: ( 14 )
data "113222" ! Set A: ( / ) B: ( / ) C: ( 15 )
data "123122" ! Set A: ( 0 ) B: ( 0 ) C: ( 16 )
data "123221" ! Set A: ( 1 ) B: ( 1 ) C: ( 17 )
data "223211" ! Set A: ( 2 ) B: ( 2 ) C: ( 18 )
data "221132" ! Set A: ( 3 ) B: ( 3 ) C: ( 19 )
data "221231" ! Set A: ( 4 ) B: ( 4 ) C: ( 20 )
data "213212" ! Set A: ( 5 ) B: ( 5 ) C: ( 21 )
data "223112" ! Set A: ( 6 ) B: ( 6 ) C: ( 22 )
data "312131" ! Set A: ( 7 ) B: ( 7 ) C: ( 23 )
data "311222" ! Set A: ( 8 ) B: ( 8 ) C: ( 24 )
data "321122" ! Set A: ( 9 ) B: ( 9 ) C: ( 25 )
data "321221" ! Set A: ( : ) B: ( : ) C: ( 26 )
data "312212" ! Set A: ( ; ) B: ( ; ) C: ( 27 )
data "322112" ! Set A: ( < ) B: ( < ) C: ( 28 )
data "322211" ! Set A: ( = ) B: ( = ) C: ( 29 )
data "212123" ! Set A: ( > ) B: ( > ) C: ( 30 )
data "212321" ! Set A: ( ? ) B: ( ? ) C: ( 31 )
data "232121" ! Set A: ( @ ) B: ( @ ) C: ( 32 )
data "111323" ! Set A: ( A ) B: ( A ) C: ( 33 )
data "131123" ! Set A: ( B ) B: ( B ) C: ( 34 )
data "131321" ! Set A: ( C ) B: ( C ) C: ( 35 )
data "112313" ! Set A: ( D ) B: ( D ) C: ( 36 )
data "132113" ! Set A: ( E ) B: ( E ) C: ( 37 )
data "132311" ! Set A: ( F ) B: ( F ) C: ( 38 )
data "211313" ! Set A: ( G ) B: ( G ) C: ( 39 )
data "231113" ! Set A: ( H ) B: ( H ) C: ( 40 )
data "231311" ! Set A: ( I ) B: ( I ) C: ( 41 )
data "112133" ! Set A: ( J ) B: ( J ) C: ( 42 )
data "112331" ! Set A: ( K ) B: ( K ) C: ( 43 )
data "132131" ! Set A: ( L ) B: ( L ) C: ( 44 )
data "113123" ! Set A: ( M ) B: ( M ) C: ( 45 )
data "113321" ! Set A: ( N ) B: ( N ) C: ( 46 )
data "133121" ! Set A: ( O ) B: ( O ) C: ( 47 )
data "313121" ! Set A: ( P ) B: ( P ) C: ( 48 )
data "211331" ! Set A: ( Q ) B: ( Q ) C: ( 49 )
data "231131" ! Set A: ( R ) B: ( R ) C: ( 50 )
data "213113" ! Set A: ( S ) B: ( S ) C: ( 51 )
data "213311" ! Set A: ( T ) B: ( T ) C: ( 52 )
data "213131" ! Set A: ( U ) B: ( U ) C: ( 53 )
data "311123" ! Set A: ( V ) B: ( V ) C: ( 54 )
data "311321" ! Set A: ( W ) B: ( W ) C: ( 55 )
data "331121" ! Set A: ( X ) B: ( X ) C: ( 56 )
data "312113" ! Set A: ( Y ) B: ( Y ) C: ( 57 )
data "312311" ! Set A: ( Z ) B: ( Z ) C: ( 58 )
data "332111" ! Set A: ( [ ) B: ( [ ) C: ( 59 )
data "314111" ! Set A: ( \ ) B: ( \ ) C: ( 60 )
data "221411" ! Set A: ( ] ) B: ( ] ) C: ( 61 )
data "431111" ! Set A: ( ^ ) B: ( ^ ) C: ( 62 )
data "111224" ! Set A: ( _ ) B: ( _ ) C: ( 63 )
data "111422" ! Set A: ( NUL ) B: ( ' ) C: ( 64 )
data "121124" ! Set A: ( SOH ) B: ( a ) C: ( 65 )
data "121421" ! Set A: ( STX ) B: ( b ) C: ( 66 )
data "141122" ! Set A: ( ETX ) B: ( c ) C: ( 67 )
data "141221" ! Set A: ( EOT ) B: ( d ) C: ( 68 )
data "112214" ! Set A: ( ENQ ) B: ( e ) C: ( 69 )
data "112412" ! Set A: ( ACK ) B: ( f ) C: ( 70 )
data "122114" ! Set A: ( BEL ) B: ( g ) C: ( 61 )
data "122411" ! Set A: ( BS ) B: ( h ) C: ( 72 )
data "142112" ! Set A: ( HT ) B: ( i ) C: ( 73 )
data "142211" ! Set A: ( LF ) B: ( j ) C: ( 74 )
data "241211" ! Set A: ( VT ) B: ( k ) C: ( 75 )
data "221114" ! Set A: ( FF ) B: ( l ) C: ( 76 )
data "413111" ! Set A: ( CR ) B: ( m ) C: ( 77 )
data "241112" ! Set A: ( SO ) B: ( n ) C: ( 78 )
data "134111" ! Set A: ( SI ) B: ( o ) C: ( 79 )
data "111242" ! Set A: ( DLE ) B: ( p ) C: ( 80 )
data "121142" ! Set A: ( DC1 ) B: ( q ) C: ( 81 )
data "121241" ! Set A: ( DC2 ) B: ( r ) C: ( 82 )
data "114212" ! Set A: ( DC3 ) B: ( s ) C: ( 83 )
data "124112" ! Set A: ( DC4 ) B: ( t ) C: ( 84 )
data "124211" ! Set A: ( NAK ) B: ( u ) C: ( 85 )
data "411212" ! Set A: ( SYN ) B: ( v ) C: ( 86 )
data "421112" ! Set A: ( ETB ) B: ( w ) C: ( 87 )
data "421211" ! Set A: ( CAN ) B: ( x ) C: ( 88 )
data "212141" ! Set A: ( EM ) B: ( y ) C: ( 89 )
data "214121" ! Set A: ( SUB ) B: ( z ) C: ( 90 )
data "412121" ! Set A: ( ESC ) B: ( { ) C: ( 91 )
data "111143" ! Set A: ( FS ) B: ( | ) C: ( 92 )
data "111341" ! Set A: ( GS ) B: ( } ) C: ( 93 )
data "131141" ! Set A: ( RS ) B: ( ~ ) C: ( 94 )
data "114113" ! Set A: ( US ) B: ( DEL ) C: ( 95 )
data "114311" ! Set A: (FNC 3 ) B: (FNC 3 ) C: ( 96 )
data "411113" ! Set A: (FNC 2 ) B: (FNC 2 ) C: ( 97 )
data "411311" ! Set A: (SHIFT ) B: (SHIFT ) C: ( 98 )
data "113141" ! Set A: (CODE C) B: (CODE C) C: ( 99 )
data "114131" ! Set A: (CODE B) B: (FNC 4 ) C: (CODE B)
data "311141" ! Set A: (FNC 4 ) B: (CODE A) C: (CODE A)
data "411131" ! Set A: (FNC 1 ) B: (FNC 1 ) C: (FNC 1 )
data "211412" ! START (Code A)
data "211214" ! START (Code B)
data "211232" ! START (Code C)
data "2331112" ! STOP
!
Demo:
open (hfn)"[lcl]*winprt*";
Channel=lfo
!
call pgn+";code128",(Channel),"123456",200,200,50,2
!
close (Channel)
!
end