将PDF文档打印到esc / pos热敏打印机

时间:2019-03-25 09:41:56

标签: xamarin.forms xamarin.android thermal-printer escpos

我们正在使用xamarin.forms开发POS APP,因为我们需要将收据打印到通过LAN连接的esc / pos热敏打印机上。 我们的应用程序具有多语言支持,通过更改代码页可以使用esc / pos命令打印多种语言。 但是它仅适用于某些受支持的语言,而对于其他语言,则其打印垃圾字符(不可读的字符)。

所以我们考虑为收据创建一个pdf文件并打印出来。我们尝试创建pdf,然后转换为位图,然后使用esc pos命令发送到打印机,但没有打印任何内容。

    public BitImage(String filename)
    {
        Java.IO.File file = new Java.IO.File(filename);
        var pdfRenderer = new PdfRenderer(ParcelFileDescriptor.Open(file, ParcelFileMode.ReadOnly));
        PdfRenderer.Page page = pdfRenderer.OpenPage(0);
        Bitmap bmp = Bitmap.CreateBitmap(page.Width, page.Height, Bitmap.Config.Argb8888);
        page.Render(bmp, null, null, PdfRenderMode.ForPrint);
        load(bmp);
    }


private void load(Bitmap bmp)
{
    int w = bmp.Width;
    int h = bmp.Height;

    int bw = (w + 7) / 8;
    if (bw > 255)
        bw = 255;

    int bh = h / 8;
    if (bh > 24)
    {
        bh = 24;
    }

    initData(bw * 8, bh * 8);

    for (int y = 0; y < h; y++)
    {
        for (int x = 0; x < w; x++)
        {
            if (bmp.GetPixel(x, y) == Color.Black)
                setPixel(x, y);
        }
    }
}

private void initData(int w, int h)
{
    width = w;
    height = h;
    pitch = h / 8;
    data = new byte[w * pitch];
}

private void setPixel(int x, int y)
{
    if (x >= width || y >= height)
    {
        return;
    }
    int mask = (0x0080 >> (y % 8));
    data[(x * pitch) + (y / 8)] |= (byte)mask;
}


public void PrintData() 
{
    byte[] CMD_INIT = { 0x1B, 0x40 };
    byte[] CMD_UPLOAD_IMAGE = { 0x1D, 0x2A, 0, 0 };
    byte[] CMD_PRINT_IMAGE = { 0x1D, 0x2F, 0 };
    byte[] CMD_CUT = { 0x1D, 0x56, 0x01 };
    CMD_UPLOAD_IMAGE[2] = (byte)(width / 8);
    CMD_UPLOAD_IMAGE[3] = (byte)(height / 8);

    #region Print Via Lan
    Socket pSocket = new Socket(SocketType.Stream, ProtocolType.IP);
    pSocket.SendTimeout = 1500;
    pSocket.Connect("192.168.15.168", 9100);
    pSocket.Send(CMD_INIT);
    pSocket.Send(CMD_UPLOAD_IMAGE);
    pSocket.Send(data);
    pSocket.Send(CMD_PRINT_IMAGE);
    pSocket.Send(CMD_CUT);
    pSocket.Close();
    #endregion
}

请帮助我,我是否以正确的方式进行操作? 还是有更好的方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以使用SkiaSharp之类的库,以任何语言从数据中制作图像/ PDF,并使用任何打印机正确打印。

我创建了一个示例来演示如何使用C#的ESC \ POS打印机正确打印图像:GitHub code repo