PDA

View Full Version : ZPL auf Zebra ausgeben



Seiten : [1] 2

Ottersberg
19-02-20, 13:23
Moin,

aus einem Webservice bekomme ich ein XML mit einem ZPL-Datenstrom in einem XML-Tag. Diesen würde ich gerne auf einem Zebra-Drucker ausgeben. Mir fällt aber nicht ein wie.
Mein Hauptproblem ist, dass der ZPL-Datenstrom etwa 100.000 Zeichen umfasst.

In diesem Post wird z.B. davon gesprochen mit CPY zu arbeiten.
http://newsolutions.de/forum-systemi-as400-i5-iseries/threads/21967-PDF-drucken
Klingt so als wenn das auch mit Zebra funktionieren sollte. Wäre das möglich und wie genau müsste ich das machen?

Fuerchau
19-02-20, 13:40
Extrahiere den ZPL-Code in eine IFS-Datei.
Dies kannst du mit SQL machen.
Die IFS-Datei sollte dann die Codepage 1252 haben, da es sonst zu Verfälschungen der ZPL-Codes kommen kann.
Per CRTPF erstellst du eine Binärdatei:
CRTPF FILE(*CURLIB/MYZPL) RCDLEN(256)
Mittels CPYTOSMTF kopierst du die IFS-Datei nun Binär in die PF.

Nun machst du eine Dateiüberschreibung:
OVRPRTF FILE(QPRINT) DEVTYPE(*USERASCII)

Mittels
CPYF kopierst du die PF nun auf die Datei QPRINT.

Alternativ liest du die XML in ILERPG einfach ein, machst den obigen OVRPRTF und schreibst die Daten in QPRINT.

Ottersberg
19-02-20, 14:28
Hallo Fuerchau,

ich vermute du meinst CPYFRMSTMF? Aber dann werden die Daten doch abgeschnitten? Weil das ist mein Problem mit den 100.000 Zeichen.
Oder darf ich den ZPL-Datenstrom beliebig einen Zeilenumbruch hinzufügen? Dann ist das natürlich kein Problem mehr.

Fuerchau
19-02-20, 15:04
Der kann beliebig umgebrochen werden, da durche den OVR mit USRASCII keine CRLF eingefügt werden.
Der Drucker sollte dann als Remote-Outq mit Hosttransform *CONT132 generiert sein.

Ottersberg
19-02-20, 16:16
Okay dann ist das Problem natürlich weg. Dann kann ich auch die Hinweise verwenden, die ich schon gefunden hatte. Von Zebra gibt es da ja auch ein Dokument: https://www.zebra.com/content/dam/zebra/product-information/en-us/brochures-datasheets/misc/printing-to-ibm-servers-ref-guide-en.pdf

Allerdings funktioniert das noch nicht richtig. Ich habe mir zum Testen jetzt erstmal eine Datei im IFS angelegt und bei 200 Zeichen immer einen Umbruch gemacht. Die Datei hat die CCSID 1252.

Der Drucker ist angelegt mit:
CRTOUTQ OUTQ(xxx) RMTSYS(*INTNETADR) RMTPRTQ('portLF1') AUTOSTRWTR(1) CNNTYPE(*IP) DESTTYPE(*OTHER) MFRTYPMDL(*WSCSTCONT132) WSCST(QSYS/QWPDEFAULT) INTNETADR('xxx') DESTOPT(*NONE) SEPPAGE(*NO) TEXT('Test')

Dann die Daten kopieren:
CRTPF FILE(QTEMP/MYZPL) RCDLEN(200)
CPYFRMSTMF FROMSTMF('/test.txt') TOMBR('/QSYS.LIB/QTEMP.LIB/MYZPL.FILE/MYZPL.MBR') MBROPT(*REPLACE)

Drucken über:
CPYF FROMFILE(QTEMP/MYZPL) TOFILE(QPRINT)

Ich habe den OVR auf zwei Arten probiert:
OVRPRTF FILE(QPRINT) DEVTYPE(*USERASCII) OUTQ(xxx) SAVE(*YES)
Es passiert nichts. Der Spool ist da, aber der Drucker tut nichts.

OVRPRTF FILE(QPRINT) FORMFEED(*CONT) OUTQ(xxx) SAVE(*YES)
Das ist die Variante, die im Dokument von Zebra beschrieben ist.
Es wird ein Etikett gedruckt. Ein paar Texte, Linien und Barcodes passen und anderes wieder gar nicht.
Das liegt dann vermutlich daran, dass die Umbrüche das jetzt kaputt machen.

