Java POS 打印机错误

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25164525/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 07:28:57  来源:igfitidea点击:

Java POS printer error

javajavapos

提问by Audy

I'm novice to Java, and I'm developing POS application using java.

我是 Java 新手,我正在使用 Java 开发 POS 应用程序。

I bought an Epson POS printer for this project. Printer model is EPSON TM-U220.

我为这个项目买了一台 Epson POS 打印机。打印机型号是EPSON TM-U220.

I've installed JavaPosand, my code snippet as follows. but when running I get this error.

我已经安装了JavaPos,我的代码片段如下。但是在运行时出现此错误。

Appreciate if anyone could help me with this problem.

感谢有人可以帮助我解决这个问题。



run:
jpos.JposException: Service does not exist in loaded JCL registry
StarReceiptTest finished.
    at jpos.loader.simple.SimpleServiceManager.createConnection(SimpleServiceManager.java:179)
    at jpos.loader.JposServiceLoader.findService(JposServiceLoader.java:154)
    at jpos.BaseJposControl.open(BaseJposControl.java:481)
    at StarReceiptTest.main(StarReceiptTest.java:54)
BUILD SUCCESSFUL (total time: 1 second)


import jpos.JposConst;
import jpos.JposException;
import jpos.POSPrinter;
import jpos.POSPrinterConst;

import jpos.util.JposPropertiesConst;

public class StarReceiptTest
{
    public static void main(String[] args){   
        /*
        If you want to place the jpos.xml file elsewhere on your local file system then uncomment the
        following line and specify the full path to jpos.xml.

        If you want to place the jpos.xml file on a webserver for access over the internet then uncomment
        the second System.setProperty line below and specify the full URL to jpos.xml.
        */
        //C:\Users\Udayanga\Documents\NetBeansProjects\Jpos_Sample\src
        //System.setProperty(JposPropertiesConst.JPOS_POPULATOR_FILE_PROP_NAME, "jpos.xml");
        System.setProperty(JposPropertiesConst.JPOS_POPULATOR_FILE_PROP_NAME, "C:\Users\Udayanga\Documents\NetBeansProjects\Jpos_Sample\src\jpos.xml");
        //System.setProperty(JposPropertiesConst.JPOS_POPULATOR_FILE_URL_PROP_NAME, "http://some-where-remote.com/jpos.xml");

        // constants defined for convience sake (could be inlined)
        String ESC    = ((char) 0x1b) + "";
        String LF     = ((char) 0x0a) + "";
        String SPACES = "                                                                      ";

        // instantiate a new jpos.POSPrinter object
        POSPrinter printer = new POSPrinter();
        //ESDPRT001 = Port
        try
        {
            // open the printer object according to the entry names defined in jpos.xml
            //printer.open("startsp");

            //ESDPRT001
            printer.open("TM-U220");

            // claim exclsive usage of the printer object
            printer.claim(1);

            // enable the device for input and output
            printer.setDeviceEnabled(true);

            // set map mode to metric - all dimensions specified in 1/100mm units
            printer.setMapMode(POSPrinterConst.PTR_MM_METRIC);  // unit = 1/100 mm - i.e. 1 cm = 10 mm = 10 * 100 units

            do
            {
                // poll for printer status
                //   a javax.swing based application would be best to both poll for status
                //   AND register for asynchronous StatusUpdateEvent notification
                //   see the JavaPOS specification for details on this

                // check if the cover is open
                if (printer.getCoverOpen() == true)
                {
                    System.out.println("printer.getCoverOpen() == true");

                    // cover open so do not attempt printing
                    break;
                }

                // check if the printer is out of paper
                if (printer.getRecEmpty() == true)
                {
                    System.out.println("printer.getRecEmpty() == true");

                    // the printer is out of paper so do not attempt printing
                    break;
                }

                // being a transaction
                //   transaction mode causes all output to be buffered
                //   once transaction mode is terminated, the buffered data is
                //   outputted to the printer in one shot - increased reliability
                printer.transactionPrint(POSPrinterConst.PTR_S_RECEIPT, POSPrinterConst.PTR_TP_TRANSACTION);

                if (printer.getCapRecBitmap() == true){
                    // print an image file
                    try
                    {
                        printer.printBitmap(POSPrinterConst.PTR_S_RECEIPT, "star.gif", POSPrinterConst.PTR_BM_ASIS, POSPrinterConst.PTR_BM_CENTER);
                    }
                    catch (JposException e)
                    {
                        if (e.getErrorCode () != JposConst.JPOS_E_NOEXIST)
                        {
                            // error other than file not exist - propogate it
                            throw e;
                        }

                        // image file not found - ignore this error & proceed
                    }
                }

                // call printNormal repeatedly to generate out receipt
                //   the following JavaPOS-POSPrinter control code sequences are used here
                //   ESC + "|cA"          -> center alignment
                //   ESC + "|4C"          -> double high double wide character printing
                //   ESC + "|bC"          -> bold character printing
                //   ESC + "|uC"          -> underline character printing
                //   ESC + "|rA"          -> right alignment

                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT, ESC + "|cA" + ESC + "|4C" + ESC + "|bC" + "Star Grocer"     + LF);
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT, ESC + "|cA" + ESC + "|bC" +               "Shizuoka, Japan" + LF);
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT, ESC + "|cA" + ESC + "|bC" +               "054-555-5555"    + LF);

                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT, ESC + "|uC" + "Qnty Unit Tx Description" + SPACES.substring(0, printer.getRecLineChars() - "Qnty Unit Tx Description".length()) + LF);

                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT,               "   1  830    Soba Noodles"        + LF);
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT,               "   1  180    Daikon Radish"       + LF);
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT,               "   1  350    Shouyu Soy Sauce"    + LF);
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT,               "   1   80    Negi Green Onions"   + LF);
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT,               "   1  100    Wasabi Horse Radish" + LF);
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT,               "   2  200 Tx Hashi Chop Sticks"   + LF);
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT, LF);

                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT,               ESC + "|rA" +               "Subtotal:  2160" + LF);
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT,               ESC + "|rA" +               "Tax:         24" + LF);
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT,               ESC + "|rA" + ESC + "|bC" + "Total:     2184" + LF);
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT,               ESC + "|rA" +               "Tender:    2200" + LF);
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT,               ESC + "|rA" + ESC + "|bC" + "Change:      16" + LF);
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT, LF);

                if (printer.getCapRecBarCode() == true)
                {
                    // print a Code 3 of 9 barcode with the data "123456789012" encoded
                    //   the 10 * 100, 60 * 100 parameters below specify the barcode's height and width
                    //   in the metric map mode (1cm tall, 6cm wide)
                    printer.printBarCode(POSPrinterConst.PTR_S_RECEIPT, "123456789012", POSPrinterConst.PTR_BCS_Code39, 10 * 100, 60 * 100, POSPrinterConst.PTR_BC_CENTER, POSPrinterConst.PTR_BC_TEXT_BELOW);
                }

                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT, ESC + "|cA" + ESC + "|4C" + ESC + "|bC" + "Thank you" + LF);

                // the ESC + "|100fP" control code causes the printer to execute a paper cut
                //   after feeding to the cutter position
                printer.printNormal(POSPrinterConst.PTR_S_RECEIPT, ESC + "|100fP");

                // terminate the transaction causing all of the above buffered data to be sent to the printer
                printer.transactionPrint(POSPrinterConst.PTR_S_RECEIPT, POSPrinterConst.PTR_TP_NORMAL);

                // exit our printing loop
            } while (false);
        }
        catch(JposException e)
        {
            // display any errors that come up
            e.printStackTrace();
        }
        finally
        {
            // close the printer object
            try
            {
                printer.close();
            }
            catch (Exception e) {}
        }

        System.out.println("StarReceiptTest finished.");
        System.exit(0);
    }

