Bluetooth-принтер POS оставляет некоторый запас в начале, а затем начинает печать в приложении Android - PullRequest
0 голосов
/ 07 мая 2020

Я использую Bluetooth-принтер POS с командами ESC / POS и пытаюсь распечатать растровое изображение. Изображение печатается, но всегда сначала печатается пустое пространство, а затем печатается изображение, из-за чего я не могу напечатать одно изображение на этикетке. Ниже приведен мой код для печати и изображения

    int bmpNewWidth = bmp.getWidth();
    int bmpNewHeight = bmp.getHeight();

    byte[] printBMPPackageHead = ESCUtil.bmpCmdHead(bmpMode,bmpNewWidth);

    int bmpBlockHeight = 0;
    int bmpBlockNums =0;
    if((bmpMode == 0) || (bmpMode ==1))
    {
        bmpBlockHeight = 8;
    }
    else if((bmpMode == 32) || (bmpMode ==33))
    {
        bmpBlockHeight = 24;
    }
    else
    {
        Log.d(TAG,"****bmpMode set error!!*****");
        return (new byte[1]);
    }
    bmpBlockNums = ((bmpNewHeight % bmpBlockHeight) == 0)? (bmpNewHeight/bmpBlockHeight) : (bmpNewHeight/bmpBlockHeight +1);
    int bmpBlockCMDSize = printBMPPackageHead.length + bmpNewWidth*bmpBlockHeight/8;
    byte[] bmpPrintData = new byte[bmpBlockNums*bmpBlockCMDSize];
    for(int n = 0; n < bmpBlockNums; n++)
    {
        byte[] bmpBlockPxBytes = getBitmapBlockData(n,bmpNewWidth,bmpBlockHeight,bmp);

        byte[][] bmpBlockPrintData = {printBMPPackageHead,bmpBlockPxBytes};
        System.arraycopy(ESCUtil.byteMerger(bmpBlockPrintData),0,bmpPrintData,n*bmpBlockCMDSize,bmpBlockCMDSize);
    }

  return bmpPrintData;
}

и

    public static byte[] bmpCmdHead(int mode, int bitmapWidth)
    {
    //byte[] result = new byte[]{ESC,42,0,0,0};
    byte[] result = new byte[]{ESC,42,0,0,0};
    result[2] = (byte)mode;
    result[3] = (byte)(bitmapWidth%256);
    result[4] = (byte)(bitmapWidth/256);
    return result;
}

   public static byte[] getBitmapBlockData(int blocknum, int bmpWidth, int bmpBlockHeight, Bitmap bmp)
{
    int blockHeightBytes = bmpBlockHeight/8;
    byte[] blockData = new byte[bmpWidth*blockHeightBytes];
    for (int i = 0;i < bmpWidth; i++)
    {
        for(int j = 0;j < blockHeightBytes;j++)
        {
            for(int p = 0; p < 8; p++)
            {
                byte px = px2Byte(i,blocknum * bmpBlockHeight+j*8+p,bmp);
                blockData[i*blockHeightBytes+j] |= (px << (7-p));
            }
        }
    }
    return  blockData;
}

вот и все. Перед вызовом этой функции я вызвал только команду init printer. Пожалуйста, помогите мне. Заранее спасибо.

...