[RESOLVIDO]Assinatura para gerar uma imagem

Olá, galera do GUJ, faz muito tempo que eu busco minhas duvidas no forum, porem essa duvida eu não achei nem em sites internacionais.

Eu queria saber se voces tem algum codigo pronto para a pessoa assinar na tela e ele vai gerar uma imagem e vai colocar no PDF que eu estou gerando apartir do iText

Desde já eu Agradeço

Isso é uma “assinatura digital” :?:

nao seria uma assinatura na tela do tablet a pessoa iria assinar na tela e iria gerar uma imagem e essa imagem iria para um pdf gerado pelo itext

Isso me lembra quando você vai fazer uma compra com cartão de crédito nos Estados Unidos e você, em vez de ter um smart card e digitar uma senha qualquer no terminal, acaba fazendo uma assinatura com canetinha - é um pouco tosco, mas acredito que isso exista mais por motivos legais que pela própria segurança. (Como você deve ter percebido, uma assinatura digitalizada é facilmente copiável :slight_smile: )

De qualquer maneira, você tem de dividir seu problema em duas partes (e é por isso que você “não achou em fóruns internacionais” - você não quebrou seu problema em pedaços mais fáceis de achar :slight_smile: )

a) Como desenhar na tela, usando uma canetinha, e capturar isso para um arquivo

  • Não se esqueça que a resolução de um tablet é bem ruim, se a tela for capacitiva, mesmo usando uma canetinha para telas capacitivas (que tem uma espuminha preta na ponta). Talvez não seja adequada para fazer uma assinatura legal :frowning:
    Se a tela for resistiva (como é o caso de alguns tablets, que têm telas resistivas ou então capacitivas+resistivas) você pode usar a canetinha (nesse caso, esses tablets costumam até vir com uma canetinha de ponta dura).
    b) Como transformar o arquivo de imagem em um PDF (ou então anexar o arquivo de imagem em um PDF).

A propósito, o iText é uma biblioteca grande, você pode ter problemas em rodar em um dispositivo Android que tenha pouca memória.

Entao eu to usando não tive problemas ainda, e eu não achei outra biblioteca que funciona-se perfeito no android

Dê uma olhada nisto para ver como é que se desenha na tela com uma canetinha e se salva a imagem.
Se não for isto aqui que você quer, você pode pesquisar mais um pouco. (Não tenho o SDK do Android aqui para dizer se o tal código abaixo funciona).

[quote=entanglement]Isso me lembra quando você vai fazer uma compra com cartão de crédito nos Estados Unidos e você, em vez de ter um smart card e digitar uma senha qualquer no terminal, acaba fazendo uma assinatura com canetinha - é um pouco tosco, mas acredito que isso exista mais por motivos legais que pela própria segurança. (Como você deve ter percebido, uma assinatura digitalizada é facilmente copiável :slight_smile: )

De qualquer maneira, você tem de dividir seu problema em duas partes (e é por isso que você “não achou em fóruns internacionais” - você não quebrou seu problema em pedaços mais fáceis de achar :slight_smile: )

a) Como desenhar na tela, usando uma canetinha, e capturar isso para um arquivo

  • Não se esqueça que a resolução de um tablet é bem ruim, se a tela for capacitiva, mesmo usando uma canetinha para telas capacitivas (que tem uma espuminha preta na ponta). Talvez não seja adequada para fazer uma assinatura legal :frowning:
    Se a tela for resistiva (como é o caso de alguns tablets, que têm telas resistivas ou então capacitivas+resistivas) você pode usar a canetinha (nesse caso, esses tablets costumam até vir com uma canetinha de ponta dura).
    b) Como transformar o arquivo de imagem em um PDF (ou então anexar o arquivo de imagem em um PDF). [/quote]

a)Então essa assinatura seria só um recibo para a pessoa não dizer que não recebeu por que depois esse sistema do tablet vai mandar dados para um outro sistema que gera nota fiscal que tem que assinar fisicamente essa assinatura seria mais para não precisar imprimir varias folhas e sim a pessoa ira assinar no tablet e gerar o pdf ira para o e-mail da pessoa e do pessoa da empresa e dai se a pessoa quiser imprimiria .

Voce esta dizendo que não ficaria legal a assinatura na tela, mas eu teste programas trial para android de assinatura mas ele não tem a possibilidade de ter varias assinaturas seria por isso que eu quero desenvolver o meu sistema para assinatura

