我有一个Zebra ZT610,我想打印一个pdf格式的标签,包含多个页面,然后在最后一页上剪切。我尝试使用延迟剪切模式并发送~JK命令,但我正在使用自编写的java应用程序来执行打印调用。我还尝试在每个分页符之前将字符串“$ {^ XB} $”添加到PDF文档中,除了最后一个分页符,并使用驱动程序中的传递设置来禁止剪切命令但似乎没有当java打印作业将这样的文本呈现为图像时工作。
我已尝试使用官方Zebra驱动程序以及使用NiceLabel zebra驱动程序,希望它们可能在设置中有更多“自定义命令”选项,但尚未发现任何内容。
答案 0 :(得分:2)
我有类似的担忧,但由于打印服务器是 CUPS,我无法使用 Windows 驱动程序和实用程序(设置对话框)。所以基本上,我做了以下事情:
Cutter
模式。这将在每个打印的标签后进行切割。BufferedImage
,从中获取字节数组,并获取其十六进制表示。立>
^XB
前面加上^XZ
命令,为了防止这里除了最后一页外被剪掉是仅在文档末尾的剪切。application/vnd.cups-raw
作为 mime 类型,这要归功于伟大的 lib ipp-client-kotlin,但也可以使用带有字节的 Java 原生打印 API。 下面是一段 Java 代码,用于演示目的:
public void printPdfStream(InputStream pdfStream) throws IOException {
try (PDDocument pdDocument = PDDocument.load(pdfStream)) {
PDFRenderer pdfRenderer = new PDFRenderer(pdDocument);
StringBuilder builder = new StringBuilder();
for (int pageIndex = 0; pageIndex < pdDocument.getNumberOfPages(); pageIndex++) {
boolean isLastPage = pageIndex == pdDocument.getNumberOfPages() - 1;
BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(pageIndex, 300, ImageType.BINARY);
byte[] data = ((DataBufferByte) bufferedImage.getData().getDataBuffer()).getData();
int length = data.length;
// Invert bytes
for (int i = 0; i < length; i++) {
data[i] ^= 0xFF;
}
builder.append("~DGR:label,").append(length).append(",").append(length / bufferedImage.getHeight())
.append(",").append(Hex.getString(data));
builder.append("^XA");
builder.append("^FO0,0");
builder.append("^XGR:label,1,1");
builder.append("^FS");
if (!isLastPage) {
builder.append("^XB");
}
builder.append("^XZ");
}
IppPrinter ippPrinter = new IppPrinter("ipp://printserver/printers/myprinter");
ippPrinter.printJob(new ByteArrayInputStream(builder.toString().getBytes()),
documentFormat("application/vnd.cups-raw"));
}
}
重要提示:可以(并且应该)压缩十六进制数据,如 ZPL 编程指南的 Alternative Data Compression Scheme for ~DG and ~DB Commands 部分所述。根据 PDF 内容,它可能会大大减少数据大小(在我的情况下是 10 倍!)。
请注意,Zebra 的支持提供了 a few more alternatives 以控制切割器,但此方法立即起作用。
答案 1 :(得分:1)
几个星期后,我们遇到了同样的问题,而且供应商,谷歌或Zebra自己的支持都没有提出完整的解决方案,为此,我们针对以下(显然很常见)的Zebra Cutter制定了以下EASY 5步骤解决方案问题/问题:
步骤1: 在设置中将“切纸器模式”设置为“撕纸”。 这将在每个页面之后禁用自动剪切。
步骤2::转到设置对话框中的“客户命令”(允许ZPL编码)。
步骤3:将第一个下拉菜单设置为"DOCUMENT"
。
第4步:将“开始”部分设置为"TEXT"
并粘贴
^XA^MMD^XZ^XA^JUS^XZ
MMD
启用暂停模式。 JK
命令仅在暂停模式下可用,许多Zebra打印机不支持更简单的命令CN
(立即剪切)。
JUS
将设置保存到打印机。
第5步:将结束部分设置为"ANALYZED TEXT"
并粘贴
˜JK˜PS
JK
将剪切命令设置到文档的末尾,PS
禁用暂停模式(因此立即开始打印)。当所有内容都如上所述时,请按"APPLY"
,然后Zebra打印机将在发送给它的每个文档结束后自动剪切。您只需使用sumatra或您喜欢的任何一种来发送PDF。现在,通过打印机设置自动完成切纸器处理。
或者,如果要通过编程方式执行此操作,请改用ZPL代码中相应位置的START和END代码。请注意,˜CMDs
不能与^CMDs
一起发送,这就是为什么没有XA ... XZ块可以重置任何设置的原因(在这种情况下这是不必要的,因为它只会影响打印会话,而{ {1}}将暂停模式重新设为OFF)。