2016-05-18 4 views
1

Plate-forme: Windows Mobile 6.5 HandheldImpression d'images à Zebra iMZ320

Langue: C#

Mon problème: Je me demande de saisir une signature de l'utilisateur, puis envoyer cette signature à une imprimante à imprimer sur un reçu. J'ai réussi à capturer l'image de la signature et j'ai le tableau d'octets de la signature en mémoire, mais je n'arrive pas à l'imprimer correctement. Pour démarrer, j'ai suivi le blog here pour obtenir la représentation hexadécimale de l'image bitmap. Cependant, cela a juste imprimé un reçu très long avec la représentation hexadécimale de la signature. Code ici au lieu de suivre le lien:

private static string DrawBitmap(Bitmap bmp, int xPosition, int yPosition) 
    { 
     if (bmp == null) 
      throw new ArgumentNullException("bmp"); 

     StringBuilder DataString = new StringBuilder(); 
     //Make sure the width is divisible by 8 
     int loopWidth = 8 - (bmp.Width % 8); 
     if (loopWidth == 8) 
      loopWidth = bmp.Width; 
     else 
      loopWidth += bmp.Width; 

     //DataString.Append(string.Format("EG {0} {1} {2} {3} ", xPosition, yPosition)); 
     DataString.Append(string.Format("EG 64 128 {0} {1} ", xPosition, yPosition)); 

     for (int y = 0; y < bmp.Height; y++) 
     { 
      int bit = 128; 
      int currentValue = 0; 
      for (int x = 0; x < loopWidth; x++) 
      { 
       int intensity; 

       if (x < bmp.Width) 
       { 
        Color color = bmp.GetPixel(x, y); 
        intensity = 255 - ((color.R + color.G + color.B)/3); 
       } 
       else 
        intensity = 0; 

       if (intensity >= 128) 
        currentValue |= bit; 
       bit = bit >> 1; 
       if (bit == 0) 
       { 
        DataString.Append(currentValue.ToString("X2")); 
        bit = 128; 
        currentValue = 0; 
       } 
      }//x 
     }//y 
     DataString.Append("\r\n"); 

     return DataString.ToString(); 
    } 

Après cela a échoué, j'ai trouvé le CPCL programming guide pour les imprimantes Zebra et suivi l'exemple à la page 95 pour imprimer la petite image tuile. Cependant, cela a fait la même chose que la signature. Une fois que cela a échoué, j'ai trouvé que j'avais besoin d'exécuter la commande: ! U1 setvar "device.languages" "zpl" avant de faire des commandes EG; donc je suis allé de l'avant et fait ceci mais les choses ont mal tourné ici qui finissent par me forcer à réinitialiser complètement l'imprimante et/ou à nettoyer le handheld car cela provoque une exception COM qui bloque le COM6 et l'imprimante.

J'ai épuisé la plupart sinon toutes les ressources auxquelles je peux penser et aucune d'elles n'a fonctionné.

Est-ce que quelqu'un a d'autres idées ou exemples qui pourraient m'aider à faire fonctionner ça?

Merci

+0

Est-ce que cela fonctionne: http: //mrpmorris.blogspot.fr/2007/08/printing-bitmaps-using-cpcl.html. La plupart du temps, lorsque l'imprimante imprime le code à la place du texte ou de l'image, elle doit être définie sur un autre langage d'imprimante. ET, souvent le transfert est un problème, la plupart des imprimantes ne comprennent que ASCII-7. Ainsi, DataString peut être traduit en un tableau d'octets 7 bits avant d'être envoyé à l'imprimante. – josef

Répondre

1

J'ai trouvé un autre guide de programmeurs CPCL et il a ce simple (test) exemple:

! 0 200 200 210 1 
EG 2 16 90 45 F0F0F0F0F0F0F0F00F0F0F0F0F0F0F0F 
F0F0F0F0F0F0F0F00F0F0F0F0F0F0F0F 
FORM 
PRINT 

Cela devrait imprimer un petit motif de damier.

L'exemple suivant imprime un PCX:

PCX Commands 
The PCX command gives a user the ability to send “.PCX” graphics formatted images to the printer. The 
.PCX image MUST be encoded as a black and white image. 
Format: 
{command} {x} {y} 
{data} 
where: 
{command}: PCX 
{x}: X-coordinate of the top-left corner. 
{y}: Y-coordinate of the top-left corner. 
{data}: PCX image data. 

Exemple:

! 0 200 200 500 1 
PCX 0 30 
<binary black and white pcx data stream> 
FORM 
PRINT 

Exemple avec un fichier (précédemment chargé le système de fichiers imprimantes)

! 0 200 200 500 1 
PCX 0 30 !<IMAGE.PCX 
FORM 
PRINT 

Si l'imprimante a été commuté en mode imprimante ligne, la commande

! U1 PCX {x coordinate} {y coordinate} !< {filename.pcx} 

par exemple

! U1 PCX 0 30 !< IMAGE.PCX 

peut être utilisé pour imprimer PCX monochrome du système de fichiers. Rappelez-vous que .NET est UTF-8 et que toutes les commandes et données doivent être converties en ASCII avant d'envoyer un port COM. Donc, faire quelque chose comme ceci:

 Encoding ansi = Encoding.GetEncoding(1252); 
     byte[] buf = ansi.GetBytes(DataString); 
     System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort("COM1:"); 
     sp.Write(buf, 0, buf.Length); 

pour les données PCX il suffit d'utiliser le flux d'octets pour l'octet tampon [].

+0

J'ai réussi à imprimer le damier et quelques autres images que j'ai essayées. Je discutais avec la personne du projet sur lequel je travaillais et il m'a dit que je devais supporter une imprimante Intermec ainsi que l'imprimante Zebra. . Suis-je capable d'utiliser ces méthodes pour les deux, ou devra-t-il être conditionnel basé sur l'imprimante? – tdonaldson1713

+0

Bien que certaines imprimantes Intermec prennent en charge ZSim (une simulation Zebra CPCL), d'autres ne le font pas. Le mieux serait d'avoir des implémentations séparées basées sur une classe Interface. PS: pourquoi ça marche pour toi maintenant? Quel était le truc? – josef

+0

Eh bien, je l'ai fonctionné en utilisant Zebra Utilities, plutôt que par l'application que j'écris actuellement. Je crois que mon problème dans l'application est que j'essaie de passer du mode d'impression ligne au mode zpl au milieu du tampon d'impression. Donc, je crois que je vais devoir soit basculer entièrement en mode d'impression zpl ou envoyer plusieurs tâches d'impression. Une autre grande partie de mon problème était que j'avais besoin de compresser les bits qui sont passés et mon algorithme pour la compression ne fonctionnait pas correctement avec les paramètres que je passais à la commande EG. J'apprécie votre aide sur ce cas. – tdonaldson1713