Search code examples
androidandroid-imageandroid-bitmapandroid-pdf-api

How to convert Image to PDF?


I am developing an application where I need to convert an Image to PDF. I tried something, but the issue is, Image size in that PDF is very very small. I need solution to fix this. Also I am looking for converting multiple Images into single PDF document. I will post the code which I tried.

    public void convertPDF(byte[] path)
{
 String FILE = "mnt/sdcard/FirstPdf.pdf";
    Document document=new Document();
    try {
        PdfWriter.getInstance(document, new FileOutputStream(FILE));
        document.open();

        try {
            image=Image.getInstance(path);
            document.add(new Paragraph("My Heading"));
            document.add(image);
            document.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } catch (DocumentException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

When I convert Bitmap to Byte array, I am compressing the image and I guess, that's the reason. Without compressing the image, I am unable to convert Bitmap to Byte Array.

 ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG,100,stream);
        byte[] byteArray=stream.toByteArray();
        convertPDF(byteArray);

Is there any solution for this?

UPDATED

Here I have implemented the answer which suggested by @Burak Cakir in the answer. But now I am getting larger image in PDF. For better understanding, Please find the images below. enter image description here

The actually Image is enter image description here


Solution

  • I would suggest you to use iText pdf library. Here is the gradle dependency:

    implementation 'com.itextpdf:itextg:5.5.10'

     Document document = new Document();
    
     String directoryPath = android.os.Environment.getExternalStorageDirectory().toString();
    
     PdfWriter.getInstance(document, new FileOutputStream(directoryPath + "/example.pdf")); //  Change pdf's name.
    
     document.open();
    
     Image image = Image.getInstance(directoryPath + "/" + "example.jpg");  // Change image's name and extension.
    
     float scaler = ((document.getPageSize().getWidth() - document.leftMargin()
                   - document.rightMargin() - 0) / image.getWidth()) * 100; // 0 means you have no indentation. If you have any, change it.
     image.scalePercent(scaler);
     image.setAlignment(Image.ALIGN_CENTER | Image.ALIGN_TOP); 
    
     document.add(image);
     document.close();