Я печатаю на некоторых чековых принтерах Epson, внедряя Java Printable и помещая свой код в метод печати. Для рисования текста на принтере я использую Graphics2D.drawString. Я также рисую прямоугольник для принтера, чтобы увидеть, как его сравнивать с размером текста при печати на других принтерах. При печати на чековом принтере текст на бумаге примерно вдвое превышает ширину печати на лазерном принтере или виртуальном принтере XPS Writer. Это проблема с тем, как Java рисует текст в объекте Graphics2D? У меня установлена новейшая версия Java из 6 обновлений 20.
Любые идеи о том, на что стоит обратить внимание, были бы полезны.
Спасибо.
Вот код, который я использую. В этом примере я вижу букву «с» на правом краю прямоугольника при отправке его на устройство записи XPS, и если я печатаю его на своем чековом принтере, 6 находится на правом краю прямоугольника, и вы можете сказать текст гораздо шире, чем должно быть. Прямоугольник кажется правильного размера.
Я попытался изменить размер страницы и поля, но это не помогло решить проблему с текстом. Я получил эти размеры бумаги и поля от того, как Microsoft Word автоматически определяет принтер. Word правильно печатает текст на чековом принтере.
public static void main(String[] args) {
PageFormat format = new PageFormat();
Paper paper = new Paper();
double paperWidth = 3.25;
double paperHeight = 11.69;
double leftMargin = 0.19;
double rightMargin = 0.25;
double topMargin = 0;
double bottomMargin = 0.01;
paper.setSize(paperWidth * 72.0, paperHeight * 72.0);
paper.setImageableArea(leftMargin * 72.0, topMargin * 72.0,
(paperWidth - leftMargin - rightMargin) * 72.0,
(paperHeight - topMargin - bottomMargin) * 72.0);
format.setPaper(paper);
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(OrientationRequested.PORTRAIT);
PrinterJob printerJob = PrinterJob.getPrinterJob();
Printable printable = new ReceiptPrintTest();
format = printerJob.validatePage(format);
printerJob.setPrintable(printable, format);
try {
printerJob.print(aset);
}
catch (Exception e) {
e.printStackTrace();
}
}
public class ReceiptPrintTest implements Printable {
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (pageIndex < 0 || pageIndex >= 1) {
return Printable.NO_SUCH_PAGE;
}
Graphics2D g2d = (Graphics2D) graphics;
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
Font font = new Font("Arial",Font.PLAIN, 14);
g2d.setFont(font);
g2d.drawString("1234567890abcdefg", 50, 70);
g2d.drawRect(50, 0, 100, 50);
return Printable.PAGE_EXISTS;
}