/* Tibisay Movil Copyright (C) 2013 Antonio Araujo (aaraujo@cenditel.gob.ve), Jose Ruiz (jruiz@cenditel.gob.ve), Fundacion Centro Nacional de Desarrollo e Investigacion en Tecnologias Libres - CENDITEL. La Fundación CENDITEL concede permiso para usar, copiar, distribuir y/o modificar este programa, reconociendo el derecho que la humanidad posee al libre acceso al conocimiento, bajo los términos de la licencia de software GPL versión 2.0 de la Free Software Foundation. Este programa se distribuye con la esperanza de que sea util, pero SIN NINGUNA GARANTIA; tampoco las implicitas garantias de MERCANTILIDAD o ADECUACION A UN PROPOSITO PARTICULAR. Para mayor información sobre los términos de la licencia ver el archivo llamado "gpl-2.0.txt" en ingles. */ package ve.gob.cenditel.tibisaymovil; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Calendar; import java.util.Vector; import com.lowagie.text.DocumentException; import com.lowagie.text.Image; import com.lowagie.text.Rectangle; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfReader; import com.lowagie.text.pdf.PdfStamper; import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; public class SelectSignUbicationHandwrittenSignatureActivity extends Activity{ private TextView selected_position = null; private String fileToSign; private String imageCaptured; private float x_coef, y_coef; private LinearLayout button_accept, button_cancel; private PdfReader pdfReader; private Spinner spinner_page_number; private String tempDir; @Override protected void onCreate(Bundle savedInstanceState) { //Capturando archivo que será firmado fileToSign = getIntent().getExtras().getString("FILE_TO_SIGN"); //Capturando imagen de firma imageCaptured = getIntent().getExtras().getString("IMAGE_CAPTURED"); //Estilando la barra de titulo final boolean customTitleSupported = requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.activity_select_sign_ubication_handwritten_signature); //Estilando Barra de titulo if(customTitleSupported) getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.title_bar); TextView text_view_11 = (TextView) this.findViewById(R.id.textView11); TextView text_view_12 = (TextView) this.findViewById(R.id.textView12); TextView text_view_13 = (TextView) this.findViewById(R.id.textView13); TextView text_view_21 = (TextView) this.findViewById(R.id.textView21); TextView text_view_22 = (TextView) this.findViewById(R.id.textView22); TextView text_view_23 = (TextView) this.findViewById(R.id.textView23); TextView text_view_31 = (TextView) this.findViewById(R.id.textView31); TextView text_view_32 = (TextView) this.findViewById(R.id.textView32); TextView text_view_33 = (TextView) this.findViewById(R.id.textView33); spinner_page_number = (Spinner) findViewById(R.id.pages_spinner); button_accept = (LinearLayout) this.findViewById(R.id.button_accept_zone); button_cancel = (LinearLayout) this.findViewById(R.id.button_cancel_zone); button_accept.setEnabled(false); AsyncTask task = new AsyncTask() { private ProgressDialog pd; @Override protected void onPreExecute() { pd = new ProgressDialog(SelectSignUbicationHandwrittenSignatureActivity.this); pd.setTitle(getString(R.string.title_progress_file_read)); pd.setMessage(getString(R.string.por_favor_epsere)); pd.setCancelable(false); pd.setIndeterminate(true); pd.show(); } @Override protected Void doInBackground(Void... arg0) { //Cargar Spinner //Cargar PDF try{ pdfReader = new PdfReader(fileToSign); } catch (IOException e) { e.printStackTrace(); //Si el archivo no puede ser leído se envía al activity de selectionar archivo Intent oIntent = new Intent(SelectSignUbicationHandwrittenSignatureActivity.this, FileToSignHandwrittenSignatureActivity.class); oIntent.setAction(Intent.ACTION_VIEW); oIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(oIntent); finish(); Toast.makeText(SelectSignUbicationHandwrittenSignatureActivity.this, SelectSignUbicationHandwrittenSignatureActivity.this.getString(R.string.error_lectura), Toast.LENGTH_SHORT).show(); } return null; } @Override protected void onPostExecute(Void result) { int number_pages = pdfReader.getNumberOfPages(); Vector pages_vector = new Vector(); for(int i = 0; i < number_pages ; i++) pages_vector.add(String.valueOf(i+1)); // Create an ArrayAdapter using the string array and a default spinner layout ArrayAdapter spinnerArrayAdapter = new ArrayAdapter( SelectSignUbicationHandwrittenSignatureActivity.this, android.R.layout.simple_spinner_item, pages_vector); // Specify the layout to use when the list of choices appears spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // Apply the adapter to the spinner spinner_page_number.setAdapter(spinnerArrayAdapter); pd.dismiss(); } }; task.execute((Void[])null); button_accept.setOnClickListener(new OnClickListener() { public void onClick(View v) { pdfSignatureDig(); } }); button_cancel.setOnClickListener(new OnClickListener() { public void onClick(View v) { finish(); } }); OnClickListener listen_area = new OnClickListener() { @Override public void onClick(View v) { if(!button_accept.isEnabled()) button_accept.setEnabled(true); if(selected_position != null) { selected_position.setBackgroundResource(R.drawable.shape_table1); } v.setBackgroundColor(getResources().getColor(R.color.gris1)); selected_position = (TextView) v; int cols = 3; int rows = 3; int row = 0; int col = 0; switch (v.getId()) { case R.id.textView11: row = 1; col = 1; break; case R.id.textView12: row = 1; col = 2; break; case R.id.textView13: row = 1; col = 3; break; case R.id.textView21: row = 2; col = 1; break; case R.id.textView22: row = 2; col = 2; break; case R.id.textView23: row = 2; col = 3; break; case R.id.textView31: row = 3; col = 1; break; case R.id.textView32: row = 3; col = 2; break; case R.id.textView33: row = 3; col = 3; break; default: break; } // Coeficientes para calcular la posición de la firma x_coef = (float)col/(float)cols - 1f/(float)cols/2f; y_coef = ((float)rows-(float)row+1)/(float)rows - 1f/(float)rows/2f; } }; text_view_11.setOnClickListener(listen_area); text_view_12.setOnClickListener(listen_area); text_view_13.setOnClickListener(listen_area); text_view_21.setOnClickListener(listen_area); text_view_22.setOnClickListener(listen_area); text_view_23.setOnClickListener(listen_area); text_view_31.setOnClickListener(listen_area); text_view_32.setOnClickListener(listen_area); text_view_33.setOnClickListener(listen_area); } public boolean pdfSignatureDig(){ try{ // Número de página seleccionada int number_page = Integer.parseInt(spinner_page_number.getSelectedItem().toString()); // Lee el archivo pdf // PdfReader pdfReader = new PdfReader(fileToSign); // Crea un archivo de salida para estampar la firma String uniqueId = getTodaysDate() + "_" + getCurrentTime(); String output_filename = "firmaManuscrita"+uniqueId+".pdf"; tempDir = Environment.getExternalStorageDirectory() + "/" + getResources().getString(R.string.app_name) + "/" + getResources().getString(R.string.external_dir_files) + "/"; prepareDirectory(); PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(tempDir+output_filename)); // Obtiene referencia a la imágen de la firma Image image = Image.getInstance(imageCaptured); image.scalePercent(75); //Escala al 75% // Obtiene las dimensiones de la página Rectangle rec = pdfReader.getPageSize(number_page); float page_width = rec.getWidth(); float page_height = rec.getHeight(); /* * Calcula la posición de la firma basada en los coeficientes * y el tamaño de la página a firmar */ float x = (page_width * x_coef) - image.getWidth() / 2; float y = (page_height * y_coef) - image.getHeight() / 2; //put content under PdfContentByte content = pdfStamper.getUnderContent(number_page); //put content over content = pdfStamper.getOverContent(number_page); image.setAbsolutePosition(x, y); content.addImage(image); pdfStamper.close(); // Toast.makeText(getApplicationContext(), "Archivo firmado correctamente...", Toast.LENGTH_LONG).show(); // finish(); Intent intent = new Intent(SelectSignUbicationHandwrittenSignatureActivity.this, SignResultHandwrittenSignatureActivity.class); intent.putExtra("STATUS", "done"); intent.putExtra("IMAGE_CAPTURED", imageCaptured); intent.putExtra("FILE_TO_SIGN", fileToSign); intent.putExtra("FILE_SIGNED", output_filename); intent.putExtra("PATH_FILE_SIGNED", tempDir); startActivity(intent); }catch (IOException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "Error al firmar el archivo", Toast.LENGTH_LONG).show(); }catch (DocumentException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "Error al firmar el archivo", Toast.LENGTH_LONG).show(); } return true; } private String getTodaysDate() { final Calendar c = Calendar.getInstance(); int todaysDate = (c.get(Calendar.YEAR) * 10000) + ((c.get(Calendar.MONTH) + 1) * 100) + (c.get(Calendar.DAY_OF_MONTH)); return(String.valueOf(todaysDate)); } private String getCurrentTime() { final Calendar c = Calendar.getInstance(); int currentTime = (c.get(Calendar.HOUR_OF_DAY) * 10000) + (c.get(Calendar.MINUTE) * 100) + (c.get(Calendar.SECOND)); return(String.valueOf(currentTime)); } /** * Prepara directorio * @return boolean */ private boolean prepareDirectory() { try { if (makedirs()) { return true; } else { return false; } } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, "Could not initiate File System.. Is Sdcard mounted properly?", Toast.LENGTH_LONG).show(); return false; } } /** * Crea directorio utilizando la variable tmpDir * @return boolean */ private boolean makedirs() { File tempdir = new File(tempDir); if (!tempdir.exists()) tempdir.mkdirs(); // if (tempdir.isDirectory()) // { // File[] files = tempdir.listFiles(); // for (File file : files) // { // if (!file.delete()) // { // System.out.println("Failed to delete " + file); // } // } // } return (tempdir.isDirectory()); } }