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()); } }