我有一个可以使用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);
}
答案 0 :(得分:1)
我之前在c ++中完成了这项任务,并不是一件容易的事。您需要逐像素地访问图像(如果您有位图,这应该很容易)。
然后你必须将图像分成8个像素水平带,并得到一个代表8个像素的每列的字符(使用按位或)。 POS文档应告诉您如何使用此方法打印单行图形。
这一切都不是很难,但需要花一点时间才能让它适合所有图像尺寸和形状。
更详细的说明: 打印机可以在8个像素垂直带中从左到右打印图像,这意味着它首先打印图像的前8个像素 - 然后滚动纸张并打印下一个8像素行。所以你这样做:
从顶部开始向下看图像并将其划分为8像素高频带。对于每个频段:
发送ESC POS序列,将打印机置于&#39;图形模式&#39;。 从左到右循环通过图像带。对于波段中每个8像素的列:
从上到下计算像素的位值。将其转换为简单的字节值,如IsPixelBlack(0)* 1 + IsPixelBlack(1)* 2 + IsPixelBlack(2)* 4 + ... + IsPixelBlack(7)* 128其中IsPixelBlack(x)为1,如果x列中的像素为黑色,否则为0。然后将此字节值作为字符发送到打印机。
因此,您最终会为每8个像素列发送一个字符,表示为要打印的一个数据带的字符串。
另外我认为Epson有一个用于ESC / POS设备的android SDK;我从未使用它,但认为它可以免费使用。