Java POS printer error

23,851

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

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...!!!!

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

Share:
23,851
Audy
Author by

Audy

Updated on April 22, 2020

Comments

  • Audy
    Audy about 4 years

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

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

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

    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

        <!--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"/>
    

    • Joop Eggen
      Joop Eggen almost 10 years
      Tips: String ESC = "\u001b"; c == truecan be c and c == false can be !c (not c).
    • Joop Eggen
      Joop Eggen almost 10 years
      Look at line 54 (do you see that line in the stacktrace of the error?). There is the cause. If that is the line getCoverOpen() then it seems that is not detectable here. Comment the code out.
    • Audy
      Audy almost 10 years
      Yes I get the error when executing line 54. Please help me..!! It says... run: jpos.JposException: Service does not exist in loaded JCL registry
    • Joop Eggen
      Joop Eggen almost 10 years
      Put that info in the question, net everyone reads all small letter comments. with the line. (I cannot help further.)
    • Audy
      Audy over 9 years
      I've solved it my own :) and now it's working fine. Thanks Joop for trying to help me
    • Ann
      Ann almost 9 years
      Hi. I am trying to delevop a javaPOS app myself but i don't find the jar to implement in Eclipse. Can you please tell my where did you find it ?
    • CoolMind
      CoolMind almost 8 years
      @Ann, I found it somewhere at javapos.com/index.html.
  • yuva
    yuva over 9 years
    Help me start with Bixolon SRP-F310 POS Printer. I want to print to the print using JAVA and JPOS. Can you guide me from the beginning. Yah and I use linux, so please guide me with reference to the linux.
  • Jean
    Jean about 9 years
    Dear friend, I have a Vega7000 Series EFT-POS terminal. Do you have any idea how can I develop program for it? What kind of tools and IDEs and Documents am I need? Where can I find this requirements? And does it have JVM? i.e. does it support Java applications or I must use another programming language? Any light on this issue highly appreciated.
  • Sahil
    Sahil over 7 years
    @KostasC - Try looking into {your_jre_install_path}/jre6/lib/ext folder for those jar files.