【问题标题】:Print receipt using receipt printer使用收据打印机打印收据
【发布时间】:2015-08-18 11:19:11
【问题描述】:

我正在开发一个销售点应用程序,其中一项功能是在热敏/收据打印机中打印收据。目前我有一台 Datecs DPP-255 打印机。

我不知道从哪里开始我的任务。

我尝试通过互联网搜索,发现存在 JavaPOS/UnifiedPOS,但我找不到足够的文档来帮助我入门。请提供一些启示。

【问题讨论】:

    标签: java printing point-of-sale javapos


    【解决方案1】:

    这是一个用于测试的开源项目,也可以作为如何使用JavaPOS编程的参考(源代码可用):

    • JavaPOS POSTest 2 - 一个用于测试 JavaPOS 设备的 JavaPOS 应用程序(源代码是 here)。

    这里还有一些托管在 GitHub 上的项目(请参阅源代码以了解想法并进行尝试):


    相关链接:


    注意:
    为了使用 JavaPOS(现在是 UnifiedPOS specification 的一部分,请参阅附录 B),您的 Datecs DPP-255 设备的生产商必须提供相关的驱动程序。有提供吗? JavaPOS - 是一个规范,因此必须有相应的实现。

    【讨论】:

    • 我为上面的 POStest 创建了一个项目,以下错误我得到 jpos/res/jpos.properties 文件未找到 jpos/res/jpos.properties 文件未找到线程“main”java.lang 中的异常.NoClassDefFoundError: org/apache/xerces/parsers/DOMParser
    • @YunusEinsteinium 似乎 Apache Xerces 库在类路径上不可用。我已经更新了一个指向 POSTest 项目的链接(第一个链接),初始页面似乎已经过时,所以这个项目的版本 2 是最新的(加上错误修复)。从那里下载,那个 ZIP 文件肯定包含 xerces,jar 文件。
    • 而且 jpos.properties 也不在类路径中。顺便说一句,新的 POSTest 2 项目是基于 Maven 的,因此它具有在 POM 文件中定义的所需依赖项 (Apache Xerces)。二进制文件(即编译后的 POSTest)具有 xerces.jar.
    • 感谢您的更新。我使用了sourceforge项目(更新--2),在构建和下载依赖项时,控制台中显示错误:编译失败javapospostest2-code-9501d6413ba6c19d87b19be2123a9010cb3b0d4f\src\main\java\postest2\POSTest2Controller.java:[424,6]错误: try-with-resources is not supported in -source 1.5 -> [Help 1] 有关错误和可能的解决方案的更多信息,请阅读以下文章: [Help 1] cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
    • 在文件POSTest2Controller.java中,这段代码显示错误 // Clear file and write new path!尝试 (PrintWriter writer = new PrintWriter(f)) { writer.print(""); } 捕捉 (FileNotFoundException e1) { e1.printStackTrace(); } :try 中的红色下划线:-source 1.5 不支持 try-with-resources(使用 -source 7 或更高版本来支持 try-with-resources)
    【解决方案2】:

    所以看起来这台打印机支持一种叫做 ESC/POS 的东西,它就像一个允许您打印和格式化数据的命令集。网上有一些指南,这是我以前用过的:http://www.starmicronics.com/support/mannualfolder/escpos_cm_en.pdf

    请注意,打印机有时在它们支持的 ESC/POS 命令集方面存在细微差别,因此您可能需要进行一些试验和错误。

    就将数据发送到打印机而言,这取决于它的连接类型。对于串行,您应该能够使用 ESC/POS 命令集打开并写入该端口。

    并非您要发送的所有数据都是 ASCII 或 UTF 编码的,其中很多是您需要发送的二进制值。例如,要告诉打印机写一个新行,其十六进制值是0A。因此,在 Java 中,您需要将其指定为 String s = "\u000A"; 等。

    对于 java,您需要从 http://java.sun.com/products/javacomm/ 下载 Java Comm API

    这里有一个教程:http://www.java-samples.com/showtutorial.php?tutorialid=214

    希望这会有所帮助。

    【讨论】:

    • 注意Java Comm的安装真的很痛苦。它包括将 dll 直接复制到 jvm 安装中。另一种方法是使用 plink(from putty),它刚刚作为 java 进程启动并使用 stdio 读/写。
    • 我上次使用 java comm 时也遇到了一些稳定性问题。如果使用 plink,plink 进程可以在发生错误时被杀死并重新启动,然后将所有资源释放回操作系统。
    • "\u000A" 也称为"\n",即换行符。并且 "\u000A" 将不起作用,因为 Java 编译器会将其解释为引号内的文字换行符。见stackoverflow.com/questions/3866187/…
    • @ChristofferHammarström 啊,好吧,对不起,我只在 c# 中做过,所以我刚刚在网上查了一下 :) 感谢您的反馈
    • 只需将字符串指定为"\n" 即可。
    猜你喜欢
    • 2013-07-05
    • 2013-05-01
    • 1970-01-01
    • 2018-05-29
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-20
    相关资源
    最近更新 更多