PxPlus User Forum

Twitter Twitter Twitter

Author Topic: Printing Code 128 bar codes  (Read 1695 times)

PxPlus

  • Administrator
  • Diamond Member
  • *****
  • Posts: 1091
    • View Profile
Printing Code 128 bar codes
« 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.

Code: [Select]

 ! 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