O SDK possui dois providers de impressão e um de reimpressão para o POS Android.

PosPrintProvider

Esse provider tem como objetivo realizar a impressão de texto no formato String e também de imagens no formato JPEG/PNG.

Observação: Para o dispositivo Ingenico APOS A8, existe uma limitação no tamanho da imagem a ser impressa, este valor em pixels é de 380x595. Esta limitação se aplica para cada imagem individualmente, podendo existir N imagens com tamanho menor ou igual a 380x595 dentro de uma MESMA IMPRESSÃO, não temos este limite para impressão de texto, desde que este texto não seja transformado em uma imagem.

Sugestão: Aconselhamos nossos parceiros a realizarem a impressão de texto simples utilizando o método addLine do provider, este adiciona uma nova linha podendo o evento ocorrer N vezes. Havendo necessidade de uma imagem, por exemplo a impressão de um qrcode, utilizamos o método addBitmap. No exemplo abaixo, temos o padrão que consideramos ideal para a impressão, onde grande parte da mensagem é texto simples, contendo apenas uma assinatura no formato JPEG, trabalhando com texto simples e imagens de tamanho máximo 380x595 pixels não teremos problema. Geralmente ocorre problema quando na impressão, transformarmos todo o conteúdo em uma única imagem, isto não deve ser feito.

Sugestão 2: Caso sua imagem por algum motivo ultrapassar o tamanho máximo, recorte em duas ou mais partes e adicione individualmente as partes no provider através do método addBitmap, assim não terá problemas.

PosPrintProvider customPosPrintProvider = new PosPrintProvider(context);
customPosPrintProvider.addLine("PAN : " + transactionObject.getCardHolderNumber());
customPosPrintProvider.addLine("DATE/TIME : " + transactionObject.getDate() + " " + transactionObject.getTime());
customPosPrintProvider.addLine("AMOUNT : " + transactionObject.getAmount());
customPosPrintProvider.addLine("ATK : " + transactionObject.getRecipientTransactionIdentification());
customPosPrintProvider.addLine("Signature");
customPosPrintProvider.addBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.signature));
customPosPrintProvider.setConnectionCallback(new StoneCallbackInterface() {
    @Override
    public void onSuccess() {
        Toast.makeText(context, "Recibo impresso", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onError() {
        Toast.makeText(context, "Erro ao imprimir: " + customPosPrintProvider.getListOfErrors(), Toast.LENGTH_SHORT).show();
    }
});
customPosPrintProvider.execute()

Impressão usando Base64

Nosso provider de impressão customizada permite a impressão de imagem recebendo por parâmetro a string que representa a imagem em Base64

String base64Image;

PosPrinterProvider posPrintProvider = new PosPrintProvider(context);
posPrintProvider.addBase64Image(base64Image));

posPrintProvider.execute();
val base64Image: String
  
val posPrintProvider = PosPrintProvider(context)
posPrintProvider.addBase64Image(base64Image))

posPrintProvider.execute()

Formatação de texto para impressão

Você pode ajustar tamanho e alinhamento do texto na impressão, para fazer isso é preciso implementar a interface StoneCustomizedText com a sua configuração

🚧

A funcionalidade a seguir ainda não está suportada no dispositivo SUNMI P2

Recomendamos para quem deseja customizar a impressão no SUNMI P2 fazer uso do método explicado na sessão "Criando imagem a partir de uma view do android" criando uma imagem bitmap customizada e fazer a impressão do bitmap usando o método PosPrintProvider.addBitmap

Exemplo de implementação da classe:

public class CentralizedBigText implements StoneCustomizedText {
    private final String text;

    public CentralizedBigText(String text) {
        this.text = text;
    }

    @NotNull
    @Override
    public String getText() {
        return text;
    }

    @NotNull
    @Override
    public StoneTextSize getTextSize() {
        return StoneTextSize.BIG_16_COLUMNS;
    }

    @NotNull
    @Override
    public StoneTextAlignment getAlignment() {
        return StoneTextAlignment.CENTER;
    }

}
class CentralizedBigText(private val text: String) : StoneCustomizedText {
    override fun getText() = text
    
    override fun getTextSize() = StoneTextSize.BIG_16_COLUMNS

    override fun getAlignment() = StoneTextAlignment.CENTER
}

Exemplo de uso da classe criada acima no PosPrintProvider

final PosPrintProvider customPosPrintProvider = new PosPrintProvider(context);
customPosPrintProvider.addLine(new CentralizedBigText("Stone"));
val customPosPrintProvider = PosPrintProvider(context)
customPosPrintProvider.addLine(CentralizedBigText("Stone"))

Criando imagem a partir de uma view do android

Você também pode criar uma imagem a partir de uma view do android, assim você consegue customizar e formatar a impressão da forma que quiser, utilizando o mecanismo de layout do próprio android.
Para impressão do mesmo devemos criar uma classe com um método que receba um objeto view do android, por exemplo um textView formatado(uma idéia é utilizar a tag Style do layout XML), este método gera um bitmap desta view, por exemplo o código abaixo.

class PrintViewHelper {

