使用 esc/pos 热敏打印机打印真正的自定义尺寸位图 Android

Print real custom size bitmap using esc/pos termal printer Android

我想使用 Datecs Termal 打印机打印 ScrollView。视图是一张票,就像一张购买票。我想在纸上精确测量 300 毫米的高度。 我使用这种方法将 Scrollview 转换为位图:

public static Bitmap getBitmapFromView(View view, int height, int   width) {
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(bitmap);
    Drawable bgDrawable = view.getBackground();
    canvas.drawColor(Color.WHITE);
    if (bgDrawable != null)
        bgDrawable.draw(canvas);
    else
        canvas.drawColor(Color.WHITE);
    view.draw(canvas);

    return bitmap;
}

问题是当隐藏或显示文本视图时,更改位图的高度。此外,它还会根据屏幕的密度改变大小。 我想用视图和空白填充 300 毫米的纸。

我尝试了两种解决方案:

-视图高度与 300mm 之间存在差异的行数送纸

-生成位图高度正好是300mm。

我无论如何也做不到。

Datecs sdk 包含此送纸方法:

public void feedPaper(int lines) throws IOException {
    if (lines >= 0 && lines <= 255) {
        byte[] buf = new byte[]{27, 74, (byte)lines};
        synchronized(this) {
            this.write(buf);
        }
    } else {
        throw new IllegalArgumentException("The lines is out of range");
    }
}

但是我不知道位图的高度、每行的高度和纸张的300mm之间的关系

有人可以帮助我吗?非常感谢!

您的问题包含三个要素:

  • 要打印多少位图才能在 300 毫米高处打印。
  • 如何将位图设置为该大小
  • 如果打印件不够高,如何用正确数量的白色填充打印件space。

制作位图的尺寸

300mm 高打印需要多少像素?

要确定有多少点在纸张上创建特定尺寸的图像(以毫米为单位),您需要知道打印的密度是多少(以 "DPI" 或 "DPMM" 测量) .对于热敏打印机,这不是用户可选择的,您可以在打印机的数据 sheet 中找到该指标。

例如,DPP-250 data sheet 列出了 8x8 DPMM 的密度,这意味着垂直方向每毫米 8 个点,水平方向每毫米 8 个点。

300mm × 8 dots/mm = 2400 dots

在同一台打印机上,打印宽度为 48 毫米(384 点),因此您将旨在生成 384x2400 像素图像以发送到打印机进行 48x300 毫米打印。

在这部分工作之前,您可以从堆栈中删除 Android 和您的打印机驱动程序。独立的命令行工具可以将图像转换为 ESC/POS 代码供您调试,因此请使用笔记本电脑、twg/png2escpos 和连接打印机的 USB 电缆,这是查看不同尺寸图像显示效果的正确方法在您的打印机上。

我不知道这台打印机与您的有多相似,请调整这些数字以匹配您打印机的数据 sheet。

如何将位图设置为该大小

如果 View 制作的 Bitmap 尺寸错误,那么您应该缩放它,或者在后台生成正确尺寸的东西。着重在保持纵横比的同时缩放宽度,然后用白色space填充底部(在图像中,或作为一系列空白行)。

Whosebug 上还有其他答案比我更能解决图像缩放问题,such as this one

如何用正确的白色填充打印件space

对于填充,使用空行而不是扩展图像是正确的,因为打印空行会更快!

我链接的数据中没有指定默认行间距sheet。如果你想要一个估计值,使用 32 点(4 毫米),但为了获得准确的答案,你需要打印几行下划线并测量它们之间有多少 space。

请注意,并非总是可以将 32 的增量添加到 300 毫米的圆形,因此:

  • 用大约正确数量的空白行填充图像,并对近似值感到满意,或者
  • 用白色填充图像space 到 32 像素的倍数,然后添加空行。

将图像缩放到 384 像素宽并知道行间距后,这不会在设备之间改变。

例如,要用 32 像素的空白行填充 1234 像素高的图像,为了使其高 2400 像素,您需要大约 36 行:行:

(2400 dots - 1234 dots) ÷ 32 dots/line ≈ 36 lines

同样,这些数字不适用于您的打印机,请根据您自己的数据 sheet 和线高测量值进行调整,如上所述。