zplCore.comzplCore.com

13Drucken

ZplPrinterClient sendet Raw-TCP an Port 9100 und fragt den Status per ~HS ab (ZplPrinterStatus: PaperOut, Paused, HeadOpen, RibbonOut, OverTemperature, UnderTemperature, LabelsRemainingInBatch, FormatsInBuffer).

var printer = new ZplPrinterClient("192.168.1.50")   // Port 9100 (Raw)
{
    Timeout = TimeSpan.FromSeconds(5),
};

ZplPrinterStatus status = await printer.GetStatusAsync();   // ~HS
if (!status.IsReady)
    throw new InvalidOperationException(
        $"Papier leer: {status.PaperOut}, Kopf offen: {status.HeadOpen}, Pause: {status.Paused}");

await printer.SendAsync(zpl);
await printer.SendAsync(label, dpi: 203, copies: 5);

Verbindungen: IPrinterConnection

Alle Transporte implementieren IPrinterConnection (SendAsync(byte[]), QueryAsync); Erweiterungsmethoden senden ZPL-Strings und Labels und fragen per GetStatusAsync() den ~HS-Status ab. PrinterSettings + PrinterConnectionFactory.Create machen den Transport konfigurierbar.

// ein Interface für alle Transportwege
await using IPrinterConnection printer = PrinterConnectionFactory.Create(new PrinterSettings
{
    CommunicationType = CommunicationType.Network,   // Network, Serial, Usb, File, WindowsDriver, Cups, Stream
    Host = "192.168.1.50", Port = 9100,
    Timeout = TimeSpan.FromSeconds(5),
});
ZplPrinterStatus? status = await printer.GetStatusAsync();   // ~HS (null bei reinen Schreib-Transporten)
await printer.SendAsync(zpl);
await printer.SendAsync(label, dpi: 203, copies: 2);

// direkt erzeugt
IPrinterConnection tcp = new TcpPrinterConnection("192.168.1.50");
IPrinterConnection serial = new SerialPrinterConnection("COM3", 9600, Parity.None, 8, StopBits.One, Handshake.XOnXOff);
IPrinterConnection usb = new RawFilePrinterConnection("/dev/usb/lp0");          // oder \\.\USB001, Datei
IPrinterConnection cups = new CupsPrinterConnection("Zebra_ZD421") { JobTitle = "Versand" };
IPrinterConnection mem = new StreamPrinterConnection(new MemoryStream());        // Tests
if (OperatingSystem.IsWindows())
{
    IPrinterConnection spooler = new WindowsSpoolerPrinterConnection("ZDesigner ZD421-203dpi", documentName: "Versand");
}
KlasseCommunicationTypeStatus (~HS)
TcpPrinterConnectionNetwork (Raw, Port 9100)ja
SerialPrinterConnectionSerial (Baud, Parität, Handshake)ja
RawFilePrinterConnectionUsb, File (Gerätepfad oder Datei)nein
WindowsSpoolerPrinterConnectionWindowsDriver (RAW-Druckjob, nur Windows)nein
CupsPrinterConnectionCups (lp -o raw)nein
StreamPrinterConnectionStream (beliebiger Stream, Tests)wenn lesbar

Virtueller Drucker (TCP 9100)

ZplVirtualPrinter lauscht auf dem Raw-Port, rendert eingehende ZPL- und EPL-Jobs (EPL wird erkannt) und speichert jedes Etikett als PNG oder PDF – ideal für Tests von Anwendungen, die sonst an einen Zebra drucken. Statusabfragen werden mit einem bereiten Drucker beantwortet (HostQueryHandler für eigene Antworten). Als Konsolenprogramm: dotnet run --project samples/VirtualPrinter -- --port 9100 --out labels [--pdf] [--any].

await using var printer = new ZplVirtualPrinter(9100, IPAddress.Loopback)
{
    RenderSettings = new ZplRenderSettings { Dpi = 203, OutputFormat = ZplOutputFormat.Png },
    OutputDirectory = "labels",                // jedes Etikett als labels/*.png
};
printer.LabelReceived += (_, e) => Console.WriteLine($"Etikett #{e.Index} → {e.FilePath}");
printer.Start();                               // beantwortet ~HS, ~HI und ~HQ (ES, SN, OD …)

Druckeinstellungen, erweiterter Status, Suche & Trockenlauf

ZplJobSettings erzeugt ^MM (Abreißen, Spenden, Schneiden, RFID …), ^MN (Lücke, Marke, Endlos), ^MT, ^LL/^ML, ^MD, ^PR und die Ausrichtung und fügt sie nach jedem ^XA ein. GetExtendedStatusAsync wertet ~HQES aus (Fehler- und Warnungs-Flags), dazu Seriennummer, Odometer und ~HI. PrinterDiscovery.FindUsbPrintersAsync findet USB-Drucker; mit EnablePrinting = false liefert die Fabrik eine DryRunPrinterConnection, die nur protokolliert. Weitere Transporte: TCP, seriell, USB/Datei, Parallelport, Windows-Spooler, CUPS, Stream.

var settings = new PrinterSettings
{
    Host = "127.0.0.1", Port = 9100,
    EnablePrinting = true,                     // false = Trockenlauf (DryRunPrinterConnection)
    Job = new ZplJobSettings
    {
        PrintMode = PrintMode.Cutter,          // ^MMC
        MediaTracking = MediaTracking.Gap,     // ^MNY
        MediaType = MediaType.DirectThermal,   // ^MTD
        Darkness = 20, PrintSpeed = 4,         // ^MD, ^PR
        Orientation = JobOrientation.Portrait180,
    },
};
await using IPrinterConnection conn = PrinterConnectionFactory.Create(settings);
await conn.SendAsync(settings.Job.Apply(zpl));
ZplExtendedStatus? status = await conn.GetExtendedStatusAsync();      // ~HQES
if (status is { IsReady: false }) Console.WriteLine(status.Errors);

IReadOnlyList<DiscoveredPrinter> usb = await PrinterDiscovery.FindUsbPrintersAsync();

Mehr dazu auf zplCloud.com: Guide: Drucksteuerung (^MD, ^PR, Schneiden, Spiegeln)