Zebra打印机 - 切换到最后一页

时间:2018-03-20 21:17:20

标签: printing zebra-printers zpl

我有一个Zebra ZT610,我想打印一个pdf格式的标签,包含多个页面,然后在最后一页上剪切。我尝试使用延迟剪切模式并发送~JK命令,但我正在使用自编写的java应用程序来执行打印调用。我还尝试在每个分页符之前将字符串“$ {^ XB} $”添加到PDF文档中,除了最后一个分页符,并使用驱动程序中的传递设置来禁止剪切命令但似乎没有当java打印作业将这样的文本呈现为图像时工作。

我已尝试使用官方Zebra驱动程序以及使用NiceLabel zebra驱动程序,希望它们可能在设置中有更多“自定义命令”选项,但尚未发现任何内容。

2 个答案:

答案 0 :(得分:2)

我有类似的担忧,但由于打印服务器是 CUPS,我无法使用 Windows 驱动程序和实用程序(设置对话框)。所以基本上,我做了以下事情:

  1. 在打印机上,设置 Cutter 模式。这将在每个打印的标签后进行切割。
  2. 在我的 Java 代码中,感谢 Apache PDFBox 库,打开 PDF 并为每个页面将其呈现为单色 BufferedImage,从中获取字节数组,并获取其十六进制表示。
  3. 写几条ZPL命令下载hex作为图形数据,并在^XB前面加上^XZ命令,为了防止这里除了最后一页外被剪掉是仅在文档末尾的剪切。
  4. 将生成的 ZPL 代码发送到打印机。就我而言,我通过 IPP 将其作为原始文档发送,使用 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)。