Java 使用ESC/POS打印位图整页宽度

Java 使用ESC/POS打印位图整页宽度,java,printing,bitmap,xamarin.android,escpos,Java,Printing,Bitmap,Xamarin.android,Escpos,我目前正在实施Android PrintService,它能够通过热敏打印机打印PDF。我设法用PDFRenderer将PDF转换成位图,甚至可以打印文档 问题是,文档(位图)不是全页宽度 我收到的文件分辨率为297x420,我使用的是58毫米纸张的打印机 这就是我处理文档的方式(用C#编写,使用Xamarin): 然后,将位图转换为ESC/POS: // Initialize result List<byte> result = new List<byte>(); /

我目前正在实施Android PrintService,它能够通过热敏打印机打印PDF。我设法用PDFRenderer将PDF转换成位图,甚至可以打印文档

问题是,文档(位图)不是全页宽度

我收到的文件分辨率为297x420,我使用的是58毫米纸张的打印机

这就是我处理文档的方式(用C#编写,使用Xamarin):

然后,将位图转换为ESC/POS:

// Initialize result
List<byte> result = new List<byte>();

// Init ESC/POS
result.AddRange(new byte[] { 0x1B, 0x33, 0x21 });

// Init ESC/POS bmp commands (will be reapeated)
byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x01, (byte)(bitmap.Width % 256), (byte)(bitmap.Height / 256) };

// Iterate height
for (int i = 0; i < (bitmap.Height / 24 + 1); i++)
{
    // Add bitmapp commands to result
    result.AddRange(escBmp);

    // Init pixel color
    int pixelColor;

    // Iterate width
    for (int j = 0; j < bitmap.Width; j++)
    {
        // Init data
        byte[] data = new byte[] { 0x00, 0x00, 0x00 };

        for (int k = 0; k < 24; k++)
        {
            if (((i * 24) + k) < bitmap.Height)
            {
                // Get pixel color
                pixelColor = bitmap.GetPixel(j, (i * 24) + k);

                // Check pixel color
                if (pixelColor != 0)
                {
                    data[k / 8] += (byte)(128 >> (k % 8));
                }
            }
        }

        // Add data to result
        result.AddRange(data);
    }

    // Add some... other stuff
    result.AddRange(new byte[] { 0x0D, 0x0A });
}

// Return data
return result.ToArray();
//初始化结果
列表结果=新列表();
//初始ESC/POS
AddRange(新字节[]{0x1B,0x33,0x21});
//初始化ESC/POS bmp命令(将重新重复)
字节[]escBmp=新字节[]{0x1B,0x2A,0x01,(字节)(bitmap.Width%256),(字节)(bitmap.Height/256)};
//迭代高度
对于(int i=0;i<(bitmap.Height/24+1);i++)
{
//将bitmapp命令添加到结果
结果:添加范围(escBmp);
//初始像素颜色
int像素颜色;
//迭代宽度
对于(int j=0;j>(k%8));
}
}
}
//将数据添加到结果中
结果.添加范围(数据);
}
//添加一些…其他东西
AddRange(新字节[]{0x0D,0x0A});
}
//返回数据
返回result.ToArray();
当前结果如下所示:

提前感谢大家。

ESC/POS命令集中没有神奇的“缩放到页面宽度”命令,您需要知道手册中提供的打印机最大宽度,然后您可以:

  • 将某些图像输出命令的宽度和高度增加一倍——您使用的是
    ESC*
    ,它支持低密度,但高度和宽度的变化比率不同
  • 开始时将PDF呈现得更宽-将位图大小与打印机页面宽度匹配,而不是与PDF页面宽度匹配。同样的问题也在第二阶段得到了解决
  • 如果您对低质量感到满意,您也可以在发送图像之前简单地拉伸图像。见:
另外,您的
ESC*
实现不正确。宽度有两个字节-检查ESC/POS手册的正确用法,或者阅读我在另一个问题中链接的PHP或Python的正确实现:

ESC/POS命令集中没有神奇的“缩放到页面宽度”命令,您需要知道手册中提供的打印机的最大宽度,然后你可以:

  • 将某些图像输出命令的宽度和高度增加一倍——您使用的是
    ESC*
    ,它支持低密度,但高度和宽度的变化比率不同
  • 开始时将PDF呈现得更宽-将位图大小与打印机页面宽度匹配,而不是与PDF页面宽度匹配。同样的问题也在第二阶段得到了解决
  • 如果您对低质量感到满意,您也可以在发送图像之前简单地拉伸图像。见:

另外,您的
ESC*
实现不正确。宽度有两个字节-检查ESC/POS手册的正确用法,或者阅读我在另一个问题中链接的PHP或Python的正确实现:

您想要整页打印吗?是的,对不起。修正了标题和一些文字。你想要整页打印吗?是的,对不起。修复了标题和一些文字。缩放成功,谢谢。我以前试过,但从打印机中取出随机字符。找到一个treshold,现在打印的很好:)。缩放成功了,谢谢。我以前试过,但从打印机中取出随机字符。找到一个treshold,现在打印的很好:)。
// Initialize result
List<byte> result = new List<byte>();

// Init ESC/POS
result.AddRange(new byte[] { 0x1B, 0x33, 0x21 });

// Init ESC/POS bmp commands (will be reapeated)
byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x01, (byte)(bitmap.Width % 256), (byte)(bitmap.Height / 256) };

// Iterate height
for (int i = 0; i < (bitmap.Height / 24 + 1); i++)
{
    // Add bitmapp commands to result
    result.AddRange(escBmp);

    // Init pixel color
    int pixelColor;

    // Iterate width
    for (int j = 0; j < bitmap.Width; j++)
    {
        // Init data
        byte[] data = new byte[] { 0x00, 0x00, 0x00 };

        for (int k = 0; k < 24; k++)
        {
            if (((i * 24) + k) < bitmap.Height)
            {
                // Get pixel color
                pixelColor = bitmap.GetPixel(j, (i * 24) + k);

                // Check pixel color
                if (pixelColor != 0)
                {
                    data[k / 8] += (byte)(128 >> (k % 8));
                }
            }
        }

        // Add data to result
        result.AddRange(data);
    }

    // Add some... other stuff
    result.AddRange(new byte[] { 0x0D, 0x0A });
}

// Return data
return result.ToArray();