我正在构建销售点应用,我想打印收据。 问题是,使用打印机我不能打印任何图形只是纯文本,我在javafx中找到的就是使用Print API打印节点或使用像jasper这样的报告工具图形。
我想要制作的收据如下所示 receipt
感谢您的时间
答案 0 :(得分:2)
我会放弃JavaFX打印包,并使用JPS,特别是DocFlavor.STRING.TEXT_PLAIN味道:
String receiptText = /* ... */;
PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
if (printService != null) {
Doc doc = new SimpleDoc(receiptText, DocFlavor.STRING.TEXT_PLAIN, null);
DocPrintJob printJob = printService.createPrintJob();
printJob.print(doc, null);
}
最好在JavaFX应用程序线程以外的线程中进行打印。
答案 1 :(得分:2)
这是来自ESC/POS
打印机的说明。虽然可以使用OS打印服务在这样的打印机上打印,但最好与它直接通信。
基本上,打印文本就足以将其发送到打印机+ \n
(0x0A
)。这些打印机中有2种字体可以设置为有限的样式(双倍高度,双倍宽度,粗体,斜体,下划线......)。他们还支持不同类型的条形码(如果需要,自己计算一个校验和,并自己绘制条形码)。
他们的界面通常为RS232
或USB
(虚拟RS - V irtual S erial P ort)
您可以使用javax.comm实现在java(fx)应用程序上的此类打印机上进行打印。我个人使用RXTX。打印机的通信协议通常是兼容的(至少在文本打印的主流中),但不能保证。因此,与您熟悉的模型一起工作会很愉快。
这是在我工作的打印机上打印类似于您的笔记的示例。该应用程序通常是java
应用程序,但使用这种javafx
打印方法没有问题。
package posprintdemo;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.OutputStream;
public class POSPrintDemo {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws Exception {
String portName = "/dev/ttyS4";
Integer baudrate = 57600;
Integer timeout = 1000;
SerialPort serialPort = (SerialPort)CommPortIdentifier.getPortIdentifier(portName).open(POSPrintDemo.class.getName(), 1000);
serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
serialPort.enableReceiveTimeout(timeout);
try(OutputStream os = serialPort.getOutputStream()) {
// select double width and height font
os.write(new byte[] {0x1b, 0x21, 0x31});
os.write(" AROMA CAFE\n".getBytes());
os.write(" 1211 Green Street\n".getBytes());
os.write(" New York, NY\n".getBytes());
// select normal font
os.write(new byte[] {0x1b, 0x21, 0x01});
os.write("03-12-2016 1:11PM\n".getBytes());
os.write("TBL 1 HOST ALISON\n".getBytes());
os.write("VISA ######8281\n".getBytes());
os.write("\n".getBytes());
os.write("QTY DESC AMT\n".getBytes());
os.write("----------------------------------------------\n".getBytes());
os.write("1 GINGER CARROT SOUP $6.79\n".getBytes());
os.write("1 HOUSE SALAD $7.69\n".getBytes());
os.write("1 SURF AND RUTF - 1 PERS $48.79\n".getBytes());
os.write("1 WINE - GLASS - FIXE $11.50\n".getBytes());
os.write("1 CHOC CAKE $6.75\n".getBytes());
os.write("\n".getBytes());
// select double width and height font
os.write(new byte[] {0x1b, 0x21, 0x31});
os.write(" AMOUNT $90.52\n".getBytes());
os.write(new byte[] {0x1b, 0x21, 0x01});
os.write("\n".getBytes());
os.write(" SUB-TOTAL $81.52\n".getBytes());
os.write(" TAX $9.00\n".getBytes());
os.write(" BALANCE $90.52\n".getBytes());
os.write("\n".getBytes());
os.write("\n".getBytes());
os.write("\n".getBytes());
// center text
os.write(new byte[] {0x1b, 0x61, 0x31});
// set barcode height to 80px
os.write(new byte[] {0x1d, 0x68, 0x50});
// print CODE39 with text TEST
os.write(new byte[] {0x1d, 0x6b, 0x45, 0x04, 'T', 'E', 'S', 'T'});
os.flush();
}
}
}
这是收到的纸条(印在57毫米宽的纸上)