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. <a href=enter image description here" /> The actually Image is <a href=enter image description here" />

Anish Kumar asked Mar 30, 2016 at 9:55 Anish Kumar Anish Kumar 478 4 4 gold badges 12 12 silver badges 27 27 bronze badges Possible duplicate of Convert image to PDF in Android Commented Mar 30, 2016 at 10:04

you can use itext library for this. here is an example of this. concretepage.com/itext/add-image-in-pdf-using-itext-in-java

Commented Mar 30, 2016 at 10:11 I tried that. I implemented that code here. My problem is, Image is very small in PDF. Commented Mar 30, 2016 at 10:12

6 Answers 6

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

 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(); 
answered Mar 30, 2016 at 10:14 Burak Cakir Burak Cakir 928 13 13 silver badges 23 23 bronze badges

I tried the code. Partially working, now Image is too big. Please find the updated question. I have posted few images

Commented Mar 30, 2016 at 10:39

But, it varies from picture to picture. If I choose the image from camera, alignment is not proper. If I choose different image with different quality, again alignment differs. How can I dynamically fix this?

Commented Mar 31, 2016 at 5:51

@Suman, when you scale an Image object in iText, you don't lose any information: the number of pixels remains the same. Whereas PDF doesn't have a resolution, the images inside a PDF do. When you the image scale down (that is: you put the same number of pixels on a smaller canvas), the resolution increases; when you scale up, the resolution decreases. So quality ll be the same, the resolution is up to image size and document page size.

Commented Oct 5, 2016 at 8:19 Just so you know, it's now implementation 'com.itextpdf:itextpdf:5.5.13' Commented Mar 22, 2018 at 7:39

Hello, I've tried this code, It is working fine if I choose an Image from my Gallary, But very worst if I have captured an Image from my Camera. The Image get blured and cant read even a single text from that Image.

Commented Dec 23, 2020 at 11:29

MainActivity.java:

package com.deepshikha.convertbitmap; import android.Manifest; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.pdf.PdfDocument; import android.net.Uri; import android.provider.MediaStore; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends AppCompatActivity implements View.OnClickListener < public static final int GALLERY_PICTURE = 1; Button btn_select, btn_convert; ImageView iv_image; boolean boolean_permission; boolean boolean_save; Bitmap bitmap; public static final int REQUEST_PERMISSIONS = 1; @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); listener(); fn_permission(); >private void init() < btn_select = (Button) findViewById(R.id.btn_select); btn_convert = (Button) findViewById(R.id.btn_convert); iv_image = (ImageView) findViewById(R.id.iv_image); >private void listener() < btn_select.setOnClickListener(this); btn_convert.setOnClickListener(this); >@Override public void onClick(View view) < switch (view.getId()) < case R.id.btn_select: Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, GALLERY_PICTURE); break; case R.id.btn_convert: if (boolean_save)< Intent intent1=new Intent(getApplicationContext(),PDFViewActivity.class); startActivity(intent1); >else < createPdf(); >break; > > private void createPdf() < WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); DisplayMetrics displaymetrics = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); float hight = displaymetrics.heightPixels ; float width = displaymetrics.widthPixels ; int convertHighet = (int) hight, convertWidth = (int) width; // Resources mResources = getResources(); // Bitmap bitmap = BitmapFactory.decodeResource(mResources, R.drawable.screenshot); PdfDocument document = new PdfDocument(); PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(bitmap.getWidth(), bitmap.getHeight(), 1).create(); PdfDocument.Page page = document.startPage(pageInfo); Canvas canvas = page.getCanvas(); Paint paint = new Paint(); paint.setColor(Color.parseColor("#ffffff")); canvas.drawPaint(paint); bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), true); paint.setColor(Color.BLUE); canvas.drawBitmap(bitmap, 0, 0 , null); document.finishPage(page); // write the document content String targetPdf = "/sdcard/test.pdf"; File filePath = new File(targetPdf); try < document.writeTo(new FileOutputStream(filePath)); btn_convert.setText("Check PDF"); boolean_save=true; >catch (IOException e) < e.printStackTrace(); Toast.makeText(this, "Something wrong: " + e.toString(), Toast.LENGTH_LONG).show(); >// close the document document.close(); > @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) < super.onActivityResult(requestCode, resultCode, data); if (requestCode == GALLERY_PICTURE && resultCode == RESULT_OK) < if (resultCode == RESULT_OK) < Uri selectedImage = data.getData(); String[] filePathColumn = ; Cursor cursor = getContentResolver().query( selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String filePath = cursor.getString(columnIndex); cursor.close(); bitmap = BitmapFactory.decodeFile(filePath); iv_image.setImageBitmap(bitmap); btn_convert.setClickable(true); > > > private void fn_permission() < if ((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)|| (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) < if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE))) < >else < ActivityCompat.requestPermissions(MainActivity.this, new String[], REQUEST_PERMISSIONS); > if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE))) < >else < ActivityCompat.requestPermissions(MainActivity.this, new String[], REQUEST_PERMISSIONS); > > else < boolean_permission = true; >> @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) < super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_PERMISSIONS) < if (grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) < boolean_permission = true; >else < Toast.makeText(getApplicationContext(), "Please allow the permission", Toast.LENGTH_LONG).show(); >> > > 
answered Jun 28, 2017 at 16:02 Deepshikha Puri Deepshikha Puri 2,094 23 23 silver badges 23 23 bronze badges

Thanks for the code , I tried and it works ! but the quality of the image is poor.. I use the camera intent to get the bitmap instead of choosing the file. For the quality it may be because you resize the bitmap when you do that bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(), true);

Commented Nov 15, 2017 at 16:18

Eventually, this code worked perfectly for me. I had an image which was created using a scrollView, Since it was a tablet, it had over 3000 * 10000 resolution. The accepted answer only printed out one portion of the image, but this solution printed out everything.

Commented Nov 8, 2018 at 3:08

Could you please update above source code link , it is not accessible or could suggest any proper tutorial for creating image to pdf converter app for android