Here is the jpos.xml file

这是 jpos.xml 文件

    <!--Other non JavaPOS required property (mostly vendor properties and bus specific properties i.e. RS232 )-->
    <prop name="Halftone" type="String" value="0"/>
    <prop name="PhysicalPrinterName" type="String" value="TM-U220"/>
    <prop name="NVRAMControlLevel" type="String" value="1"/>
    <prop name="Stamp" type="String" value="0"/>
    <prop name="OutputCompleteType" type="String" value="2"/>
    <prop name="StatusThreadInterval" type="String" value="100"/>
    <prop name="OutputTimeout" type="String" value="500"/>
    <prop name="PortType" type="String" value="2"/>
    <prop name="OutputBufferSize" type="String" value="65536"/>
    <prop name="UsedNVRAM" type="String" value="0"/>
    <prop name="FirmRecordLog" type="String" value="1"/>
    <prop name="ReceiveTimeout" type="String" value="1000"/>
    <prop name="SlpReverseEject" type="String" value="0"/>
    <prop name="PortName" type="String" value="TM-U220"/>
    <prop name="OfflineRetryIntervalTime" type="String" value="25"/>
    <prop name="DefaultSlpClampTime" type="String" value="0"/>
    <prop name="epson.trace.file" type="String" value="trace.log"/>
    <prop name="AsyncProcessingSize" type="String" value="1"/>
    <prop name="KanjiTwoWaysPrint" type="String" value="0"/>
    <prop name="PulseStep" type="String" value="2"/>
    <prop name="PortInterfaceName" type="String" value="USB"/>
    <prop name="OutPipe" type="String" value="0"/>
    <prop name="U375Compatible" type="String" value="0"/>
    <prop name="PortNameType" type="String" value="0"/>
    <prop name="preCutterFunction" type="String" value="0"/>
    <prop name="epson.tracing" type="String" value="false"/>
    <prop name="epson.trace.max.size" type="String" value="1000"/>
    <prop name="RecPaperSize" type="String" value="76"/>
    <prop name="DeviceDesc" type="String" value="EPSON TM-U220D POSPrinter"/>
    <prop name="PageModeExt" type="String" value="0"/>
    <prop name="SupportStatistics" type="String" value="1"/>
    <prop name="FirmProgressRange" type="String" value="10"/>
    <prop name="OutputErrorOption" type="String" value="0"/>
    <prop name="SupportFirmware" type="String" value="0"/>
    <prop name="InputTimeout" type="String" value="100"/>
    <prop name="AutoPowerOff" type="String" value="0"/>
    <prop name="SlpMoreColumns" type="String" value="0"/>
    <prop name="RecPaperType" type="String" value="0"/>
    <prop name="MemorySwitch" type="String" value="0"/>
    <prop name="ReadThreadInterval" type="String" value="-1"/>
    <prop name="QueuingOfflineTimeout" type="String" value="1000"/>
    <prop name="InitializeThreadTime" type="String" value="1000"/>
    <prop name="TwoColor" type="String" value="1"/>
    <prop name="TwoByteCharacter" type="String" value="0"/>
    <prop name="FirmLogFileSize" type="String" value="1000"/>
    <prop name="Peeler" type="String" value="0"/>
    <prop name="InPipe" type="String" value="1"/>
    <prop name="ConfigurationFile" type="String" value="epson/xml/Setting/TM-U220DSetting.xml"/>
    <prop name="Custom1Color" type="String" value="0xFF0000"/>
    <prop name="preEndorseFunction" type="String" value="0"/>
    <prop name="Upos.Spec_c" type="String" value="false"/>
    <prop name="FirmNotifyAllProgressEvents" type="String" value="0"/>
    <prop name="InitializeResponseTimeout" type="String" value="1000"/>
    <prop name="ReceiveRetryTime" type="String" value="25"/>
    <prop name="PrinterTransmitTimeout" type="String" value="30000"/>
    <prop name="RecMoreColumns" type="String" value="0"/>
    <prop name="UsedInterCharacterSet" type="String" value="0"/>
    <prop name="WriteThreadInterval" type="String" value="-1"/>
    <prop name="preORCBFunction" type="String" value="0"/>
    <prop name="RecNearEndSensor" type="String" value="1"/>
    <prop name="LogObject" type="String" value=""/>
    <prop name="Cutter" type="String" value="0"/>
    <prop name="PhysicalDevice" type="String" value="TM-U220D"/>
    <prop name="UsedPeeler" type="String" value="0"/>
    <prop name="FirmLogFileName" type="String" value="Firmware.log"/>
    <prop name="InputBufferSize" type="String" value="4096"/>
    <prop name="TransmitTimeout" type="String" value="5000"/>
    <prop name="OfflineCount" type="String" value="2"/>
    <prop name="TransmitRetryTime" type="String" value="100"/>
    <prop name="DirectIOEventTimeout" type="String" value="5000"/>