Fuerchau
19-02-20, 16:51
1. Du darfst keine Umbrüche (CRLF) erzeugen!
2. ZPL hat leider einen Nachteil:
Von Zebra gibt es Drucker in unterschiedlicher DPI (200, 300). Bei der Angabe von Koordinaten zum Drucken müssen diese in der passenden DPI angegeben werden.
Ein 200-DPI-Etikett wird auf einem 300-DPI-Drucker zu klein und umgekehr halt zu groß gedruckt.

Beim CPYFRMSTMF ist RCDDLM(*FIXED) zu verwenden, für Codepage auf jeden Fall *HEX.
Was ggf. auch noch gehen könnte:
OVRDBF FROMFILE(STDOUT) TOFILE(QPRINT)
QSH CMD('type myzplfile')

Ottersberg
19-02-20, 17:18
1. Du darfst keine Umbrüche (CRLF) erzeugen!

Ja das hatte ich schon erwartet.


2. ZPL hat leider einen Nachteil:
Von Zebra gibt es Drucker in unterschiedlicher DPI (200, 300). Bei der Angabe von Koordinaten zum Drucken müssen diese in der passenden DPI angegeben werden.
Ein 200-DPI-Etikett wird auf einem 300-DPI-Drucker zu klein und umgekehr halt zu groß gedruckt.

Ich denke nicht, dass es daran liegt. Über http://labelary.com sieht es wie ein 200 dpi Etikett aus und der Drucker ist auch 200 dpi.
Der Fehler liegt an den Umbrüchen, wenn ich es ohne *USERASCII mache.
Bzw. mit *USERASCII passiert halt gar nichts.


Beim CPYFRMSTMF ist RCDDLM(*FIXED) zu verwenden, für Codepage auf jeden Fall *HEX.

Das verstehe ich nicht. CPYFRMSTMF hat kein RCDDLM. Nur CPYFRMIMPF. Und das hat kein RCDDLM(*FIXED). Und *HEX ist dort auch nirgends erlaubt.


Was ggf. auch noch gehen könnte:
OVRDBF FROMFILE(STDOUT) TOFILE(QPRINT)
QSH CMD('type myzplfile')

Das funktioniert nicht. In dem Spool steht dann nur "test.txt ist test.txt."

Ottersberg
20-02-20, 08:02
Das verstehe ich nicht. CPYFRMSTMF hat kein RCDDLM. Nur CPYFRMIMPF. Und das hat kein RCDDLM(*FIXED).

Okay ich denke du meintest ENDLINFMT(*FIXED).

Einen anderen Fehler habe ich heute Morgen noch festgestellt. Der CPYF kopiert maximal 132 Zeichen. Mit 200 war ich also zu groß. Ich habe meine Testdatei auf 100 Zeichen verkleinert.

Neuer Ablauf:
CRTPF FILE(QTEMP/MYZPL) RCDLEN(100)
CPYFRMSTMF FROMSTMF('/test.txt') TOMBR('/QSYS.LIB/QTEMP.LIB/MYZPL.FILE/MYZPL.MBR') MBROPT(*REPLACE) ENDLINFMT(*FIXED) TABEXPN(*NO)
OVRPRTF FILE(QPRINT) FORMFEED(*CONT) OUTQ(xxx) SAVE(*YES)
CPYF FROMFILE(QTEMP/MYZPL) TOFILE(QPRINT)

Dann bekomme ich ein lesbares Etikett.

Mit
OVRPRTF FILE(QPRINT) DEVTYPE(*USERASCII) OUTQ(xxx) SAVE(*YES)
tut sich aber weiterhin nichts.

Fuerchau
20-02-20, 11:36
Wenn du ein lesbares Etikett bekommst, ist ja gut.
D.h., dass der CPYFRMSTMF eine Codewandlung durchführt, die allerdings wohl unschädlich erscheint.
Der Druckertreiber macht dann die Umwandlung wieder rückgängig.

Was die Breite angeht, so kann man die ggf. im OVRPRTF mit anpassen (bis 378).
Ich kann i.M. nicht sagen, was die QPPRINT (alternativ geht auch QSYSPRT) als Druckbreite eingestellt hat.

Was die Verwirrung mit dem *FIXED angeht, so hatte ich gerade keinen AS/400-Zugriff (ähm IBM i).

Freut mich aber, dass es klappt.

Ottersberg
24-02-20, 09:23
Wenn du ein lesbares Etikett bekommst, ist ja gut.

Ja. Ich habe da jetzt auch nicht weiter mit *USERASCII getestet.
Ich habe dann noch mit SQL und xmltable die automatische Verarbeitung der XML-Daten gemacht um das zu automatisieren.

Danke für die Hilfe.