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

JavaFx如何打印文本(仅)收据?,java,javafx,printing,Java,Javafx,Printing,我正在构建一个销售点应用程序,我想打印一张收据。 问题是,我使用的打印机不能打印任何图形,只能打印纯文本,我在javafx中只能找到使用打印API或使用jasper之类的报告工具打印节点,这两种工具都包含图形 我要出示的收据是这样的 感谢您抽出时间我将放弃JavaFX打印包,使用JPS,特别是味道: 最好在JavaFX应用程序线程以外的线程中进行打印。我会放弃JavaFX打印包,使用JPS,特别是: 最好在JavaFX应用程序线程以外的线程中进行打印。这是来自ESC/POS打印机的说明。尽管可

我正在构建一个销售点应用程序,我想打印一张收据。 问题是,我使用的打印机不能打印任何图形,只能打印纯文本,我在javafx中只能找到使用打印API或使用jasper之类的报告工具打印节点,这两种工具都包含图形

我要出示的收据是这样的


感谢您抽出时间

我将放弃JavaFX打印包,使用JPS,特别是味道:


最好在JavaFX应用程序线程以外的线程中进行打印。

我会放弃JavaFX打印包,使用JPS,特别是:


最好在JavaFX应用程序线程以外的线程中进行打印。

这是来自
ESC/POS
打印机的说明。尽管可以使用OS打印服务在这样的打印机上打印,但最好与之直接通信

基本上,打印文本就足以将其发送到打印机+
\n
0x0A
)。这些打印机中有2种字体可以设置为有限的样式(双高、双宽、粗体、斜体、下划线…)。它们还支持不同类型的条形码(如有必要,可自行计算校验和并绘制条形码)

它们的接口通常是RS232或USB(虚拟RS-VirtualSerialport)

您可以使用该实现在java(fx)应用程序上的此类打印机上打印。就我个人而言,我使用。打印机的通信协议通常是兼容的(至少在文本打印的主流中是兼容的),但这并不能保证。所以和你知道的模特一起工作很好

这是一个在我使用的打印机上打印类似于您的便笺的示例。应用程序通常是
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毫米宽的纸上)


这是来自
ESC/POS
打印机的注释。尽管可以使用OS打印服务在这样的打印机上打印,但最好与之直接通信

基本上,打印文本就足以将其发送到打印机+
\n
0x0A
)。这些打印机中有2种字体可以设置为有限的样式(双高、双宽、粗体、斜体、下划线…)。它们还支持不同类型的条形码(如有必要,可自行计算校验和并绘制条形码)

它们的接口通常是RS232或USB(虚拟RS-VirtualSerialport)

您可以使用该实现在java(fx)应用程序上的此类打印机上打印。就我个人而言,我使用。打印机的通信协议通常是兼容的(至少在文本打印的主流中是兼容的),但这并不能保证。所以和你知道的模特一起工作很好

这是一个在我使用的打印机上打印类似于您的便笺的示例。应用程序通常是
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毫米宽的纸上)


为了给您一个很好的答案,如果您还没有浏览一下,可能会对我们有所帮助。如果您能提供一个,它可能也很有用。我猜您可能需要写入一个类似“prn:”的文件,但是请参阅或Hi@Mat我为我要生成的收据添加了一个图像。。。希望这能给你一个清晰的想法作为开始。。。我现在正试图建立一个例子。。。谢谢。像和这样的东西是
Node
s;您可以使用JavaFX打印API打印这些内容。还有很多其他的解决方案。为了给你一个很好的答案,如果你还没有看过,也许可以帮助我们。如果您能提供一个,它可能也很有用。我猜您可能需要写入一个类似“prn:”的文件,但是请参阅或Hi@Mat我为我要生成的收据添加了一个图像。。。希望这能给你一个清晰的想法作为开始。。。我现在正试图建立一个例子。。。谢谢。像和这样的东西是
Node
s;您可以使用JavaFX打印API打印这些内容。还有很多其他的解决方案。我今天找到了这个,试了试。它有点工作,但不完全工作,由于rxtx dll,JVM在论文完全打印完成之前崩溃。该库与最新版本的windows 10有问题,所以最近我使用Hi。我今天找到了这个,试了试。它有点工作,但不完全工作,由于rxtx dll,JVM在论文完全打印完成之前崩溃。该库与最新版本的windows 10有问题,所以我最近使用了