5

我正在尝试使用 Xamarin 本机 android 从蓝牙打印机(INTERMEC PB51)打印。

我已经根据以下链接编写了代码。

如何在 Android 的蓝牙打印机上打印图像?

我的代码如下。

private static byte[] SELECT_BIT_IMAGE_MODE = { 0x1B, 0x2A, 33, (byte)255, 0 };

制作位图如下。

 Bitmap sigImage = BitmapFactory.DecodeResource(Resources, Resource.Drawable.icn_logo_jpg);

创建蓝牙插座。

  BluetoothSocket socket = null;
            BufferedReader inReader = null;
            BufferedWriter outReader = null;
            string bt_printer = address; //AdminSettings.PrinterMACAddr;
            if (string.IsNullOrEmpty(bt_printer)) bt_printer = "00:13:7B:49:D1:8C";
            BluetoothDevice mmDevice = BluetoothAdapter.DefaultAdapter.GetRemoteDevice(bt_printer);
            UUID applicationUUID = UUID.FromString("00001101-0000-1000-8000-00805F9B34FB");
            socket = mmDevice.CreateRfcommSocketToServiceRecord(applicationUUID);
            socket.Connect();

调用方法

 PrintImage(bitMap, socket);

创建打印它的方法

 public void PrintImage(Bitmap bitmap, BluetoothSocket _socket)
    {
        try
        {
            if (!_socket.IsConnected)
            {
                _socket.Connect();
            }

            MemoryStream stream = new MemoryStream();

            //IMAGE
            byte[] imageData = ImageToByte2(bitmap);
            stream.Write(imageData, 0, imageData.Length);
            stream.Write(SELECT_BIT_IMAGE_MODE, 0, SELECT_BIT_IMAGE_MODE.Length);
            var bytes = stream.ToArray();
            _socket.OutputStream.Write(bytes, 0, bytes.Length);
            // Java.Lang.Thread.Sleep(2000);

            //END IMAGE
            Java.Lang.Thread.Sleep(2000);
        }
        catch (Exception ex)
        {
            throw new Exception("Unable to print. Please re-configure the printer and try again!");
        }
    }


 public static byte[] ImageToByte2(Bitmap bitmap)
    {
        MemoryStream stream = new MemoryStream();
        bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
        byte[] bitmapData = stream.ToArray();
        return bitmapData;
    }

但得到的标志打印如下图。

在此处输入图像描述

4

1 回答 1

1
  1. Intermec PB51 可以设置几种不同的打印机语言;IPL、指纹、直接协议、ZSim、DSim、CSim 和 ESC/P。所以首先你必须知道你正在处理哪种打印机语言。{ 0x1B, 0x2A, 33, (byte)255, 0 } 是 ESC/P 中的命令,因此打印机必须处于 ESC/P 模式。

  2. 看起来您正在将 PNG 图像数据发送到打印机。我只在 ESC/P 模式下使用了 Intermec PB51,在 ESC/P 中,图像必须转换为 1 位图像字节数组(每个打印机“像素”一位)。

于 2020-03-04T17:20:56.220 回答