C# : Partage d'un port USB pour imprimante Zebra et impression efficace avec des commandes ZPL

Lors de la mise en place d'un système d'impression dans un environnement d'entrepôt ou de production, il est courent de rencontrer une contrainte matérielle : une seule imprimante à étiquettes Zebra connectée via USB à un poste de travail. D'autres postes ont besoin d'accéder à cette même imprimante pour générer des étiquettes. Le rebranchement physique du câble USB n'est pas une solution viable en milieu professionnel. Le partage standard d'imprimantes via Windows est orienté vers l'impression via le pilote (GDI), ce qui n'est pas adapté à l'envoi direct de commandes raw comme le langage ZPL. Une méthode robuste et répandue consiste à cartographier une imprimante partagée sur un port local LPT. Cela permet à une application d'écrire des commandes directement dans un fichier de port virtuel, contournant ainsi le pilote graphique.

Configuration du partage réseau et mappage du port LPT

La solution repose sur deux étapes de configuration système.

Côté Serveur (Poste connecté à l'imprimante USB)

  1. Assurez-vous que l'imprimante Zebra est correctement installée et reconnue par Windows.
  2. Activez le partage de l'imprimante : dans les propriétés de l'imprimante, accédez à l'onglet "Partage". Cochez l'option pour partager l'imprimante et définissez un nom de partage simple, sans espaces (ex : ZebraPartagee). Notez le nom du poste de travail (disponible via la commande hostname dans une invite de commandes).
  3. Vérifiez que le pare-feu Windows autorise le trafic "Partage de fichiers et d'imprimantes". Dans les paramètres réseau avancés, activez la "Découverte réseau" et le "Partage de fichiers et d'imprimantes".

Côté Client (Poste distant souhaitant imprimer)

  1. Ouvrez une invite de commandes avec les privilèges administrateur.
  2. Exécutez la commande de mappage suivante pour lier l'imprimante partagée à un port LPT local :
net use LPT2: \\NOMDUSERVEUR\ZebraPartagee /persistent:yes

La commande ci-dessus asocie le port local LPT2: à l'imprimante partagée. L'option /persistent:yes garantit que cette association est conservée après un redémarrage du système. Vous pouvez vérifier l'état de la liaison avec la comande net use. Des erreurs courantes incluent un nom de serveur ou de partage incorrect, ou des paramètres de réseau non partagés sur le serveur.

Envoi de commandes ZPL depuis une application C#

Une fois le port LPT mappé, l'envoi de données à l'imprimante se fait par une simple écriture de fichier dans le port. Voici une classe utilitaire adaptée pour cet usage.

using System;
using System.IO;
using System.Text;

public class ServiceImpressionZebra
{
    /// <summary>
    /// Envoie une commande ZPL brute à une imprimante via un port LPT mappé.
    /// </summary>
    /// <param name="nomPortLocal">Le port LPT local mappé, par exemple "LPT2:"</param>
    /// <param name="commandeZpl">La chaîne complète de commande ZPL à envoyer</param>
    public void EnvoyerCommandeImprimante(string nomPortLocal, string commandeZpl)
    {
        if (string.IsNullOrWhiteSpace(nomPortLocal) ||
            !nomPortLocal.StartsWith("LPT", StringComparison.OrdinalIgnoreCase))
        {
            throw new ArgumentException("Le nom du port doit être au format LPTx:.", nameof(nomPortLocal));
        }

        if (commandeZpl == null)
        {
            throw new ArgumentNullException(nameof(commandeZpl));
        }

        // Tente d'ouvrir le port LPT comme un fichier pour y écrire.
        using (var fluxPort = new FileStream(nomPortLocal, FileMode.OpenOrCreate, FileAccess.Write))
        {
            byte[] donneesBytes = Encoding.ASCII.GetBytes(commandeZpl);
            fluxPort.Write(donneesBytes, 0, donneesBytes.Length);
            fluxPort.Flush();
        }
    }

    /// <summary>
    /// Génère un exemple de commande ZPL pour imprimer une étiquette de base.
    /// </summary>
    public string GenererCommandeTest()
    {
        var constructeur = new StringBuilder();
        constructeur.AppendLine("^XA"); // Début de la commande ZPL
        constructeur.AppendLine("^FO50,50"); // Position de l'objet
        constructeur.AppendLine("^ADN,36,20"); // Police et taille
        constructeur.AppendLine("^FDTest Impression Zebra^FS"); // Texte à imprimer
        constructeur.AppendLine("^XZ"); // Fin de la commande ZPL
        return constructeur.ToString();
    }
}

L'utilisation de la classe est straightforward. Le code ci-dessous démontre son intégration.

// Créer une instance du service
var serviceImpression = new ServiceImpressionZebra();

// Définir le port local mappé
string portCible = "LPT2:";

// Obtenir ou construire la commande ZPL
string commande = serviceImpression.GenererCommandeTest();

try
{
    // Envoyer la commande à l'imprimante
    serviceImpression.EnvoyerCommandeImprimante(portCible, commande);
    Console.WriteLine("La commande ZPL a été envoyée au port avec succès.");
}
catch (Exception ex)
{
    Console.WriteLine($"Échec de l'envoi : {ex.Message}");
}

Cette approche offre un contrôle total sur le flux de données envoyé à l'imprimante. L'écriture dans le port LPT est gérée par le système d'exploitation, qui redirige le trafic vers l'imprimante partagée sur le réseau. Pour des environnements plus complexes nécessitant une gestion de la file d'attente ou du multi-imprimante, des bibliothèques tierces ou l'utilisation directe de port TCP/IP sur des modèles Zebra réseau pourraient être envisagées.

Étiquettes: Zebra ZPL Raw Printing USB Network Sharing

Publié le 9 juin à 21h27