How to capture a photo and immediately put it into an existing pdf?

1.7k views Asked by At

I couldn't find the solution for my issue. My MainActivity creates a pdf file, the user adds some text via EditText and closes it, no problem with that. Then I have a secondary activity that is calling the MediaStore.ACTION_IMAGE_CAPTURE to take pictures. Once a picture is taken, I'd like to know how I can get this just-captured image into that pdf.

I know I have to reopen the pdf, that is no problem, since I have the pdf file name saved in a variable. The major problem that I see is that I don't know how to programmatically get the file name of the picture, once it is automatically named after "yyyyMMdd_hhMMss.jpg". So how to get the file name from a picture taken by my secondary activity?

*EDIT - Showing code:

From MainActivity:

public class MainActivity extends Activity {

public String FILE = Environment.getExternalStorageDirectory() + "/CoManut/sample.pdf"; 

public static Font catFont = new Font(Font.FontFamily.TIMES_ROMAN, 18, Font.BOLD);
public static Font redFont = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL, BaseColor.RED);
public static Font subFont = new Font(Font.FontFamily.TIMES_ROMAN, 16, Font.BOLD);
public static Font smallBold = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD);

EditText estRep;
EditText sensRep;
EditText cabRep;

String estais;
String sensores;
String cabos;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    estRep = (EditText)findViewById(R.id.estaisRep);
    sensRep = (EditText)findViewById(R.id.sensoresRep);
    cabRep = (EditText)findViewById(R.id.cabosRep);
}

public void gerarPDF(View view) {

    estais = estRep.getText().toString();
    sensores = sensRep.getText().toString();
    cabos = cabRep.getText().toString();

    try {
        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream(FILE));
        document.open();
        addMetaData(document);
        addTitlePage(document);
        addContent(document);
        document.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

    AlertDialog alertDialog = new AlertDialog.Builder(this).create();
    alertDialog.setTitle("CoManut");
    alertDialog.setMessage("Picture?");

    alertDialog.setButton("Yes", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {

            Intent intent = new Intent(MainActivity.this, PhotoActivity.class);
            startActivity(intent);
        }
    });

    alertDialog.setButton2("NO", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {

            Toast.makeText(MainActivity.this, "Thanks for using this app!", Toast.LENGTH_LONG).show();
            MainActivity.this.finish();
        }
    });
    alertDialog.setIcon(R.mipmap.ic_launcher);
    alertDialog.show();
}

private static void addMetaData(Document document) {
    document.addTitle("Image and text to PDF");
    document.addSubject("Using iText");
    document.addKeywords("Java, PDF, iText");
    document.addAuthor("Ricardo Gramowski");
    document.addCreator("Ricardo Gramowski");
}

private static void addTitlePage(Document document)
        throws DocumentException {
    Paragraph preface = new Paragraph();
    addEmptyLine(preface, 1);
    preface.add(new Paragraph("Maintenance report", catFont));
    addEmptyLine(preface, 1);
    preface.add(new Paragraph("Report generated by: " + System.getProperty("user.name") + ", " + new Date(),
            smallBold));
    addEmptyLine(preface, 3);
    preface.add(new Paragraph("This doc is important", smallBold));
    addEmptyLine(preface, 8);
    preface.add(new Paragraph("This doc has been generated by Gramowski.",
            redFont));

    document.add(preface);
    // Start a new page
    document.newPage();
}

private void addContent(Document document) throws DocumentException {
    Anchor anchor = new Anchor("Chapter 1", catFont);
    anchor.setName("Chapter 1");

    Chapter catPart = new Chapter(new Paragraph(anchor), 1);

    Paragraph subPara = new Paragraph("Results", subFont);
    Section subCatPart = catPart.addSection(subPara);

    addEmptyLine(subPara, 1);
    createTable(subCatPart);
    document.add(catPart);  
}

private void createTable(Section subCatPart)
        throws BadElementException {
    PdfPTable table = new PdfPTable(2);
    PdfPCell c1 = new PdfPCell(new Phrase("Item"));
    c1.setHorizontalAlignment(Element.ALIGN_CENTER);
    table.addCell(c1);

    c1 = new PdfPCell(new Phrase("Is that good? (OK/Not OK)"));
    c1.setHorizontalAlignment(Element.ALIGN_CENTER);
    table.addCell(c1);

    table.setHeaderRows(1);

    table.addCell("Estais da Torrre ");
    table.addCell(estais);
    table.addCell("Sensores ");
    table.addCell(sensores);
    table.addCell("Cabos ");
    table.addCell(cabos);

    subCatPart.add(table);

}

private static void addEmptyLine(Paragraph paragraph, int number) {
    for (int i = 0; i < number; i++) {
        paragraph.add(new Paragraph(" "));
    }
}
}

And my PhotoActivity:

public class PhotoActivity extends ActionBarActivity {

Button b1;
ImageView iv;
Bitmap bp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_photo);

    b1 = (Button) findViewById(R.id.button1);
    iv = (ImageView) findViewById(R.id.imageView);

    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, 0);
        }
    });
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap mImageBitmap = (Bitmap) extras.get("data");

        iv.setImageBitmap(mImageBitmap);

        String fpath = Environment.getExternalStorageDirectory() + "/CoManut/sample.pdf";

        File file = new File(fpath);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        Document document = new Document();

        try {
            PdfWriter.getInstance(document, new FileOutputStream(fpath));
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (DocumentException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        document.open();

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        mImageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        Image myImg = null;
        try {
            myImg = Image.getInstance(stream.toByteArray());
        } catch (BadElementException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        myImg.setAlignment(Image.MIDDLE);

        try {
            document.add(myImg);
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        document.close();

    }
}

//  Button to go back to the MainActivity
public void onclickButton2(View view) {

    PhotoActivity.this.finish();

 }

@Override
protected void onDestroy() {
    super.onDestroy();
    }
}
1

There are 1 answers

7
Qadir Hussain On BEST ANSWER

Override your onActivitResult() method in your Main Activity

Here you will get the image bitmap from (Intent Data)

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap mImageBitmap = (Bitmap) extras.get("data");
    }
}

Now you have the bitmap. You can add bitmap image like below using the iText Library

 try {
       ByteArrayOutputStream stream = new ByteArrayOutputStream();
       mImageBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); // Try with Bitmap.CompressFormat.JPG also
       Image image = Image.getInstance(stream.toByteArray());
       document.add(image);

    }catch(IOException ex){
            ex.printStackTrace();
   }

Update1

Your onActivityResult() should look like this.

Note Make sure you have WRITE_EXTERNAL_STORAGE permissions in your menifest.xml file.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap mImageBitmap = (Bitmap) extras.get("data");

        img.setImageBitmap(mImageBitmap);

        String fpath = Environment.getExternalStorageDirectory()
                .getAbsolutePath() + "/sample.pdf";
        File file = new File(fpath);
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        Document document = new Document();

        try {
            PdfWriter.getInstance(document, new FileOutputStream(fpath));
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (DocumentException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        document.open();

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        mImageBitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        Image myImg = null;
        try {
            myImg = Image.getInstance(stream.toByteArray());
        } catch (BadElementException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        myImg.setAlignment(Image.MIDDLE);

        try {
            document.add(myImg);
        } catch (DocumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        document.close();

    }
}

This will create a sample.pdf file in your sdcard and add Image bitmap into it.

Hope this helps. I tested it here its working. :)