Проблема с выравниванием квитанции Epson epos sdk

#java #thermal-printer #epson

#java #термопринтер #epson

Вопрос:

в настоящее время я использую epson ePOS SDK для Android. мне нужно распечатать квитанцию, чтобы название меню было выровнено по левому краю, а цена — по правому краю в одной строке, но это не работает должным образом, мое временное решение — добавить какую-нибудь строку подачи, чтобы цена была выровнена по правому краю, возможно ли, чтобы текст был выровнен по левому краю и по правому краю в одной строке? (Вложения ниже и, пожалуйста, игнорируйте символы вопросительного знака)

                 mPrinter.addTextAlign(Printer.ALIGN_LEFT);
                mPrinter.addFeedLine(0);
                textData.append(menuName);
                mPrinter.addText(textData.toString());
                textData.delete(0, textData.length());
                mPrinter.addFeedLine(0);

                //print price
                mPrinter.addTextAlign(Printer.ALIGN_RIGHT);
                textData.append(price   "Y"   "n");
                mPrinter.addText(textData.toString());
                textData.delete(0, textData.length());
                mPrinter.addFeedLine(0);
  

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

Ответ №1:

80 мм — это как 42 столбца в строке…который можно легко дополнить:

 mPrinter.addText(padLine(menuName, price   "¥", 42)   "n");
  

требуемые String методы манипулирования выглядят одинаково:

 /** utility: pads two strings to columns per line */
protected String padLine(@Nullable String partOne, @Nullable String partTwo, int columnsPerLine){
    if(partOne == null) {partOne = "";}
    if(partTwo == null) {partTwo = "";}
    String concat;
    if((partOne.length()   partTwo.length()) > columnsPerLine) {
        concat = partOne   " "   partTwo;
    } else {
        int padding = columnsPerLine - (partOne.length()   partTwo.length());
        concat = partOne   repeat(" ", padding)   partTwo;
    }
    return concat;
}

/** utility: string repeat */
protected String repeat(String str, int i){
    return new String(new char[i]).replace("", str);
}
  

следует отформатировать цену в валюте, прежде чем заполнять ее.

чтобы сделать ее действительно «безупречной»… когда String concat превышает длину 42 , тогда String partOne следует обрезать на избыточную длину — и снова объединить. превышение int columnsPerLine , скорее всего, приведет к искажению выходных данных.

Ответ №2:

Вставка правой строки в левую строку в соответствующей позиции. Это связано с тем, что я не использую линию подачи, предоставляемую EPSON. Вместо этого я вручную добавляю новую строку (n) после 42 (это зависит от принтера) символов.

 // gap -> Number of spaces between the left and the right string
public void print(Printer epsonPrinter, String left, String right, int gap) throws Epos2Exception {
    int total = 42;

    // This is to give a gap between the 2 columns
    for (int i = 0; i < gap; i  ) {
        right = " "   right;
    }

    // This will make sure that the right string is pushed to the right. 
    // If the total sum of both the strings is less than the total length(42),
    // we are prepending extra spaces to the RIGHT string so that it is pushed to the right.
    if ((left.length()   right.length()) < total) {
        int extraSpace = total - left.length() - right.length();
        for (int i = 0; i < extraSpace; i  ) {
            left = left   " ";
        }
    }

    int printableSpace = total - right.length(); // printable space left for the LEFT string

    //stringBuilder -> is the modified string which has RIGHT inserted in the LEFT at the appropriate position. And also contains the new line. This is the string which needs to be printed
    StringBuilder stringBuilder = new StringBuilder();
   // Below 2 statements make the first line of the print
    stringBuilder.append(left.substring(0, Math.min(printableSpace, left.length())));
    stringBuilder.append(right);

   // stringBuilder now contains the first line of the print


   // For appropriately printing the remaining lines of the LEFT string
    for (int index = printableSpace; index < left.length(); index = index   (printableSpace)) {
        stringBuilder.append(left.substring(index, Math.min(index   printableSpace, left.length()))   "n");
    }
    epsonPrinter.addText(stringBuilder.toString());
}
  

Комментарии:

1. Можете ли вы добавить какое-либо объяснение? Сами по себе блоки простого кода обычно не так уж информативны