将图像打印到 Zebra iMZ320

Printing Image to Zebra iMZ320

平台:Windows Mobile 6.5 手持设备

语言:C#

我的问题:系统要求我获取用户的签名,然后将该签名发送到打印机以打印在收据上。我已经成功地捕获了签名的图像并在内存中保存了签名的字节数组,但似乎无法正确打印它。

为了让我开始,我按照 blog here 获取位图的十六进制表示。然而,这只是用十六进制打印出一张很长的收据 签名的表示。在此处编写代码,而不是遵循 link:

    private static string DrawBitmap(Bitmap bmp, int xPosition, int yPosition)
    {
        if (bmp == null)
            throw new ArgumentNullException("bmp");

        StringBuilder DataString = new StringBuilder();
        //Make sure the width is divisible by 8
        int loopWidth = 8 - (bmp.Width % 8);
        if (loopWidth == 8)
            loopWidth = bmp.Width;
        else
            loopWidth += bmp.Width;

        //DataString.Append(string.Format("EG {0} {1} {2} {3} ", xPosition, yPosition));
        DataString.Append(string.Format("EG 64 128 {0} {1} ", xPosition, yPosition));

        for (int y = 0; y < bmp.Height; y++)
        {
            int bit = 128;
            int currentValue = 0;
            for (int x = 0; x < loopWidth; x++)
            {
                int intensity;

                if (x < bmp.Width)
                {
                    Color color = bmp.GetPixel(x, y);
                    intensity = 255 - ((color.R + color.G + color.B) / 3);
                }
                else
                    intensity = 0;

                if (intensity >= 128)
                    currentValue |= bit;
                bit = bit >> 1;
                if (bit == 0)
                {
                    DataString.Append(currentValue.ToString("X2"));
                    bit = 128;
                    currentValue = 0;
                }
            }//x
        }//y
        DataString.Append("\r\n");

        return DataString.ToString();
    }

失败后,我找到了 Zebra 打印机的 CPCL programming guide 并按照第 95 页的示例打印小瓷砖图像。但是,这与签名的作用相同。一旦失败,我发现我需要 运行 命令: ! U1 setvar "device.languages" "zpl" 在执行任何 EG 命令之前;所以我继续这样做,但事情在这里发生了糟糕的转折,最终迫使我完全重置打印机 and/or cleanboot 手持设备,因为它会导致 COM 异常导致 COM6 和打印机崩溃。

我已经用尽了大部分(如果不是全部)我能想到的资源,并且 none 其中的一些已经奏效了。

有没有人有任何其他想法或例子可以帮助我完成这项工作?

谢谢

我找到了另一个 CPCL 程序员指南,它有这个简单的(测试)示例:

! 0 200 200 210 1
EG 2 16 90 45 F0F0F0F0F0F0F0F00F0F0F0F0F0F0F0F
F0F0F0F0F0F0F0F00F0F0F0F0F0F0F0F
FORM
PRINT

这应该打印一个小的棋盘图案。

下一个示例打印 PCX 图形:

PCX Commands
The PCX command gives a user the ability to send “.PCX” graphics formatted images to the printer. The
.PCX image MUST be encoded as a black and white image.
Format:
{command} {x} {y}
{data}
where:
{command}: PCX
{x}: X-coordinate of the top-left corner.
{y}: Y-coordinate of the top-left corner.
{data}: PCX image data.

示例:

! 0 200 200 500 1
PCX 0 30
<binary black and white pcx data stream>
FORM
PRINT

使用文件的示例(以前加载打印机文件系统)

! 0 200 200 500 1
PCX 0 30 !<IMAGE.PCX
FORM
PRINT

如果打印机已经切换到行式打印机模式,命令

! U1 PCX {x coordinate} {y coordinate} !< {filename.pcx}

例如

! U1 PCX 0 30 !< IMAGE.PCX

可用于从文件系统打印单色 PCX。

请记住,.NET 是 UTF-8,因此所有命令和数据在通过 COM 端口发送之前都必须转换为 ASCII。所以做这样的事情:

        Encoding ansi = Encoding.GetEncoding(1252);
        byte[] buf = ansi.GetBytes(DataString);
        System.IO.Ports.SerialPort sp = new System.IO.Ports.SerialPort("COM1:");
        sp.Write(buf, 0, buf.Length);

对于 PCX 数据,只需使用 byte[] 缓冲区的字节流。