使用Xamarin在蓝牙打印机上打印图片

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);

创建了一个打印it的方法。
 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;
    }

但是要像下面这张图片一样印上logo。

1
我有同样的问题。 - Joy Peter
你好,Rakesh,你解决了这个问题。我也遇到了同样的问题。 - Deepak yogi
1
嗨,我已经从名为Bar Tender的第三方应用程序生成了图像打印代码, 我将此代码保存在解决方案的资源文件夹中作为.prn文件,然后将其发送到打印机,它可以正常工作。 - Rakesh
你好Rakesh,你能给我一些代码吗? - Deepak yogi
嗨,@Rakesh,请问你能再帮我一下吗?我有一个类似的问题,无法打印图片。请指点一下。 - Akash Jha
你好@Rakesh,你解决了这个问题吗?我也遇到了同样的问题。 - undefined
1个回答

1
  1. Intermec PB51可以设置多种不同的打印机语言:IPL、Fingerprint、Direct Protocol、ZSim、DSim、CSim和ESC/P。因此,首先您需要知道您正在处理哪种打印机语言。{0x1B,0x2A,33,(byte)255,0}是ESC/P中的一个命令,因此打印机必须处于ESC/P模式。

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


你能提到四种不同的打印机语言吗? - Ryan Motal
@ryan-motal 很抱歉,这是专有软件,无法分享。但如果你的代码在GitHub上,我会尽力找时间查看它。 - emilsteen
感谢 @emilsteen,您可以在方便的时候访问 https://github.com/motalr/XFBluetoothPrinter/tree/master - Ryan Motal
@ryan-motal 我看了一下这个项目。虽然代码效率极低且相当混乱,我甚至在编译之前就得进行清理,但我没有发现任何明显的错误。但真正的问题必须是它正在使用Shiny.BluetoothLE。Intermec PB51是一个标准的蓝牙设备,而不是蓝牙LE设备,因此Shiny.BluetoothLE永远无法连接到它。在尝试向其打印图形之前,您是否已连接到该设备? - emilsteen
谢谢查看,是的,在发送转换后的字节数组之前,我先连接了它,并通过先打印文本进行了测试。*抱歉有点混乱哈哈 - Ryan Motal
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接