    private final int WIDTH_DEFAULT = 384;
    private final int POSITION_DEFAULT = 0;
    private final int UNSPECIFIED_SIZE = 0;
    private final int DEFAULT_PADDING = 0;

    public Bitmap generateBitmapFromView(View view) {
        view.setPadding(DEFAULT_PADDING, DEFAULT_PADDING,
                DEFAULT_PADDING, DEFAULT_PADDING);
        view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
                ViewGroup.LayoutParams.WRAP_CONTENT));
        view.measure(View.MeasureSpec.makeMeasureSpec(WIDTH_DEFAULT, View.MeasureSpec.EXACTLY), 
                View.MeasureSpec.makeMeasureSpec(UNSPECIFIED_SIZE, View.MeasureSpec.UNSPECIFIED));
        view.layout(POSITION_DEFAULT, POSITION_DEFAULT, view.getMeasuredWidth(), 
                view.getMeasuredHeight());
        Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), 
                Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bitmap);
        view.draw(canvas);
        return bitmap;
    }
}
class PrintViewHelper {
    private val WIDTH_DEFAULT = 384
    private val POSITION_DEFAULT = 0
    private val UNSPECIFIED_SIZE = 0
    private val DEFAULT_PADDING = 0
    fun generateBitmapFromView(view: View): Bitmap {
        view.setPadding(DEFAULT_PADDING, DEFAULT_PADDING, DEFAULT_PADDING, DEFAULT_PADDING)
        view.setLayoutParams(ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT))
        view.measure(
                View.MeasureSpec.makeMeasureSpec(WIDTH_DEFAULT, View.MeasureSpec.EXACTLY),
                View.MeasureSpec.makeMeasureSpec(UNSPECIFIED_SIZE, View.MeasureSpec.UNSPECIFIED)
        )
        view.layout(
                POSITION_DEFAULT, 
                POSITION_DEFAULT, 
                view.getMeasuredWidth(), 
                view.getMeasuredHeight()
        )
        val bitmap: Bitmap = Bitmap.createBitmap(
                view.getMeasuredWidth(), 
                view.getMeasuredHeight(),
                Bitmap.Config.RGB_565
        )
        
        val canvas = Canvas(bitmap)
        view.draw(canvas)
        return bitmap
    }
}

📘

Se você estiver usando essa funcionalidade somente para suportar impressão customizada no SUNMI P2

Recomendamos condicionar o uso com Feature Flag e continuar usando a impressão customizada mencionada na seção anterior, pois o suporte ao SUNMI P2 está no roadmap.

PosPrintReceiptProvider

Esse provider tem como objetivo imprimir um comprovante de venda. É necessário passar como parâmetro um TransactionObject e um ReceiptType, informando se o comprovante é a via do estabelecimento ou do cliente.

PosPrintReceiptProvider posPrintReceiptProvider = new PosPrintReceiptProvider(context, transactionObject, ReceiptType.MERCHANT);
posPrintReceiptProvider.setConnectionCallback(new StoneCallbackInterface() {
    @Override
    public void onSuccess() {
        Toast.makeText(context, "Recibo impresso", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onError() {
        Toast.makeText(context, "Erro ao imprimir: " + posPrintReceiptProvider.getListOfErrors(), Toast.LENGTH_SHORT).show();
    }
});
posPrintReceiptProvider.execute();

🚧

Consideramos que o PosPrintProvider é um provider para impressão customizada. Você pode, por exemplo, criar seu próprio layout de comprovante e imprimir através do dele.

Caso você não queria criar seu próprio layout, aconselhamos utilizar o nosso provedor de impressão padrão de comprovantes, PosPrintReceiptProvider, que segue todas as normas definidas pelas bandeiras aceitas pela SDK.

PosReprintReceiptProvider

Esse provider tem como objetivo realizar a reimpressão sem possuir o TransactionObject. É necessário passar como parâmetro o Acquirer Transaction Key e o Receipt Type, informando se o comprovante é a via do estabelecimento ou do cliente.

String acquirerTransactionKey;

PosReprintReceiptProvider posReprintReceiptProvider = new PosReprintReceiptProvider(context, acquirerTransactionKey, ReceiptType.MERCHANT);
 
posReprintReceiptProvider.execute();
val acquirerTransactionKey: String
 
val posReprintReceiptProvider = PosReprintReceiptProvider(context, acquirerTransactionKey, ReceiptType.MERCHANT)

posReprintReceiptProvider.execute()

Também é possível obter a reimpressão em Base64

String acquirerTransactionKey;

PosReprintReceiptProvider posReprintReceiptProvider = new PosReprintReceiptProvider(context, acquirerTransactionKey, ReceiptType.MERCHANT);

posReprintReceiptProvider.getBase64Image();
val acquirerTransactionKey: String

val posReprintReceiptProvider = PosReprintReceiptProvider(context, acquirerTransactionKey, ReceiptType.MERCHANT)
  
posReprintReceiptProvider.getBase64Image()

🚧

Vale ressaltar que o comprovante terá uma marca d'água indicando que é uma Reimpressão.

📘

O provider PosReprintReceiptProvider está disponível a partir da versão 3.11 da SDK

Para visualizar exemplos de comprovante, acesse a seção Exemplo de Comprovante.