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

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