Печать изображения POS / ESC Apex3 S.O.S

У меня есть Apex3, и я могу следить за большей частью документация без проблем, но когда дело доходит до изображений, все получается очень странно (отсутствие примеров + непоследовательность в том, как это делать).

Сначала я пробую наивный подход, пытаясь передать сжатие массива Bitmap byte [] с качеством JPEG и 0, поскольку я не возражал, используя команду:

ESC V n1 n2 данные

Это не сработало.

Затем я обнаружил, что есть библиотека Android для apex3, которая принимает растровое изображение и предлагает его распечатать, но не работает, просто печатает странные символы, такие как:

введите описание изображения здесь

Я пытаюсь декодировать источник jar с помощью JD gui, и они, кажется, работают с байтами растрового изображения, это их код (часть кода совета, например addToDoc (m_Document, ESC + B); просто поместите код в ByteArrayOutputStream данные) , (декомпилированный исходный код отсюда):

public void writeImage(Bitmap imageObject, int printHeadWidth)
    throws IllegalArgumentException
  {
    if (imageObject == null) {
      throw new IllegalArgumentException("Parameter 'imageObject' was null.");
    }
    if (printHeadWidth < 1) {
      throw new IllegalArgumentException("Parameter 'printHeadWidth' must be greater than 0.");
    }
    int height = imageObject.getHeight();
    int width = imageObject.getWidth();
    

    byte blanklineCount = 0;
    byte[] dataline = new byte[printHeadWidth + 7 >> 3];
    int[] imageData = new int[height * width];
    
    imageObject.getPixels(imageData, 0, width, 0, 0, width, height);
    

    addToDoc(m_Document, ESC + "B");
    for (int row = 0; row < height; row++)
    {
      boolean blankLine = true;
      for (int index = 0; index < width; index += 8)
      {
        byte currentByte = 0;
        int offset = row * width + index;
        if (index >= printHeadWidth) {
          break;
        }
        int value = index + 0 < width ? imageData[(offset + 0)] & 0xFFFFFF : 16777215;
        boolean set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384;
        currentByte = (byte)(currentByte | (set ? -128 : 0));
        
        value = index + 1 < width ? imageData[(offset + 1)] & 0xFFFFFF : 16777215;
        set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384;
        currentByte = (byte)(currentByte | (set ? 64 : 0));
        
        value = index + 2 < width ? imageData[(offset + 2)] & 0xFFFFFF : 16777215;
        set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384;
        currentByte = (byte)(currentByte | (set ? 32 : 0));
        
        value = index + 3 < width ? imageData[(offset + 3)] & 0xFFFFFF : 16777215;
        set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384;
        currentByte = (byte)(currentByte | (set ? 16 : 0));
        
        value = index + 4 < width ? imageData[(offset + 4)] & 0xFFFFFF : 16777215;
        set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384;
        currentByte = (byte)(currentByte | (set ? 8 : 0));
        
        value = index + 5 < width ? imageData[(offset + 5)] & 0xFFFFFF : 16777215;
        set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384;
        currentByte = (byte)(currentByte | (set ? 4 : 0));
        
        value = index + 6 < width ? imageData[(offset + 6)] & 0xFFFFFF : 16777215;
        set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384;
        currentByte = (byte)(currentByte | (set ? 2 : 0));
        
        value = index + 7 < width ? imageData[(offset + 7)] & 0xFFFFFF : 16777215;
        set = (value >> 0 & 0xFF) + (value >> 8 & 0xFF) + (value >> 16 & 0xFF) < 384;
        currentByte = (byte)(currentByte | (set ? 1 : 0));
        

        dataline[(index >> 3)] = currentByte;
        blankLine &= currentByte == 0;
      }
      if (!blankLine)
      {
        if (blanklineCount > 0)
        {
          addToDoc(m_Document, "A");
          addToDoc(m_Document, blanklineCount);
          blanklineCount = 0;
        }
        addToDoc(m_Document, compressGraphicLine(dataline));
      }
      else
      {
        blanklineCount = (byte)(blanklineCount + 1);
        if (blanklineCount == 255)
        {
          addToDoc(m_Document, "A");
          addToDoc(m_Document, blanklineCount);
          blanklineCount = 0;
        }
      }
    }
    if (blanklineCount > 0)
    {
      addToDoc(m_Document, "A");
      addToDoc(m_Document, blanklineCount);
      blanklineCount = 0;
    }
    addToDoc(m_Document, ESC + "E");
  }
  
  private byte[] compressGraphicLine(byte[] dataline)
  {
    byte count = 0;
    byte currentByte = 0;
    ByteArrayOutputStream rleString = new ByteArrayOutputStream(128);
    

    addToDoc(rleString, "G");
    for (int index = 0; index < dataline.length; index++) {
      if (count == 0)
      {
        currentByte = dataline[index];
        addToDoc(rleString, currentByte);
        count = (byte)(count + 1);
      }
      else if ((count < 255) && (currentByte == dataline[index]))
      {
        count = (byte)(count + 1);
      }
      else
      {
        addToDoc(rleString, count);
        count = 0;
        

        currentByte = dataline[index];
        addToDoc(rleString, currentByte);
        count = (byte)(count + 1);
      }
    }
    if (count > 0) {
      addToDoc(rleString, count);
    }
    if (rleString.size() > dataline.length + 1)
    {
      rleString.reset();
      addToDoc(rleString, "U");
      for (int item = 0; item < dataline.length; item++) {
        addToDoc(rleString, dataline[item]);
      }
    }
    return rleString.toByteArray();
  }

