Pular para conteúdo

Impressora

Para utilizar a impressora basta chamar o método PosDigital.getInstance().getPrinter() e estão disponíveis as funções da impressora.

Exemplo:

PosDigital.getInstance().getPrinter().init();
PosDigital.getInstance().getPrinter().setGray(5);
PosDigital.getInstance().getPrinter().defineFontFormat(FontFormat.MEDIUM);
PosDigital.getInstance().getPrinter().addText(AlignMode.LEFT, "EXEMPLO DE TEXTO");
PosDigital.getInstance().getPrinter().print(new IPrinterCallbackStub() {

    @Override
    public void onSuccess(){
        //Imprimiu o texto
    }

    @Override
    public void onError(int cause){
        //Ocorreu algum erro
    }
});
PosDigital.getInstance().printer.init()
PosDigital.getInstance().printer.setGray(5)
PosDigital.getInstance().printer.defineFontFormat(FontFormat.MEDIUM)
PosDigital.getInstance().printer.addText(AlignMode.LEFT, "EXEMPLO DE TEXTO")
PosDigital.getInstance().printer.print(object: IPrinterCallbackStub() {

    override fun onSuccess(){
        //Imprimiu o texto
    }

    override fun onError(cause: int){
        //Ocorreu algum erro
    }
});

Descrição das funções de impressão

init()
Inicializa a impressora no hardware, não requer parâmetros adicionais.

setGray(int gray)
Seta escalas de cinza na impressão, requer um parâmetro INT.

defineFontFormat(int fontFormat)
Define o tamanho da fonte que vai ser impresso, requer um parâmetro INT(FontFormat.SMALL, FontFormat.MEDIUM, FontFormat.LARGE).

addText(int align, String text)
Imprime texto, mas não imprime caracteres especiais. Recebe dois(2) parâmetros, um é o align(LEFT, CENTER ou RIGTH), e a string de texto. Máximo de caracteres por linha em todos os terminais:

  • SMALL - 48 caracteres
  • MEDIUM - 32 caracteres
  • LARGE - 32 caracteres

A função addText() adiciona automaticamente um "\n" no final. Se utilizar apenas um addText() para todo o comprovante, deve ser inserido manualmente o "\n" pelo programador, respeitando o limite máximo de caracteres por linha. Se este limite não for respeitado, o wordwrap default poderá causar desalinhamento no comprovante. Caso utilize addText() para inserir linhas em branco para corte de papel, recomenda-se inserir um espaço vazio, para compatibilidade(addText(AlignMode.LEFT, “ ”)).

Também deve-se respeitar o número máximo de caracteres por addText(), que é 1800 caracteres, caso este limite não seja respeitado, poderá haver problemas de não impressão de comprovantes.

addImageBitmap(int align, Bitmap bitmap)
Adiciona imagens em formato bitmap para impressão a partir da pasta Assets ou Resource. O método possui uma limitação na largura do BMP. No máximo 378 pixels de largura para a imagem poder ser alinhada (esquerda, direita, centralizado). Imagens com largura maior que 378 pixels são impressas sempre centralizadas. Imagens com largura acima de 378 pixels serão redimensionadas para 378 pixels de largura sem distorção da imagem. Portanto é recomendado usar imagens com no máximo 378 pixels de largura.

addBarCode(int align, String barcode)
Adiciona um barcode para ser impresso, recebendo os parâmetros align(int) e barcode(String). Para a legibilidade e qualidade do barcode, é recomendado utilizar o número máximo de 28 caracteres, caso possua entre 28 e 60 caracteres será feito um resize automático e será impresso com uma qualidade inferior. Se possuir mais de 60 caracteres, poderá não ser impresso.

addQrCode(int align, int imageheight, String qrcode)
Adiciona um QrCode para ser impresso, recebendo os parâmetros align(int), altura em pixels(int) e qrCode(String). Para a legibilidade e qualidade do QrCode, é recomendado uma altura em pixels de no mínimo 140, e máximo 300. Fora deste range, será feito um resize automático do QrCode para os valores citados acima.

