У меня возникли проблемы с печатью этикеток на принтере этикеток 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, либо не решают проблему.