Providers de Impressão - POS Android

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; PosPrintProvider posPrintProvider = new PosPrintProvider(context); posPrintProvider.addBase64Image(base64Image)); posPrintProvider.execute();
val base64Image: String val posPrintProvider = PosPrintProvider(context) posPrintProvider.addBase64Image(base64Image)) posPrintProvider.execute()

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 } }

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.