Проблемы с полями принтера этикеток JavaFX и Zebra

У меня возникли проблемы с печатью этикеток на принтере этикеток Zebra с использованием JavaFX.

Если я запрошу нулевые поля или запрошу Printer.MarginType.HARDWARE_MINIMUM, я ожидаю, что поля будут установлены равными нулю (или близкими к нему). Из этого вопроса кажется, что при установке полей аппаратное обеспечение принтера еще учтено:

Если принтер не может поддерживать указанный макет, он изменит возвращенный макет в соответствии с поддерживаемой конфигурацией.

Однако в данном случае это принтер Zebra Label, а драйвер установил нулевые поля, поэтому поддерживаемая конфигурация должна допускать нулевые поля, но, похоже, это не так.

Текст, выводимый функцией printInfo в приведенном ниже коде, показывает следующее для задания печати до и после модификации:

---------------------------------------------
Resolution = 203
ScaleX = 1.0
TranslateX = 0.0
Printer: Printer ZDesigner ZD420-203dpi ZPL
PageLayout: Paper=Paper: Letter size=8.5x11.0 INCH Orient=PORTRAIT leftMargin=54.0 rightMargin=54.0 topMargin=54.0 bottomMargin=54.0
LayoutX = 0.0points  0.0mm
Layout Bounds MinX = 0.0points  0.0mm
BoundsInLocal MinX = 0.0points  0.0mm
BoundsInParent MinX = 0.0points  0.0mm
printable Width = 504.0points  177.8000000112mm
printable Height = 684.0points  241.30000001520003mm
---------------------------------------------
Resolution = 203
ScaleX = 0.28346438836889
TranslateX = -189.13754272460938
Printer: Printer ZDesigner ZD420-203dpi ZPL
PageLayout: Paper=Paper: Custom size=50.0x32.0 MM Orient=PORTRAIT leftMargin=17.75 rightMargin=17.749999999999993 topMargin=11.375 bottomMargin=11.375000000000004
LayoutX = 0.0points  0.0mm
Layout Bounds MinX = 0.0points  0.0mm
BoundsInLocal MinX = 0.0points  0.0mm
BoundsInParent MinX = 2.7526337476047047E-7points  9.710680165772739E-8mm
printable Width = 106.5points  37.5708333357mm
printable Height = 68.25points  24.077083334850002mm

Интересно, что выбор бумаги при запуске задания на печать - это размер Letter. В драйвере принтера нигде не указан размер письма, поэтому я не уверен, откуда он получает эту информацию и почему он не получает от драйвера 50 мм x 32 мм.

После установки полей принтера на ноль, они возвращаются на 17,75 (я предполагаю, что точки) влево и вправо, и распечатка совпадает с этим ... У меня гораздо меньшая область печати для печати, все, что выходит, обрезается.

Настройки принтера выглядят следующим образом: введите здесь описание изображения

Печать из других приложений, например. LibreOffice, я могу печатать прямо до края этикетки... но не в Java... Начал пробовать в Linux, но драйверы принтера могут быть не самыми последними, поэтому перешел на Windows, но все же иметь проблемы.

Код:

PrinterJob job = PrinterJob.createPrinterJob();
if (job != null) {
    if (job.showPrintDialog(window)) {
        printInfo(job, node);

        // Have tried not setting anything...
        val paper = PrintHelper.createPaper("Custom", 50, 32, Units.MM);
        val orientation = PageOrientation.PORTRAIT; // Have tried Landscape
        // val pageLayout = job.getPrinter().createPageLayout(paper, orientation, Printer.MarginType.HARDWARE_MINIMUM);
        val pageLayout = job.getPrinter().createPageLayout(paper, orientation, 0, 0, 0, 0);

        job.getJobSettings().setPageLayout(pageLayout);

        // Units seem to be in points, so scale for 0.1mm
        node.setScaleX(0.28346438836889);
        node.setScaleY(0.28346438836889);

        node.setTranslateX(-node.getBoundsInParent().getMinX());
        node.setTranslateY(-node.getBoundsInParent().getMinY());

        printInfo(job, node);

        boolean printed = job.printPage(node);
        if (printed) {
            job.endJob();
        } else {
            System.out.println("Printing failed");
        }
    }
} else {
    System.out.println("Could not create printer job");
}

Функция информации о печати просто выводит некоторую информацию:

void printInfo(PrinterJob job, Node node) {
    System.out.println("---------------------------------------------");
    val resolution = job.getJobSettings().getPrintResolution().getFeedResolution();
    System.out.println("Resolution = " + resolution);
    System.out.println("ScaleX = " + node.getScaleX());
    System.out.println("TranslateX = " + node.getTranslateX());

    System.out.println("Printer: " + job.getPrinter());
    System.out.println("PageLayout: " + job.getJobSettings().getPageLayout().toString());

    System.out.println("LayoutX = " + pointsAndMm(node.getLayoutX()));
    System.out.println("Layout Bounds MinX = " + pointsAndMm(node.getLayoutBounds().getMinX()));
    System.out.println("BoundsInLocal MinX = " + pointsAndMm(node.getBoundsInLocal().getMinX()));
    System.out.println("BoundsInParent MinX = " + pointsAndMm(node.getBoundsInParent().getMinX()));
    System.out.println("printable Width = " + pointsAndMm(job.getJobSettings().getPageLayout().getPrintableWidth()));
    System.out.println("printable Height = " + pointsAndMm(job.getJobSettings().getPageLayout().getPrintableHeight()));
}

В моем гугле я наткнулся на несколько вопросов/ответов, но они либо для AWT, либо не решают проблему.


person cfnz    schedule 05.07.2021    source источник