Generate Thumbnail of Pdf in Android

前端 未结 2 1787
执笔经年
执笔经年 2020-12-28 16:00

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

I have tried

  1. PDFBox
相关标签:
2条回答
  • 2020-12-28 16:21

    Use PdfiumAndroid as mentioned by barteksc here...

    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 library in build.gradle

    compile 'com.github.barteksc:pdfium-android:1.4.0'
    

    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 PDF folder of your storage.

    0 讨论(0)
  • 2020-12-28 16:31
    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()
            }
    
        }
    
    0 讨论(0)
提交回复
热议问题