JavaFx如何打印文本(仅)收据?

时间:2017-12-20 12:57:23

标签: java javafx printing

我正在构建销售点应用,我想打印收据。 问题是,使用打印机我不能打印任何图形只是纯文本,我在javafx中找到的就是使用Print API打印节点或使用像jasper这样的报告工具图形。

我想要制作的收据如下所示 receipt

感谢您的时间

2 个答案:

答案 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打印服务在这样的打印机上打印,但最好与它直接通信。

基本上,打印文本就足以将其发送到打印机+ \n0x0A)。这些打印机中有2种字体可以设置为有限的样式(双倍高度,双倍宽度,粗体,斜体,下划线......)。他们还支持不同类型的条形码(如果需要,自己计算一个校验和,并自己绘制条形码)。

他们的界面通常为RS232USB(虚拟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毫米宽的纸上)

this is the note received