b) eu transformaria o que foi desenhado na tela em um imagem salvaria no temp e pegaria essa assinatura e colocaria no pdf na hora de gera-lo

[quote=entanglement]Dê uma olhada nisto para ver como é que se desenha na tela com uma canetinha e se salva a imagem.
Se não for isto aqui que você quer, você pode pesquisar mais um pouco. (Não tenho o SDK do Android aqui para dizer se o tal código abaixo funciona).


[/quote]

valeu vou dar uma olha para ver se acerto do jeito que eu quero agora é dar uma boa estuda no codigo

import android.content.Context;
import android.graphics.*;
import android.view.MotionEvent;
import android.view.View;

public class MyDrawView extends View {

private Bitmap  mBitmap;
private Canvas  mCanvas;
private Path    mPath;
private Paint   mBitmapPaint;
private Paint   mPaint;

public MyDrawView(Context c) {
    super(c);

    mPath = new Path();
    mBitmapPaint = new Paint(Paint.DITHER_FLAG);

    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setDither(true);
    mPaint.setColor(0xFF000000);
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(3);
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(mBitmap);
}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

    canvas.drawPath(mPath, mPaint);
}

private float mX, mY;
private static final float TOUCH_TOLERANCE = 4;

private void touch_start(float x, float y) {
    mPath.reset();
    mPath.moveTo(x, y);
    mX = x;
    mY = y;
}
private void touch_move(float x, float y) {
    float dx = Math.abs(x - mX);
    float dy = Math.abs(y - mY);
    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
        mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
        mX = x;
        mY = y;
    }
}
private void touch_up() {
    mPath.lineTo(mX, mY);
    // commit the path to our offscreen
    mCanvas.drawPath(mPath, mPaint);
    // kill this so we don't double draw
    mPath.reset();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touch_start(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            touch_move(x, y);
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            touch_up();
            invalidate();
            break;
    }
    return true;
}

public void clear(){
    mBitmap.eraseColor(Color.WHITE);
    invalidate();
    System.gc();
}}

A chamada da função é a seguinte na sua activity

LayoutInflater factory = LayoutInflater.from(SuaActivity.this);
		final MyDrawView myDrawView;
		final RelativeLayout parent;
		final View textEntryView = factory.inflate(R.layout.assinatura, null);
        final Button butLimpar = (Button) textEntryView.findViewById(R.id.butLimpar);
        parent = (RelativeLayout) textEntryView.findViewById(R.id.signImageParent);
    	myDrawView = new MyDrawView(this);
    	parent.setBackgroundColor(Color.WHITE);
    	parent.addView(myDrawView);
    	butLimpar.setOnClickListener(new Button.OnClickListener(){
			public void onClick(View v){
				myDrawView.clear();
			}
		});
    	AlertDialog.Builder dialogs = new AlertDialog.Builder(SuaActivity.this);
        dialogs.setTitle("Assinatura");
        dialogs.setView(textEntryView);
        dialogs.setNegativeButton("Fechar", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {     
            }
	     });
        dialogs.setPositiveButton("Gravar Assinatura", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int whichButton) {     
            	File root = Environment.getExternalStorageDirectory();
				arquivo = new File(root,"assinatura".png");
				try {
					if (arquivo.exists()){
						arquivo.delete();
					    Log.e(tag,"Arquivo "+arquivo.toURL().toString());
					}else{
						arquivo.createNewFile();
						Log.e(tag,"Arquivo Novo");
					}
				} catch (IOException e) {
					Log.e(tag ,e.getMessage());
				}
				parent.setDrawingCacheEnabled(true);
				Bitmap b = parent.getDrawingCache();

				FileOutputStream fos = null;
				try {
					fos = new FileOutputStream(arquivo);
				} catch (FileNotFoundException e) {
					Log.i(tag,e.toString());
				}
				b.compress(CompressFormat.PNG,100, fos);
				Log.i(tag,"arquivo criado");
				imprimir();
            }
	     });
	    dialogs.create(); 
	    dialogs.show();

o XML do dialog é

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
   <RelativeLayout
        android:id="@+id/signImageParent"
        android:layout_width="1200dp"
        android:layout_height="200dp"
        android:layout_weight="0.00" >

    </RelativeLayout>

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

        <Button
            android:id="@+id/butLimpar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Limpar" />

    </LinearLayout>

</LinearLayout>

e no AndroidManifest tem que adicionar a seguinte linha para poder ter acesso ao cartão de memória e poder gravar a imagem

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Esse código é interessante, porque ele se aplica também para desenhar e até escrever