我正在尝试在支持ESC命令的热敏打印机中打印576像素宽度的图像,问题是用于打印图像位的命令“ ESC
*”仅允许我打印255像素宽度的图像(如果我使用576像素图像,其中一些部分被打印,其余部分是随机符号),在documentacion中表示命令最多接受255个字节,如下所示:
ESC * m nL nH d1Ödk
Name Specify bit image mode
Code ASCII ESC * m nL nHd1...dk
Hex. 1B 2A m nL nHd1...dk
Decimal 27 42 m nL nHd1...dk
Defined Region m = 0,1,32,33
0 ≤ nL ≤ 255
0 ≤ nH ≤ 3
0 ≤ d ≤ 255
所以我不知道如何打印打印机页面最大宽度(576 px)的图像,我有以下代码可以打印图像:
public class ESCPOSApi {
private final byte[] INITIALIZE_PRINTER = new byte[]{0x1B,0x40};
private final byte[] PRINT_AND_FEED_PAPER = new byte[]{0x0A};
private final byte[] SELECT_BIT_IMAGE_MODE = new byte[]{(byte)0x1B, (byte)0x2A};
private final byte[] SET_LINE_SPACING = new byte[]{0x1B, 0x33};
private FileOutputStream printOutput;
public int maxBitsWidth = 255;
public ESCPOSApi(String device) {
try {
printOutput = new FileOutputStream(device);
} catch (FileNotFoundException ex) {
Logger.getLogger(ESCPOSApi.class.getName()).log(Level.SEVERE, null, ex);
}
}
private byte[] buildPOSCommand(byte[] command, byte... args) {
byte[] posCommand = new byte[command.length + args.length];
System.arraycopy(command, 0, posCommand, 0, command.length);
System.arraycopy(args, 0, posCommand, command.length, args.length);
return posCommand;
}
private BitSet getBitsImageData(BufferedImage image) {
int threshold = 127;
int index = 0;
int dimenssions = image.getWidth() * image.getHeight();
BitSet imageBitsData = new BitSet(dimenssions);
for (int y = 0; y < image.getHeight(); y++)
{
for (int x = 0; x < image.getWidth(); x++)
{
int color = image.getRGB(x, y);
int red = (color & 0x00ff0000) >> 16;
int green = (color & 0x0000ff00) >> 8;
int blue = color & 0x000000ff;
int luminance = (int)(red * 0.3 + green * 0.59 + blue * 0.11);
//dots[index] = (luminance < threshold);
imageBitsData.set(index, (luminance < threshold));
index++;
}
}
return imageBitsData;
}
public void printImage(BufferedImage image) {
try {
BitSet imageBits = getBitsImageData(image);
byte widthLSB = (byte)(image.getWidth() & 0xFF);
byte widthMSB = (byte)((image.getWidth() >> 16) & 0xFF);
// COMMANDS
byte[] selectBitImageModeCommand = buildPOSCommand(SELECT_BIT_IMAGE_MODE, (byte) 33, widthLSB, widthMSB);
byte[] setLineSpacing24Dots = buildPOSCommand(SET_LINE_SPACING, (byte) 24);
byte[] setLineSpacing30Dots = buildPOSCommand(SET_LINE_SPACING, (byte) 30);
printOutput.write(INITIALIZE_PRINTER);
printOutput.write(setLineSpacing24Dots);
int offset = 0;
while (offset < image.getHeight()) {
printOutput.write(selectBitImageModeCommand);
int imageDataLineIndex = 0;
byte[] imageDataLine = new byte[3 * image.getWidth()];
for (int x = 0; x < image.getWidth(); ++x) {
// Remember, 24 dots = 24 bits = 3 bytes.
// The 'k' variable keeps track of which of those
// three bytes that we're currently scribbling into.
for (int k = 0; k < 3; ++k) {
byte slice = 0;
// A byte is 8 bits. The 'b' variable keeps track
// of which bit in the byte we're recording.
for (int b = 0; b < 8; ++b) {
// Calculate the y position that we're currently
// trying to draw. We take our offset, divide it
// by 8 so we're talking about the y offset in
// terms of bytes, add our current 'k' byte
// offset to that, multiple by 8 to get it in terms
// of bits again, and add our bit offset to it.
int y = (((offset / 8) + k) * 8) + b;
// Calculate the location of the pixel we want in the bit array.
// It'll be at (y * width) + x.
int i = (y * image.getWidth()) + x;
// If the image (or this stripe of the image)
// is shorter than 24 dots, pad with zero.
boolean v = false;
if (i < imageBits.length()) {
v = imageBits.get(i);
}
// Finally, store our bit in the byte that we're currently
// scribbling to. Our current 'b' is actually the exact
// opposite of where we want it to be in the byte, so
// subtract it from 7, shift our bit into place in a temp
// byte, and OR it with the target byte to get it into there.
slice |= (byte) ((v ? 1 : 0) << (7 - b));
}
imageDataLine[imageDataLineIndex + k] = slice;
// Phew! Write the damn byte to the buffer
//printOutput.write(slice);
}
imageDataLineIndex += 3;
}
printOutput.write(imageDataLine);
offset += 24;
printOutput.write(PRINT_AND_FEED_PAPER);
}
printOutput.write(setLineSpacing30Dots);
} catch (IOException ex) {
Logger.getLogger(ESCPOSApi.class
.getName()).log(Level.SEVERE, null, ex);
}
}
}
我想使用24点双倍密度,但现在我使用的是255像素图像的24点单倍密度(这让我以全页宽度打印图像,但我需要双倍密度)
在上面的代码中,
image.getWidth()>> 16 —应该为“ >> 8”。每字节8位。
我必须使用Java通过热敏打印机打印收据。我已经完成了所有工作。我的程序从数据库中获取数据,并使用特殊字符、制表符和\n转换为一个字符串。然后将字符串传递给另一个将其转换为图形的方法。 问题是当我点击打印按钮时,白纸就出来了。我注意到我的字符串的前4-5个字符被打印在纸币最末端右上角的最后一行。我的打印机是爱普生TM-T81。 打印账单的方法是: 问题是什么?我该如何解决?我认为我没有在drawS
编辑:所以在一天的混乱之后。我的问题是spintf。我最初认为我的循环是错误的。
在我的项目中,客户需要使用POS打印机打印收据,这可以使用JAVA POS来完成。我在网上搜索没有任何有用的材料,但发现 1.javapos 2.jpos 可以有人请指导我应该进行JAVA POS或JPOS。 该应用程序基于Java Swing desktop而不是基于web。 真的坚持这一点,任何帮助都是非常有用的
有没有办法让我在蓝牙热敏打印机上打印收据,因为我真的很难在Flutter上找到解决方案?任何事情都能帮上忙,我真的很感谢你的回答
我们希望打印到连接在apache运行的POS打印机上。由于应用程序的设计和部署,打印应该从服务器上完成(它应该检测订单并发送到不同的打印机和不同格式的打印...账单,厨房订单,等等...)。出于这个原因和其他原因(例如,从iPad访问应用程序),我们放弃了像QZ-Print applet这样的选项,并需要直接在服务器端打印。 提前谢了。
我在标签打印机上打印时遇到了问题。下面的代码在一个上打印4个“标签”(附标签图片)。 下面的代码打印到兄弟QL-500标签打印机上。它打印到3.5"乘1.1"标签上。 如果有人能帮我更好地理解代码,那也太好了。 下面是它打印的内容: