---
title: "Providers de Impressão - POS Android"
url: "https://devcenter.stone.com.br/sdk-android-provedor-impressao-pos"
image: "https://devcenter.stone.com.br/_og/d/c_Ocean.takumi,title_~UHJvdmlkZXJzIGRlIEltcHJlc3PDo28gLSBQT1MgQW5kcm9pZA,props_eyJ0aGVtZSI6eyJtb2RlIjoibGlnaHQiLCJjb2xvcnMiOnsicHJpbWFyeSI6IiMzMEE2NkQifX19,p_Ii9zZGstYW5kcm9pZC1wcm92ZWRvci1pbXByZXNzYW8tcG9zIg,s_3lBqo-Vp37U_V6K7.png"
---

# Providers de Impressão - POS Android

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

## [PosPrintProvider](#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.

```java
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.getAcquirerTransactionKey());
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](#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

```java
String base64Image;

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

posPrintProvider.execute();
```

```kotlin
val base64Image: String
  
val posPrintProvider = PosPrintProvider(context)
posPrintProvider.addBase64Image(base64Image))

posPrintProvider.execute()
```

## [Criando imagem a partir de uma view do android](#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.

```java
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;
    }
}
```

```kotlin
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](#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.

```java
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](#posreprintreceiptprovider)

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

```java
String transactionId;

PosReprintReceiptProvider posReprintReceiptProvider = new PosReprintReceiptProvider(context, transactionId, ReceiptType.MERCHANT);
 
posReprintReceiptProvider.execute();
```

```kotlin
val transactionId: String
 
val posReprintReceiptProvider = PosReprintReceiptProvider(context, transactionId, ReceiptType.MERCHANT)

posReprintReceiptProvider.execute()
```

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

```java
String transactionId;

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

posReprintReceiptProvider.getBase64Image();
```

```kotlin
val transactionId: String

val posReprintReceiptProvider = PosReprintReceiptProvider(context, transactionId, 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](https://devcenter.stone.com.br/sdk-android-exemplo-comprovante).

---

**Jornada: [Integrar pelos Providers](https://devcenter.stone.com.br/sdk-android-overview-da-sdk)**  
Etapa 11 de 18

[**Etapa anterior**POS Android: Provider de Transação - POS Android](https://devcenter.stone.com.br/sdk-android-provedor-transacao-pos)[**Próxima etapa**POS Android: Provider de Validação de Transação - POS Android](https://devcenter.stone.com.br/sdk-android-provider-de-validacao-de-transacao-pos-android)

Siga a Stone nas redes sociais

[](https://www.facebook.com/stonepagamentos/)[](https://x.com/sejastone/)[](https://www.instagram.com/stone/)[](https://br.linkedin.com/company/stone-co)[](https://www.youtube.com/channel/UCk4L4JykgoDkN8YeuxkNqIQ)

© Stone Instituição de Pagamento S.A. CNPJ 16.501.555/0001-57

Av. Rebouças, 2880, 4º andar, Pinheiros, CEP 05.402-500 – São Paulo/SP

Instituição de pagamento autorizada pelo Banco Central do Brasil, nas modalidades de credenciadora e emissora de moeda eletrônica.