2009-08-10 13 views
2

Je dois imprimer et entrelacé 2 sur 5 code à barres (18 chiffres sans checksum) en utilisant GDI +. Je l'ai fait pour le code à barres code 128 en utilisant du code trouvé sur le web. Le lecteur de code à barres ne lit malheureusement pas le code 128, je dois donc recourir aux codes à barres ITF.Comment puis-je imprimer un code à barres itf dans C#

Merci, Ken

+0

Pouvez-vous utiliser des fichiers de police? De PrecisionId il y a un 2 de 5 code à barres pour 95 $ disponible. – Christian13467

Répondre

5
class I2of5 
{ 
    private static string[] patterns = 
    { 
     "NNWWN",//0 
     "WNNNW",//1 
     "NWNNW",//2 
     "WWNNN",//3 
     "NNWNW",//4 
     "WNWNN",//5 
     "NWWNN",//6 
     "NNNWW",//7 
     "WNNWN",//8 
     "NWNWN"//9 
    }; 

    public I2of5() 
    { 

    } 
    public static Image MakeBarcodeImage(string barcodeNumber) 
    { 
     int width = 420; 
     int height = 60; 

     string barcodeString = "NnNn";//start pattern 
     int barcodeLength = barcodeNumber.Length; 
     for(int i =0 ; i < barcodeLength; i++) 
     { 
      int firstNumber = int.Parse(barcodeNumber[i].ToString()); 
      int secondNumber = int.Parse(barcodeNumber[i + 1].ToString()); 

      string firstPattern = patterns[firstNumber].ToUpper(); 
      string secondPattern = patterns[secondNumber].ToLower(); 

      barcodeString += String.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}", firstPattern[0], secondPattern[0], 
       firstPattern[1] , secondPattern[1] , 
       firstPattern[2] , secondPattern[2] , 
       firstPattern[3] , secondPattern[3] , 
       firstPattern[4] , secondPattern[4]); 

      i++; 
     } 
     barcodeString +="WnN";//stop pattern 

     Image barcodeImage = new System.Drawing.Bitmap(width, height); 
     using (Graphics gr = Graphics.FromImage(barcodeImage)) 
     { 

      // set to white so we don't have to fill the spaces with white 
      gr.FillRectangle(Brushes.White, 0, 0, width, height); 

      int cursor = 0; 

      for (int codeidx = 0; codeidx < barcodeString.Length; codeidx++) 
      { 
       char code = barcodeString[codeidx]; 

       int BarWeight = 1; 
       int barwidth = ((code == 'N') || (code == 'n'))?2 * BarWeight: 6 * BarWeight; 

       if((code == 'N') || (code == 'W')) 
       { 
        gr.FillRectangle(System.Drawing.Brushes.Black, cursor, 0, barwidth , height); 
       } 

       // note that we never need to draw the space, since we 
       // initialized the graphics to all white 

       // advance cursor beyond this pair 
       cursor += barwidth; 
      } 



     } 
     return barcodeImage; 
    } 
+1

C'est le troisième morceau de code que j'ai essayé, et ça marche (les autres ne l'ont pas fait). J'ai testé le code à barres avec un vérificateur de qualité et c'était A (sur F) sur tous les comptes (lisibilité, décodabilité, etc.). – Halfgaar

+1

En utilisant ceci, j'ai remarqué qu'il lancerait une exception si la chaîne en cours de codage avait une longueur qui était un nombre impair. Après quelques lectures, il semblerait que l'utilisation d'ITF ne fonctionne qu'avec des longueurs paires, suggérant que vous ajoutiez un 0 pour les valeurs de longueur impaire: http://www.whichbarcode.com/bar25i.htm J'espère que cela aidera quelqu'un. – chrismay