Принтер Zebra - вырезать на последней странице

У меня Zebra ZT610, и я хочу напечатать этикетку в формате PDF, содержащую несколько страниц, а затем вырезать ее на последней странице. Я пробовал использовать режим отложенной резки и отправлять команду ~ JK, но я использую самописное приложение Java для вызова печати. Я также попытался добавить строку «$ {^ XB} $» в документ PDF перед каждым разрывом страницы, кроме последнего, и использовал настройку сквозной передачи в драйвере, чтобы запретить команду вырезания, но это, похоже, не работать либо так, как задание печати java отображает такой текст как изображение.

Я пробовал официальный драйвер Zebra, а также использовал драйвер Zebra NiceLabel в надежде, что у них может быть больше опций «Пользовательские команды» в настройках, но пока ничего не обнаружилось.


person Blease    schedule 20.03.2018    source источник


Ответы (2)


После того, как у нас были одни и те же проблемы в течение нескольких недель, и ни поставщик, ни Google, ни собственная служба поддержки Zebra не предложили ПОЛНОЕ рабочее решение, мы разработали следующее ЛЕГКОЕ 5-шаговое решение для этой (по-видимому, довольно распространенной) проблемы / проблемы с резаком Zebra. :

Шаг 1: в настройках установите для параметра Cutter-Mode значение Tear-Off. Это отключит автоматическую обрезку после каждой страницы.

Шаг 2: Перейдите к «Клиент-Команды» в диалоговом окне настроек (разрешает кодирование ZPL).

Шаг 3. Установите в первом раскрывающемся списке значение "DOCUMENT".

Шаг 4. Установите для Start-Section значение "TEXT" и вставьте

 ^XA^MMD^XZ^XA^JUS^XZ

MMD включает режим паузы. Команда JK доступна только в режиме паузы, и многие принтеры Zebra не поддерживают более простую команду CN (Cut-Now). JUS сохраняет настройку в принтере.

Шаг 5. Установите для End-Section значение "ANALYZED TEXT" и вставьте

˜JK˜PS

JK устанавливает команду вырезания в конец документа, PS отключает режим паузы (и, таким образом, сразу начинает печать). Когда все будет выглядеть так, как описано выше, нажмите "APPLY", и ваш принтер Zebra автоматически обрежет каждый документ, который вы ему отправляете. Вы просто отправляете свой PDF-файл, используя суматру или что угодно. Обработка резака теперь выполняется автоматически в соответствии с настройками принтера.

В качестве альтернативы, если вы хотите сделать это программно, используйте вместо этого коды НАЧАЛО и КОНЕЦ в соответствующих позициях кода ZPL. Обратите внимание, что ˜CMDs не может быть отправлено в сочетании с ^CMDs, поэтому нет блока XA ... XZ для сброса каких-либо настроек (в этом случае нет необходимости, поскольку он влияет только на сеанс печати, а PS снова переключает режим паузы на ВЫКЛ) .

person Chris S.    schedule 15.08.2018

У меня была аналогичная проблема, но поскольку сервер печати был CUPS, я не мог использовать драйверы и утилиты Windows (диалоговое окно настроек). В общем, я сделал следующее:

  1. На принтере установите режим Cutter. Это будет обрезано после каждой напечатанной этикетки.
  2. В моем коде Java, благодаря Apache PDFBox lib, откройте PDF-файл и для каждой страницы отобразите его как монохромный BufferedImage, получить из него массив байтов и получить его шестнадцатеричное представление.
  3. Напишите несколько команд ZPL для загрузки шестнадцатеричных данных в виде графических данных и добавьте команду ^XB перед ^XZ, чтобы предотвратить разрез здесь, за исключением последней страницы, чтобы разрез был только в конце документа.
  4. Отправьте сгенерированный код ZPL на принтер. В моем случае я отправляю его как необработанный документ через IPP, используя application/vnd.cups-raw в качестве типа mime, благодаря отличному lib ipp-client-kotlin, но также можно использовать собственный API печати Java с байтами.

Ниже показан фрагмент кода 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, раздел Альтернативная схема сжатия данных для команд ~ DG и ~ DB. В зависимости от содержимого PDF-файла он может резко уменьшить размер данных (в моем случае в 10 раз!).

Обратите внимание, что служба поддержки Zebra предоставляет еще несколько альтернатив для управления резак, но этот сработал сразу.

person teemoo    schedule 19.03.2021