addImageByteArray() [DEPRECATED]
Adiciona imagens em formato byteArray para impressão a partir da pasta Assets ou Resource. A função está descontinuada, e não deverá mais ser utilizada.

print(in IPrinterCallback callback)
Realiza a impressão, requer parâmetro getPrinterCallBack().

printAndRemovePaper(in IPrinterCallback callback)
Realiza a impressão com um espaçamento no final para o texto visível sair da impressora, permitindo seu corte. Requer parâmetro getPrinterCallBack().

getStatus() – Retorna um int com o status da impressão.

IMPORTANTE:

Sempre agrupe as informações no comprovante antes de mandar imprimir, ou seja, chame o método “print” após todo o comprovante já estar pronto. Sempre que chamar o método “print”, aguarde os eventos de call-back antes de chamar outro método “print”.

O tratamento de erros da impressão pode ser feito com o auxílio das constantes da classe PrinterStatus.

PrinterStatus.OK -> "OK"
PrinterStatus.PRINTING -> "Imprimindo"
PrinterStatus.ERROR_NOT_INIT -> "Impressora não iniciada”
PrinterStatus.ERROR_OVERHEAT -> "Impressora superaquecida
PrinterStatus.ERROR_BUFOVERFLOW -> "Fila de impressão muito grande”
PrinterStatus.ERROR_PARAM -> "Parâmetros incorretos
PrinterStatus.ERROR_LIFTHEAD -> "Porta da impressora aberta"
PrinterStatus.ERROR_LOWTEMP -> "Temperatura baixa demais para impressão"
PrinterStatus.ERROR_LOWVOL -> "Sem bateria suficiente para impressão"
PrinterStatus.ERROR_MOTORERR -> "Motor de passo com problemas"
PrinterStatus.ERROR_NO_PAPER -> "Sem bobina"
PrinterStatus.ERROR_PAPERENDING -> "Bobina acabando"
PrinterStatus.ERROR_PAPERJAM -> "Bobina travada"
PrinterStatus.UNKNOW -> "Não foi possível definir o erro"

public class PrinterStatus {
    OK = 0;
    PRINTING = 1;
    ERROR_NOT_INIT = 2;
    ERROR_OVERHEAT = 3;
    ERROR_BUFOVERFLOW = 4;
    ERROR_PARAM = 5;
    ERROR_LIFTHEAD = 10;
    ERROR_LOWTEMP = 11;
    ERROR_LOWVOL = 12;
    ERROR_MOTORERR = 13;
    ERROR_NO_PAPER = 15;
    ERROR_PAPERENDING = 16;
    ERROR_PAPERJAM = 17;
    UNKNOW = 1000;
}

Dica de impressão

Para imprimir com acentos e caracteres especiais, é bom criar um .xml no seu código, com o esqueleto da impressão, populá-lo, e após utilizar a função de converter para Bitmap, como no exemplo abaixo:

val view = layoutInflater.inflate(R.layout.slip, null)
PosDigital.getInstance().getPrinter().addImageBitmap(AlignMode.CENTER, ViewUtils.convertToBitmap(view))

Exemplo de XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="378px"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.AppCompatTextView
            style="@style/TextAppearance.Slip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_marginStart="22dp"
            android:text="Posto de Combustível XYZ" />

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.AppCompatTextView
            style="@style/TextAppearance.Slip.Small"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_marginStart="37dp"
            android:text="CNPJ: 00.666.000/0001.66" />

    </RelativeLayout>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.v7.widget.AppCompatTextView
            style="@style/TextAppearance.Slip.Medium"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_marginStart="25dp"
            android:text="MASTER/VISA/AMEX/ELO" />

    </RelativeLayout>

    <android.support.v7.widget.AppCompatTextView
        style="@style/TextAppearance.Slip.Medium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="DEBITO/CREDITO PARCELADO/A VISTA"
        android:textAlignment="center" />

    <android.support.v7.widget.AppCompatTextView
        style="@style/TextAppearance.Slip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="R$ 12,34"
        android:textAlignment="center" />

</LinearLayout>