shanraisshan
shanraisshan

Reputation: 3603

Generate Thumbnail of Pdf in Android

I want to generate the image(thumbnail) from pdf file just like done by WhatsApp as shown below WhatsApp

I have tried

  1. PDFBox (https://github.com/TomRoush/PdfBox-Android)
  2. Tika (compile 'org.apache.tika:tika-parsers:1.11')
  3. AndroidPdfViewer (https://github.com/barteksc/AndroidPdfViewer)

and still unable to find a way to generate image from pdf.


PDFBox:

There is a github issue that deals with this problem (https://github.com/TomRoush/PdfBox-Android/issues/3) but this is still unresolved.

Note: I am successfully able to extract image from PDF using PDFBOX


AndroidPdfViewer:

Github issue (https://github.com/barteksc/AndroidPdfViewer/issues/49)

Upvotes: 34

Views: 29575

Answers (5)

FranKs
FranKs

Reputation: 101

This worked for me. In Java.

ParcelFileDescriptor parcelFileDescriptor = contentResolver.openFileDescriptor(uriFile, "r");
try (PdfRenderer pdfRenderer = new PdfRenderer(parcelFileDescriptor);
     PdfRenderer.Page page = pdfRenderer.openPage(0)) {

    Bitmap bitmap = Bitmap.createBitmap(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, Bitmap.Config.ARGB_8888);
    page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);

    try (FileOutputStream fos = new FileOutputStream(thumbnailPath.toFile())) {
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        fos.flush();

    }

} catch (Exception e) {
    Log.e(TAG, "Error creating thumbnail", e);

}

Upvotes: 1

VIMAL K. VISHWAKARMA
VIMAL K. VISHWAKARMA

Reputation: 150

Bitmap myBitmap = generateImageFromPdf(FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", Pdf_File.get(position).getAbsoluteFile()));
    holder.iv_icon.setImageBitmap(myBitmap);

}

Bitmap generateImageFromPdf(Uri pdfUri) {
    int pageNumber = 0;
    PdfiumCore pdfiumCore = new PdfiumCore(context);
    Bitmap bmp = null;
    try {
        //http://www.programcreek.com/java-api-examples/index.php?api=android.os.ParcelFileDescriptor
        ParcelFileDescriptor fd = context.getContentResolver().openFileDescriptor(pdfUri, "r");
        PdfDocument pdfDocument = pdfiumCore.newDocument(fd);
        pdfiumCore.openPage(pdfDocument, pageNumber);
        int width = pdfiumCore.getPageWidthPoint(pdfDocument, pageNumber);
        int height = pdfiumCore.getPageHeightPoint(pdfDocument, pageNumber);
        Log.e("Width_height", "" + width + " " + height);
        bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        pdfiumCore.renderPageBitmap(pdfDocument, bmp, pageNumber, 0, 0, width, height);
        pdfiumCore.closeDocument(pdfDocument);
    } catch (Exception e) {
        //todo with exception
    }
    return bmp;
}

Upvotes: 0

Gagan Belgur
Gagan Belgur

Reputation: 121

Using Android PDFRenderer Component

with(context) {
    contentResolver.openFileDescriptor(uri, "r")?.use { parcelFileDescriptor ->
        val pdfRenderer = PdfRenderer(parcelFileDescriptor).openPage(0)
        val bitmap = Bitmap.createBitmap(pdfRenderer.width, pdfRenderer.height, Bitmap.Config.ARGB_8888)
        pdfRenderer.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)
        pdfRenderer.close()      
    }
}

Upvotes: 12

user6691016
user6691016

Reputation:

Use PdfiumAndroid as mentioned by barteksc here.

Still working in 2021...

Sample Code for generating Pdf thumb

//PdfiumAndroid (https://github.com/barteksc/PdfiumAndroid)
//https://github.com/barteksc/AndroidPdfViewer/issues/49
void generateImageFromPdf(Uri pdfUri) {
    int pageNumber = 0;
    PdfiumCore pdfiumCore = new PdfiumCore(this);
    try {
        //http://www.programcreek.com/java-api-examples/index.php?api=android.os.ParcelFileDescriptor
        ParcelFileDescriptor fd = getContentResolver().openFileDescriptor(pdfUri, "r");
        PdfDocument pdfDocument = pdfiumCore.newDocument(fd);
        pdfiumCore.openPage(pdfDocument, pageNumber);
        int width = pdfiumCore.getPageWidthPoint(pdfDocument, pageNumber);
        int height = pdfiumCore.getPageHeightPoint(pdfDocument, pageNumber);
        Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        pdfiumCore.renderPageBitmap(pdfDocument, bmp, pageNumber, 0, 0, width, height);
        saveImage(bmp);
        pdfiumCore.closeDocument(pdfDocument); // important!
    } catch(Exception e) {
        //todo with exception
    }
}

public final static String FOLDER = Environment.getExternalStorageDirectory() + "/PDF";
private void saveImage(Bitmap bmp) {
    FileOutputStream out = null;
    try {
        File folder = new File(FOLDER);
        if(!folder.exists())
            folder.mkdirs();
        File file = new File(folder, "PDF.png");
        out = new FileOutputStream(file);
        bmp.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
    } catch (Exception e) {
        //todo with exception
    } finally {
        try {
            if (out != null)
                out.close();
        } catch (Exception e) {
            //todo with exception
        }
    }
}

Update:

Include the library in the build.gradle

implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'

For generating Image of any PDF Page:

Call the method generateImageFromPdf(uri) by passing any PDF uri that is stored in your storage.

The method will generate the PDF.png in the PDF folder of your storage.

Upvotes: 39

Pro kashan
Pro kashan

Reputation: 19

val file = Constant.allMediaList[position]
val filename = Environment.getExternalStoragePublicDirectory(file)
if (file != null) {
    if (file.endsWith(".pdf")){
        val fd :ParcelFileDescriptor= ParcelFileDescriptor.open(filename,ParcelFileDescriptor.MODE_READ_WRITE)
        val pageNum: Int  = 0;
        val pdfiumCore: PdfiumCore  = PdfiumCore(mContext);
        try {
            val pdfDocument: PdfDocument = pdfiumCore.newDocument(fd);
            pdfiumCore.openPage(pdfDocument, pageNum);
            val width:  Int  = pdfiumCore.getPageWidthPoint(pdfDocument, pageNum);
            val height:  Int = pdfiumCore.getPageHeightPoint(pdfDocument, pageNum);

            // ARGB_8888 - best quality, high memory usage, higher possibility of OutOfMemoryError
            // RGB_565 - little worse quality, twice less memory usage
            val bitmap: Bitmap = Bitmap.createBitmap(width, height,
                  Bitmap.Config.RGB_565);
            pdfiumCore.renderPageBitmap(pdfDocument, bitmap, pageNum, 0, 0,width, height);
            //if you need to render annotations and form fields, you can use
            //the same method above adding 'true' as last param

            Glide.with(mContext)
                .load(bitmap).into(holder.thumbnail)

            pdfiumCore.closeDocument(pdfDocument); // important!
        } catch(ex: IOException) {
            ex.printStackTrace();
            Toast.makeText(mContext,"failed",Toast.LENGTH_LONG).show()
        }

    }

Upvotes: 0

Related Questions