回答by Audy

I've solved it my own :) and now it's working fine. Thanks Joop for trying to help me.

我已经自己解决了 :) 现在它工作正常。感谢 Joop 试图帮助我。

Here is the solution worked for me.

这是对我有用的解决方案。

  1. Setup Printer drivers executing APD_455dE.exe

  2. Setup Epson_JavaPOS_ADK_11317

  3. Generate Jpos.xml Using SetupPOS.exe (Usually located in C:\Program Files\EPSON\JavaPOS\SetupPOS\SetupPOS.exe)

  4. Save Jpos.xml in your src folder

  5. Add following jar files to your project epsonJposService182.jar epsonJposServiceCommon.jar jpos18.jar xercesImpl.jar xml-apis.jar

  6. Specify the Jpos.xml file to your project using following code System.setProperty(JposPropertiesConst.JPOS_POPULATOR_FILE_PROP_NAME, "D:\Test\Jpos_Sample\src\jpos.xml");

  7. Ready to go...!!!!

  1. 设置打印机驱动程序执行 APD_455dE.exe

  2. 设置 Epson_JavaPOS_ADK_11317

  3. 使用 SetupPOS.exe 生成 Jpos.xml(通常位于 C:\Program Files\EPSON\JavaPOS\SetupPOS\SetupPOS.exe)

  4. 将 Jpos.xml 保存在您的 src 文件夹中

  5. 将以下 jar 文件添加到您的项目 epsonJposService182.jar epsonJposServiceCommon.jar jpos18.jar xercesImpl.jar xml-apis.jar

  6. 使用以下代码将 Jpos.xml 文件指定到您的项目 System.setProperty(JposPropertiesConst.JPOS_POPULATOR_FILE_PROP_NAME, "D:\Test\Jpos_Sample\src\jpos.xml");

  7. 准备好出发...!!!!

If any one need further assistance regarding POS printer issues contact me. I'll try my best to help you guys.

如果有人需要有关 POS 打印机问题的进一步帮助,请与我联系。我会尽力帮助你们。