1

我有一个应用程序,可以使用 ESC POS 语言使用热敏打印机打印票。我现在使用的代码是:

       /* <-40char-> */
                    Socket sock = new Socket(Impresora.getImpresora_Tickets().getIp(), Impresora.getImpresora_Tickets().getPuerto());
                    OutputStreamWriter osw = new OutputStreamWriter(sock.getOutputStream(), Charset.forName("CP1252"));
                    PrintWriter oStream = new PrintWriter(osw);

       /*Start*/
                    for(int i = 0; i<Impresora.getImpresora_Tickets().getInic().size(); i++)
                        oStream.print(Impresora.getImpresora_Tickets().getInic().get(i));

       /*Set Font Size*/
                    for(int i = 0; i<Impresora.getImpresora_Tickets().getLetra4().size(); i++)
                            oStream.print(Impresora.getImpresora_Tickets().getLetra4().get(i));

       oStream.println("HELLO WORLD");

它工作正常。问题是现在我正在用平板电脑捕获用户的签名,我想在票的末尾打印它。我将它作为位图对象,但我不知道如何将它发送到打印机。有人能帮我吗?谢谢!

编辑1:

我正在尝试做某事,但我认为我的方式不正确......

/**
* Redimensionar imagen
*/
Bitmap firma = Current_Mesa.getT().getFirma_credito();
firma = Bitmap.createScaledBitmap(firma, 255, 64, false);

/**
* Print imagen
*/
ByteArrayOutputStream stream = new ByteArrayOutputStream();
firma.compress(CompressFormat.JPEG, 70, stream);
byte[] firma_bytes = stream.toByteArray();

byte[] SELECT_BIT_IMAGE_MODE = {0x1B, 0x2A, 33};
byte[] SET_LINE_SPACE_24 = {0x1B, 0x33, 24};
byte[] PRINT_AND_FEED_PAPER = new byte[]{0x0A};

for(byte b : SELECT_BIT_IMAGE_MODE)
oStream.print((char)b);

for(byte b : SET_LINE_SPACE_24)
oStream.print((char)b);

for(int i = 0; i < firma_bytes.length; i+=8)
{
    for(int plus = 0; plus < 8; plus++)
    oStream.print(firma_bytes[i+plus]);

    for(byte b : PRINT_AND_FEED_PAPER)
        oStream.print((char)b);
}
4

1 回答 1

1

我之前在 C++ 中完成了这项任务,这并非易事。您需要逐个像素地访问图像(如果您有位图,这应该很容易)。

然后你必须将图像分成 8 个像素的水平带,并获得一个代表每列 8 个像素的字符(使用按位或)。POS 文档应该告诉您如何使用此方法打印单行图形。

这一切都不是很难,但要让它完美适用于所有图像尺寸和形状,需要花点功夫。

更详细的描述:打印机可以从左到右以 8 像素垂直带打印图像,这意味着它首先打印图像的前 8 个像素 - 然后滚动纸张并打印下一个 8 像素行。所以你这样做:

从顶部开始向下走图像并将其划分为 8 个像素高的波段。对于每个波段:

发送将打印机置于“图形模式”的 ESC POS 序列。从左到右循环图像带。对于波段中的每列 8 个像素:

从上到下计算像素的位值。将其转换为简单的字节值,例如 IsPixelBlack(0)*1+IsPixelBlack(1)*2+IsPixelBlack(2)*4+...+IsPixelBlack(7)*128 其中 IsPixelBlack(x) 为 1 如果 x列中的像素为黑色,否则为 0。然后将此字节值作为字符发送到打印机。

因此,您最终为每 8 像素列发送一个字符,表示为要打印的一条数据的字符串。

我还认为爱普生有一个用于 ESC/POS 设备的 android SDK;我从未使用过它,但认为它可以免费使用。

于 2015-06-23T12:11:31.290 回答