Невозможно указать правильный размер для печати
Недавно мы приобрели принтер Brother QL-700, и на этом аппарате мы печатаем наклейки.
Бумага, которую мы подавали, представляет собой рулон наклейки шириной 62 мм без ограничения по длине.
Вопрос в том, как я это делаю (я пробовал Book
, PrintRequestAttributeSet
), Я не мог использовать Java, чтобы указать диалоговому окну принтера использовать правильный размер бумаги для принтера. Я не мог сделать это, например, точно 62 мм × 40 мм, как нам было нужно. Он всегда "привязывается" к ближайшей газете так, как ему нравится:
Вот код, о котором идет речь:
PrinterJob job = PrinterJob.getPrinterJob();
PageFormat pf = job.defaultPage();
Paper p = pf.getPaper();
p.setSize(UnitConv.mm2pt(62), UnitConv.mm2pt(40));
p.setImageableArea(0, 0, UnitConv.mm2pt(62), UnitConv.mm2pt(40));
pf.setPaper(p);
pf.setOrientation(PageFormat.LANDSCAPE);
job.setPrintable(this, pf);
if (job.printDialog()) {
try {
job.print();
} catch (Exception PrintException) {
PrintException.printStackTrace();
}
}
Я могу подтвердить, что принтер может печатать любой длины, как нам нравится, как показано на скриншоте ниже (с помощью редактора Brother P-touch). Обратите внимание, что это регулируется, но 36mm
был задан самой программой:
Итак, вопрос:
Как заставить "length
из бумаги, а точнее 40 мм?
Соответствующий: нестандартный размер бумаги для этикеточного принтера (Brother QL 570)
редактировать
Я сделал запрос размера медиа ( код) и вот список медиа, которые он может поддерживать:
17 mm x 54 mm: width = 0.67; height = 2.12
17 mm x 87 mm: width = 0.67; height = 3.42
23 mm x 23 mm: width = 0.9066535; height = 0.9066535
iso-b10: width = 1.2204725; height = 1.7322835
29 mm x 90 mm: width = 1.14; height = 3.5366535
38 mm x 90 mm: width = 1.4966536; height = 3.5366535
39 mm x 48 mm: width = 1.5366535; height = 1.8833464
52 mm x 29 mm: width = 1.1366535; height = 2.0466535
iso-b8: width = 2.440945; height = 3.464567
62 mm x 29 mm: width = 1.1366535; height = 2.44
62 mm x 100 mm: width = 2.44; height = 3.93
12 mm Dia: width = 0.47334644; height = 0.47334644
23 mm x 23 mm: width = 0.9066535; height = 0.9066535
58 mm Dia: width = 2.2933464; height = 2.2933464
12 mm: width = 0.47334644; height = 3.9366536
29 mm: width = 1.14; height = 3.9366536
38 mm: width = 1.4966536; height = 3.9366536
50 mm: width = 1.9666536; height = 3.9366536
54 mm: width = 2.1266534; height = 3.9366536
62 mm x 100 mm: width = 2.44; height = 3.93
12 mm x2: width = 0.82665354; height = 3.9366536
54 mm: width = 2.1266534; height = 3.9366536
38 mm x2: width = 2.8733466; height = 3.9366536
50 mm x2: width = 3.8133464; height = 3.9366536
54 mm x2: width = 3.9366536; height = 4.0933466
62 mm x2: width = 3.9366536; height = 4.76
29 mm: width = 1.14; height = 3.9366536
29 mm x3: width = 3.18; height = 3.9366536
38 mm x3: width = 3.9366536; height = 4.25
50 mm x3: width = 3.9366536; height = 5.66
54 mm x3: width = 3.9366536; height = 6.06
62 mm x3: width = 3.9366536; height = 7.08
38 mm: width = 1.4966536; height = 3.9366536
29 mm x4: width = 3.9366536; height = 4.2
38 mm x4: width = 3.9366536; height = 5.6266537
50 mm x4: width = 3.9366536; height = 7.5066533
54 mm x4: width = 3.9366536; height = 8.026653
62 mm x4: width = 3.9366536; height = 9.4
29 mm x 90 mm: width = 1.14; height = 3.5366535
38 mm x 90 mm: width = 1.4966536; height = 3.5366535
Small Address Label: width = 1.1366535; height = 2.44
17 mm x 54 mm: width = 0.67; height = 2.12
62 mm x 100 mm: width = 2.44; height = 3.93
62 mm x 100 mm: width = 2.44; height = 3.93
17 mm x 87 mm: width = 0.67; height = 3.42
17 mm x 54 mm: width = 0.67; height = 2.12
Binder 3 cm - Spine: width = 1.14; height = 8.226653
Binder 5 cm - Spine: width = 2.44; height = 8.226653
58 mm Dia: width = 2.2933464; height = 2.2933464
12 mm Dia: width = 0.47334644; height = 0.47334644
23 mm x 23 mm: width = 0.9066535; height = 0.9066535
23 mm x 23 mm: width = 0.9066535; height = 0.9066535
62 mm x 184 mm Postage Label: width = 2.44; height = 7.24
Binder 5 cm - Spine: width = 2.44; height = 8.226653
Изменить (апрель 2017 г.)
Просто чтобы обновить статус этого вопроса. В конце концов, я решил это с помощью python и утилиты с открытым исходным кодом brother_ql, чтобы он отправлял задания на порт usb напрямую, даже не используя прошивку, предоставленную братом. Он прекрасно работает и решил мою проблему.
6 ответов
Нет лучшего способа ответить как здесь
тогда также не путайте высоту, длину и ширину, класс бумаги в java принимает ширину и высоту, а не длину
public void setSize(double width, double height) {
mWidth = width;
mHeight = height;
Вы также можете рассмотреть это
/**
* Sets the imageable area of this <code>Paper</code>. The
* imageable area is the area on the page in which printing
* occurs.
* @param x the X coordinate to which to set the
* upper-left corner of the imageable area of this <code>Paper</code>
* @param y the Y coordinate to which to set the
* upper-left corner of the imageable area of this <code>Paper</code>
* @param width the value to which to set the width of the
* imageable area of this <code>Paper</code>
* @param height the value to which to set the height of the
* imageable area of this <code>Paper</code>
*/
public void setImageableArea(double x, double y,
double width, double height) {
mImageableArea = new Rectangle2D.Double(x, y, width,height);
}
это лишь некоторые из методов внутри класса paper, на которые вы, возможно, захотите взглянуть, когда дело доходит до реализации, поэтому параметры... надеюсь, это поможет:)
Использование пользовательского java.awt.print.Paper не будет работать с принтерами этикеток Brother QL.
Я разобрался с решением для QL-720NW, почти такой же модели, только с WiFi и Ethernet. Обратите внимание, что это должно работать на всех принтерах Brother.
Сначала вам нужно добавить пользовательский непрерывный формат ленты с помощью драйверов. В Windows он находится в:
Настройки принтера> вкладка "Дополнительно"> "Непрерывный формат ленты"> "Настройки"
Список нестандартных размеров бумаги
Добавить пользовательскую бумагу
После этого вы должны найти носитель по названию, которое вы выбрали (например, "Пользовательская бумага") и распечатать через API javax.print:
// Lookup printer by name
PrintService[] foundPrinters = PrintServiceLookup.lookupPrintServices(null, new HashAttributeSet(new PrinterName("QL-720NW", null)));
PrintService printer = foundPrinters[0];
// Lookup custom paper by name
MediaSizeName paper = null;
for (Media m : (Media[])printer.getSupportedAttributeValues(Media.class, null, null))
{
if (m instanceof MediaSizeName)
{
MediaSizeName media = ((MediaSizeName)m);
if ("Custom paper".equals(media.toString())) paper = media;
}
}
// Create a new printable object
Printable p = ...; // Create a printable object
Doc doc = new SimpleDoc(p, DocFlavor.SERVICE_FORMATTED.PRINTABLE, null);
// Set custom paper as request attribute
PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
attrs.add(paper);
// Create a new print job and print it
DocPrintJob job = printer.createPrintJob();
try
{
job.print(doc, attrs);
}
catch (PrintException ex)
{
ex.printStackTrace();
}
Я попытался определить пользовательский размер бесконечной бумаги с помощью принтера этикеток Brother QL-800, как описано @MarkoD. Но когда я читаю MediaSize, моя определенная нестандартная бумага не отображается. Если я изменю размер на другие значения, он внезапно появится в списке.
Может быть, Brother использует размер бумаги по умолчанию, если пользовательский размер бумаги близок к размеру бумаги по умолчанию?
Вам может понадобиться использовать PrintRequestAttribute при отправке запроса на печать. Если нестандартный размер печатного носителя не работает, вы можете использовать обнаруженный размер носителя, используя код запроса, и выбрать наиболее подходящий в наборе атрибутов запроса.
@Test
public void testMyPrinteService() {
// select default or specific one here
PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
PrinterJob job = PrinterJob.getPrinterJob();
PageFormat pf = job.defaultPage();
Paper p = pf.getPaper();
p.setSize(UnitConv.mm2pt(62), UnitConv.mm2pt(40));
p.setImageableArea(0, 0, UnitConv.mm2pt(62), UnitConv.mm2pt(40));
pf.setPaper(p);
pf.setOrientation(PageFormat.LANDSCAPE);
Printable myPrintable = null ;//some printable new MyPrintable(1);
PrintRequestAttributeSet printReqAttrs = new HashPrintRequestAttributeSet();
PrintRequestAttribute jobPrinArea = new MediaPrintableArea(0, 0, 64, 40, MediaPrintableArea.MM);
printReqAttrs.add(jobPrinArea);
if (job.printDialog(printReqAttrs)) {
try {
job.setPrintable(myPrintable, pf);
job.setPrintService(printService);
//pass specific attributes to printer
job.print(printReqAttrs);
} catch (Exception PrintException) {
PrintException.printStackTrace();
}
}
}
Надеюсь это поможет.
Я видел много раз Paper
setSize
передаваемые параметры, содержащие размеры в пикселях. Можете ли вы попробовать изменить mm2pt
с mm2px
как это?
PrinterJob job = PrinterJob.getPrinterJob();
PageFormat pf = job.defaultPage();
Paper p = pf.getPaper();
int resolution = 72; // dpi
p.setSize(UnitConv.mm2px(62, resolution), UnitConv.mm2px(40, resolution));
p.setImageableArea(0, 0, UnitConv.mm2px(62, resolution), UnitConv.mm2px(40, resolution));
pf.setPaper(p);
pf.setOrientation(PageFormat.LANDSCAPE);
job.setPrintable(this, pf);
if (job.printDialog()) {
try {
job.print();
} catch (Exception PrintException) {
PrintException.printStackTrace();
}
}
Я нашел решение, которое мне помогло. После вызова printDialog() вы не должны setPrintable() для PrintJob, но setPageable() с Printable, заключенным в объект Book, работает. Первый проверяет переданный PageFormat и выбирает другой.