Но я не понимаю, почему это не работает.

Наконец, я пытаюсь использовать Как я могу распечатать изображение на принтере Bluetooth в Android? с тем же алгоритмом, что и руководство, но по-прежнему печатать случайные странные символы.


person Necronet    schedule 12.11.2013    source источник
comment
Я предполагаю, что вы не можете распечатать изображение на монохромном принтере, его нет в протоколе POS-принтера для этого принтера.   -  person JPM    schedule 27.11.2013
comment
Я не согласен, в тесте на печать есть изображение логотипа, поэтому я бы сказал, что это возможно   -  person Necronet    schedule 27.11.2013
comment
Хотел бы я знать больше, чтобы больше помогать, ведь я уже много лет не программировал POS-принтер.   -  person JPM    schedule 27.11.2013


Ответы (1)


вместо того, чтобы тратить время на декомпиляцию какого-нибудь apk, почему бы не заглянуть в официальный SDK? На веб-странице производителя Загрузки и драйверы есть ссылка на Java SDK, который включает исходный код Sample.java. В источнике создается BufferedImage, поэтому я думаю (у меня нет такого принтера), это даст вам точку входа для вашей проблемы. И, скорее всего, они предоставляют на той же странице исходный код демонстрации Android Исходный код демонстрации принтера для Android

редактировать. Подведем итоги: у вас есть изображение, и вы хотите его распечатать. В примере Sample.java рассматривается этот случай.

  BufferedImage newImage = new BufferedImage(1024, 512, BufferedImage.TYPE_4BYTE_ABGR);
  // some lines and rectangles are drawn in the image
  ...
  // the image is printed, following the SDK javadoc for DocumentLP.writeImage
  // "This will cause the image specified to be printed. Images will be expanded to occupy
  // the entire width of the printer, so the correct current width of the printer must be
  // specified. Images that are too wide will be cropped, and images that are too narrow 
  // will be padded on the right."
  testDoc.writeImage(newImage, m_PrinterWidth);

Для меня единственное, что вам нужно сделать:

  • создать объект BufferedImage
  • нарисуйте свое изображение из файла в буферизованное изображение
  • вызовите метод writeImage вашего объекта DocumentLP

изменить 2 фрагмента псевдокода

// taken from SDK javadoc
DocumentLP docLP;
docLP = new DocumentLP("$");

// own code
BufferedInputStream bis = new BufferedInputStream(--from your image--);
BufferedImage bufImage = ImageIO.read(bis);

// have a look into Sample.java for the expected value of m_PrinterWidth
testDoc.writeImage(bufImage, m_PrinterWidth);

отредактируйте 3 фрагмента кода для Android (взято из DO_AndroidSDKDemo_MainActivity.java, предоставленного с datamax o´neil Android SDK

File file = new File(selectedPath);
byte[] readBuffer = new byte[(int)file.length()];
InputStream inputStream= new BufferedInputStream(new FileInputStream(file));
inputStream.read(readBuffer);
inputStream.close();
fileData = readBuffer;

Bitmap m_imageObject = BitmapFactory.decodeByteArray(fileData, 0, fileData.length);
documentLP.clear();
ocumentLP.writeImage(m_imageObject, m_printHeadWidth);
person SubOptimal    schedule 21.11.2013
comment
потому что он не работает, он такой же декомпилированный, и если вы проверите код, они рисуют его с помощью холста, мне нужно иметь возможность отправить растровое изображение. - person Necronet; 22.11.2013
comment
хорошо, позвольте мне уточнить, это только android, а Sample.java основан на awt - person Necronet; 22.11.2013
comment
BufferedImage не существует в Android, - person Necronet; 24.11.2013
comment
@Necronet, извините, я упустил из виду. Но взгляните на пример edit 3. - person SubOptimal; 27.11.2013
comment
Спасибо за поддержку + SubOptimal - person Necronet; 28.11.2013
comment
@SubOptimal Вы ожидаете, что edit 3 будет решением, но их примерная программа просто печатает символы мусора. Я пробовал в своей программе с тем же результатом. - person B-M-F; 11.07.2014