Les "imprimantes codes barre" ne sont pas des imprimantes classiques. Pour obtenir un résultat de leur part, il faut leur transmettre des instructions dans un langage spécifique. Il s'agit donc dans cet exemple, de transmettre à l'imprimante, un fichier contenant un programme compréhensible par celle-ci. Les Zebra utilisent un langage de balises appelé ZPL. Les instructions se présente sous la forme suivante : ^XXparm0,parm1,parm3 Où XX est le nom de l'instruction, et parmx sont les paramètres. Pour plus de détails sur ce langage, vous trouverez facilement la documentations sur le site de Zebra.

L'unité utilisée pour les coordonnées sur l'étiquette est le pixel. Tout dépend donc de la résolution de l'imprimante, généralement définie en points par pouce (DPI). Ici j'utilise une fonction qui se charge de la conversion de cm à pixel, en utilisant un dpi paramétré à 300.

!----------------------------------------------------------------------!
! Author : Jean-Baptiste Heren                                         !
! Procedure print-zebra-tag                                   !
!----------------------------------------------------------------------!
! Description: Print Tags on a Zebra Printer                           !
!----------------------------------------------------------------------!
begin-procedure print-zebra-tag

  ! Set Filename
  let $filepath = RTRIM($filepath,' ')
  if substr($filepath,length($filepath),1) <> '\'
    let $filepath = $filepath || '\'
  end-if

  let $filename = $barcode_value || '.txt'
  let $filename = $filepath || $filename
    
  ! Open File
  open $filename as 1  for-writing record=1000:vary status=#filestat
  if #filestat <> 0
    SHOW 'Could not Open File ' $filename
  else   
       ! Get Positions in Pixels
       do cm-to-pixels(5  ,#YLABEL)
       do cm-to-pixels(18 ,#XLABEL)
       ! cols
       do cm-to-pixels(0.5,#XCOL0)
       do cm-to-pixels(3  ,#XCOL1)
       do cm-to-pixels(6  ,#XCOL2)
       do cm-to-pixels(12 ,#XCOL3)
       ! Lines
       do cm-to-pixels(1.5,#YGZONE)
       do cm-to-pixels(0.1,#YLINE6)
       do cm-to-pixels(0.3,#YLINE5)
       do cm-to-pixels(1  ,#YLINE4)
       do cm-to-pixels(1.8,#YLINE3)
       do cm-to-pixels(2.6,#YLINE2)
       do cm-to-pixels(3.4,#YLINE1)
       do cm-to-pixels(4.3,#YLINE0)
       
       let $label_format  = '^XA^LRN^FWR^CF0,52,39^LH20,20^PON'
       let $heading       = '^FO'|| TO_CHAR(#YLINE0) ||','|| TO_CHAR(#XCOL0) || '^CF0,52,39^FD' || 'Address : ' || $LOCAL_ADDRESS || ' Tel: '|| $LOCAL_PHONE || ' Fax: ' || $LOCAL_FAX ||'^FS'
       let $line1_1       = '^FO'|| TO_CHAR(#YLINE1) ||','|| TO_CHAR(#XCOL1) || '^CF0,65,52^FD' || 'Ref :' || '^FS'
       let $line1_2       = '^FO'|| TO_CHAR(#YLINE1) ||','|| TO_CHAR(#XCOL2) || '^CF0,65,52^FD' || $inv_item_id || ', Rev ' || $revision || '^FS'
       let $line1_3       = '^FO'|| TO_CHAR(#YLINE1) ||','|| TO_CHAR(#XCOL3) || '^B3,,110,Y^FD' || $inv_item_id || '^FS'
       let $line2_1       = '^FO'|| TO_CHAR(#YLINE2) ||','|| TO_CHAR(#XCOL1) || '^CF0,52,39^FD' || 'Designation :' || '^FS'
       let $line2_2       = '^FO'|| TO_CHAR(#YLINE2) ||','|| TO_CHAR(#XCOL2) || '^CF0,52,39^FD' || $ITEM_DESCR || '^FS'
       let $line3_1       = '^FO'|| TO_CHAR(#YLINE3) ||','|| TO_CHAR(#XCOL1) || '^CF0,52,39^FD' || 'Quantite :' || '^FS'
       let $line3_2       = '^FO'|| TO_CHAR(#YLINE3) ||','|| TO_CHAR(#XCOL2) || '^CF0,52,39^FD' || To_CHAR(#QtyOnTag) || '^FS'
       let $line4_1       = '^FO'|| TO_CHAR(#YLINE4) ||','|| TO_CHAR(#XCOL1) || '^CF0,52,39^FD' || 'N. Lot :' || '^FS'
       let $line4_2       = '^FO'|| TO_CHAR(#YLINE4) ||','|| TO_CHAR(#XCOL2) || '^CF0,52,39^FD' || $barcode_value || '^FS'
       let $line4_3       = '^FO'|| TO_CHAR(#YLINE4) ||','|| TO_CHAR(#XCOL3) || '^B3,,110,Y^FD' || $barcode_value || '^FS'
       let $line5_1       = '^FO'|| TO_CHAR(#YLINE5) ||','|| TO_CHAR(#XCOL1) || '^CF0,52,39^FD' || 'Date :' || '^FS'
       let $line5_2       = '^FO'|| TO_CHAR(#YLINE5) ||','|| TO_CHAR(#XCOL2) || '^CF0,52,39^FD' || $SysDateTime || '^FS'
       ! Graphics
       let $graphic_box   = '^FO0,0^GB' || TO_CHAR(#YLABEL) || ','|| TO_CHAR(#XLABEL) || ',5^FS'
       let $graphic_line  = '^FO0,0^GB0,' || TO_CHAR(#YLABEL) || ',5^FS'
       let $label_end     = '^XZ'
       
       let $LINE = $label_format || $heading || $line1_1  || $line1_2 || $line1_3 || $line2_1 || $line2_2 || $line3_1 || $line3_2 || $line4_1 || $line4_2 || $line4_3 || $line5_1 || $line5_2 || $graphic_box || $graphic_line || $label_end
      ! Write File
      #DEBUG SHOW 'Zebra data : ' $LINE
      write 1 from $LINE
  end-if
  CLOSE 1
end-if
end-procedure

!----------------------------------------------------------------------!
! Author : Jean-Baptiste Heren                                         !
! Procedure To convert cm to pixels using a DPI fixed parameter        !
! Cette procédure convertit des cm en Pixels suivant un dpi paramétré  !
!----------------------------------------------------------------------!
begin-procedure cm-to-pixels(#cm, :#pixels)
! This Could be also a parameter
let #dpi = 300
! Conversion
let #inches = #cm *0.39
! Rounding
let #pixels = round(#dpi * #inches,0) ! Integer divide
end-procedure