Search code examples
xamarinprintingbluetoothxamarin.formszebra-printers

Printing Bluetooth Xamarin


I am developing an App in Xamarin PCL type ... manage to search for printers, connect the printer, but when I want to print my variables these are not printed .... (But if you print the voucher that brings by default) I am occupying the SDK Zebra LinkOS_XamarinSDK, I attached my code .... any help for me?

My SelectPrinterView.cs

public SelectPrinterView(UsuariosMovil usuarioMovil)
    {

        Title = "Seleccione una Impresora";           

        printerList = new ObservableCollection<IDiscoveredPrinter>();

        printerLv = new ListView
        {
            ItemsSource = printerList,
            ItemTemplate = new DataTemplate(() =>
            {
                printerLbl = new Label { Text = "No hay Impresoras Seleccionadas" };

                Label addressLbl = new Label();
            addressLbl.SetBinding(Label.TextProperty, "Address");

            Label friendlyLbl = new Label();
            friendlyLbl.SetBinding(Label.TextProperty, "FriendlyName");

            return new ViewCell
            {
                View = new StackLayout
                {
                    Orientation = StackOrientation.Horizontal,
                    Children = { addressLbl, friendlyLbl }
                }
            };
        })
    };
    printerLv.ItemSelected += PrinterLv_ItemSelected;

My Printing Function:

 private void sendZplReceipt(IConnection printerConnection)
        {
            String tmpHeader =
                    /*
                     Some basics of ZPL. Find more information here : http://www.zebra.com

                     ^XA indicates the beginning of a label
                     ^PW sets the width of the label (in dots)
                     ^MNN sets the printer in continuous mode (variable length receipts only make sense with variably sized labels)
                     ^LL sets the length of the label (we calculate this value at the end of the routine)
                     ^LH sets the reference axis for printing. 
                        You will notice we change this positioning of the 'Y' axis (length) as we build up the label. Once the positioning is changed, all new fields drawn on the label are rendered as if '0' is the new home position
                     ^FO sets the origin of the field relative to Label Home ^LH
                     ^A sets font information 
                     ^FD is a field description
                     ^GB is graphic boxes (or lines)
                     ^B sets barcode information
                     ^XZ indicates the end of a label
                     */

                    "^XA" +

                    "^POI^PW400^MNN^LL325^LH0,0" + "\r\n" +

                    "^FO50,50" + "\r\n" + "^A0,N,70,70" + "\r\n" + "^FD Infraccion^FS" + "\r\n" +

                    "^FO50,130" + "\r\n" + "^A0,N,35,35" + "\r\n" + "^FDMunicipal^FS" + "\r\n" +

                    "^FO50,180" + "\r\n" + "^A0,N,25,25" + "\r\n" + "^FDUsuario Movil:^FS" + "\r\n" +

                    "^FO225,180" + "\r\n" + "^A0,N,25,25" + "\r\n" + "^FD" + "" +"^FS" + "\r\n" +

                    "^FO50,220" + "\r\n" + "^A0,N,25,25" + "\r\n" + "^FDFecha:^FS" + "\r\n" +

                    "^FO225,220" + "\r\n" + "^A0,N,25,25" + "\r\n" + "^FD"+ DateTime.Now +"^FS" + "\r\n" +

                    "^FO50,273" + "\r\n" + "^A0,N,30,30" + "\r\n" + "^FDDatos de la Infraccion^FS" + "\r\n" +

                    "^FO280,273" + "\r\n" + "^A0,N,25,25" + "\r\n" + "^FD^FS" + "\r\n" +

                    "^FO50,300" + "\r\n" + "^GB350,5,5,B,0^FS" + "^XZ";

            int headerHeight = 325;

            DateTime date = new DateTime();
            string sdf = "yyyy/MM/dd";
            string dateString = date.ToString(sdf);

            string header = string.Format(tmpHeader, dateString);

            printerConnection.Write(GetBytes(header));

            int heightOfOneLine = 40;

            Double totalPrice = 0;

            Dictionary<string, string> itemsToPrint = createListOfItems();

            foreach (string productName in itemsToPrint.Keys)
            {
                string price;
                itemsToPrint.TryGetValue(productName, out price);

                String lineItem = "^XA^POI^LL40" + "^FO50,10" + "\r\n" + "^A0,N,28,28" + "\r\n" + "^FD{0}^FS" + "\r\n" + "^FO280,10" + "\r\n" + "^A0,N,28,28" + "\r\n" + "^FD${1}^FS" + "^XZ";
                Double tempPrice;
                Double.TryParse(price, out tempPrice);
                totalPrice += tempPrice;
                String oneLineLabel = String.Format(lineItem, productName, price);

                printerConnection.Write(GetBytes(oneLineLabel));

            }

            long totalBodyHeight = (itemsToPrint.Count + 1) * heightOfOneLine;

            long footerStartPosition = headerHeight + totalBodyHeight;

            string tPrice = Convert.ToString(Math.Round((totalPrice), 2));

            String footer = String.Format("^XA^POI^LL600" + "\r\n" +

            "^FO50,1" + "\r\n" + "^GB350,5,5,B,0^FS" + "\r\n" +

            "^FO50,15" + "\r\n" + "^A0,N,40,40" + "\r\n" + "^FD^FS" + "\r\n" +

            "^FO175,15" + "\r\n" + "^A0,N,40,40" + "\r\n" + "^FD$^FS" + "\r\n" +

            "^FO50,130" + "\r\n" + "^A0,N,45,45" + "\r\n" + "^FDFirma Inspector^FS" + "\r\n" +

            "^FO50,190" + "\r\n" + "^GB350,200,2,B^FS" + "\r\n" +

            "^FO50,400" + "\r\n" + "^GB350,5,5,B,0^FS" + "\r\n" +

            "^FO50,420" + "\r\n" + "^A0,N,30,30" + "\r\n" + "^FDwww.AHSEGROUP.com^FS" + "\r\n" +

            "^FO50,470" + "\r\n" + "^B3N,N,45,Y,N" + "\r\n" + "^FD0123456^FS" + "\r\n" + "^XZ", tPrice);

            printerConnection.Write(GetBytes(footer));

        }

        private Dictionary<string, string> createListOfItems()
        {
            String[] names = { "Motivo: ", "Lugar: ", "RUT: ", "Automovil: ", "Modelo: ", "Color: " };
            String[] prices = { "", "", "", "", "", "" };
            Dictionary<string, string> retVal = new Dictionary<string, string>();

            for (int ix = 0; ix < names.Length; ix++)
            {
                retVal.Add(names[ix], prices[ix]);
            }
            return retVal;            
        }

Any idea how to call the parameters to print? .... I have associated 2 models UsuariosMovil and Violations ... anyone can help me?


Solution

  • I copied and pasted your sendZplReceipt(IConnection printerConnection) and createListOfItems() methods and tested to see what actually prints. If you fill in values for your String[] prices array the values get filled in corrected in the receipt. However, the total price is not being added to the receipt. To fix this, I added {0} in

    "^FO175,15" + "\r\n" + "^A0,N,40,40" + "\r\n" + "^FD$^FS" + "\r\n" 
    

    which changed the line to

    "^FO175,15" + "\r\n" + "^A0,N,40,40" + "\r\n" + "^FD${0}^FS" + "\r\n" 
    

    This fixed the issue of the total price not being printed on the receipt.

    String footer = String.Format("^XA^POI^LL600" + "\r\n" +
    
            "^FO50,1" + "\r\n" + "^GB350,5,5,B,0^FS" + "\r\n" +
    
            "^FO50,15" + "\r\n" + "^A0,N,40,40" + "\r\n" + "^FD^FS" + "\r\n" +
    
            "^FO175,15" + "\r\n" + "^A0,N,40,40" + "\r\n" + "^FD${0}^FS" + "\r\n" +
    
            "^FO50,130" + "\r\n" + "^A0,N,45,45" + "\r\n" + "^FDFirma Inspector^FS" + "\r\n" +
    
            "^FO50,190" + "\r\n" + "^GB350,200,2,B^FS" + "\r\n" +
    
            "^FO50,400" + "\r\n" + "^GB350,5,5,B,0^FS" + "\r\n" +
    
            "^FO50,420" + "\r\n" + "^A0,N,30,30" + "\r\n" + "^FDwww.AHSEGROUP.com^FS" + "\r\n" +
    
            "^FO50,470" + "\r\n" + "^B3N,N,45,Y,N" + "\r\n" + "^FD0123456^FS" + "\r\n" + "^XZ", tPrice);