ESC / Bema Printer Команды для форматирования текста - USB-принтер - PullRequest
0 голосов
/ 22 января 2020

Я использую Bematech MP-4200-TH и пытаюсь печатать с использованием ESC / Bema и USB-порта. Принтер настроен как команды «ESC / Bema». Я пытаюсь это:

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintServiceAttributeSet;
import javax.print.attribute.standard.PrinterName;

/**
 *
 * @author Felipe
 */
public class PrinterTest {

    public static StringBuilder conteudo = new StringBuilder();
    public static final char[] BEMA_MODE = new char[]{0x1D, 0xF9, 0x20, 0x0};
    public static final char[] START = new char[]{0x1B, '@'};
    public static final char[] CUT = new char[]{0x1B, 'm'};
    public static final char[] START_BOLD = new char[]{0x1B, 0x45};
    public static final char[] END_BOLD = new char[]{0x1B, 0x46};
    public static final char[] START_ITALIC = new char[]{0x1B, 0x34};
    public static final char[] END_ITALIC = new char[]{0x1B, 0x35};
    public static final byte[] CHAR_SIZE_2 = {0x1B, 0x21, 0x30};

    public static void main(String[] args) throws Exception {
        addText(new String(START_ITALIC) + "An italic text" + new String(END_ITALIC));
        addText(new String(START_BOLD) + "Acentuação" + new String(END_BOLD));
        addText("\n\n\n\n\n\n\n\n\n");
        addCommand(CUT);
        printBytes(conteudo.toString(), "MP-4200 TH");
    }

    public static void addCommand(char[] comando) {
        conteudo.append(new String(comando)).append(System.lineSeparator());
    }

    public static void addText(String texto) {
        conteudo.append(texto).append(System.lineSeparator());
    }

    private static void printBytes(String s, String printerName) throws Exception {
        byte[] bys = s.getBytes("UTF-8");
        DocFlavor df = DocFlavor.INPUT_STREAM.AUTOSENSE;
        InputStream pis = new ByteArrayInputStream(bys);

        HashPrintServiceAttributeSet aset = new HashPrintServiceAttributeSet();
        PrinterName printer = new PrinterName(printerName, null);
        aset.add(printer);
        PrintService[] services = PrintServiceLookup.lookupPrintServices(null, aset);

        Doc d = new SimpleDoc(pis, df, null);

        if (services[0] != null) {
            DocPrintJob job = services[0].createPrintJob();
            try {
                job.print(d, null);
            } catch (PrintException e) {
                e.printStackTrace();
            }
        }
    }

}

У меня 2 проблемы: с форматированием текста и с акцентуацией (с португальского). Бематех печатает это:

4An italic text5
centuaçãoF

что я делаю не так? Если кто-нибудь знает другой, более простой способ печати, пожалуйста, дайте мне знать. Я пытался изменить режим печати на ES C / POS, но ничего не получилось. Я знаю, что могу печатать с помощью объекта Printable, но я понимаю, что при печати нескольких документов принтеру требуется много времени.

...