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() {
public void onSuccess() {
Toast.makeText(context, "Recibo impresso", Toast.LENGTH_SHORT).show();
}
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() {
public void onSuccess() {
Toast.makeText(context, "Recibo impresso", Toast.LENGTH_SHORT).show();
}
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.