Java Printableを実装し、コードをprintメソッドに配置することで、一部のEpsonレシートプリンターに印刷しています。プリンターにテキストを描画するには、Graphics2D.drawStringを使用します。また、他のプリンターに印刷するときにテキストサイズと比較する方法を確認するために、プリンターに長方形を描画しています。レセプションプリンターに印刷する場合、用紙のテキストは、レーザープリンターまたはXPSライター仮想印刷に印刷する場合の約2倍の幅になります。これは、JavaがGraphics2Dオブジェクトにテキストを描画する方法に問題がありますか?6update20の最新バージョンのJavaをインストールしています。
何を調べるべきかについてのアイデアは役に立ちます。
ありがとう。
ここで私が使用しているコード。この例では、XPSライターに送信するときに、rectの右端に文字「c」が表示されます。レシートプリンターに印刷すると、6はrectの右端にあり、テキストを確認できます。本来よりもはるかに広いです。rectは正しいサイズのようです。
ページと余白のサイズを変更しようとしましたが、テキストの問題が解決しないようです。これらの用紙サイズと余白は、MicrosoftWordがプリンターを自動検出する方法から得られました。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;
}