在Android中生成Pdf的缩略图

sha*_*han 19 pdf android image pdfbox

我想从pdf文件生成图像(缩略图),就像WhatsApp所做的那样,如下所示 WhatsApp的

我试过了

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

仍然无法找到从pdf生成图像的方法.


PDFBox的:

有一个github问题可以解决这个问题(https://github.com/TomRoush/PdfBox-Android/issues/3),但这仍然没有得到解决.

注意:我已成功使用PDFBOX从PDF中提取图像


AndroidPdfViewer:

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

小智 23

在这里使用barteksc提到的PdfiumAndroid ......

用于生成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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:

在build.gradle中包含库

compile 'com.github.barteksc:pdfium-android:1.4.0'
Run Code Online (Sandbox Code Playgroud)

用于生成任何PDF页面的图像:

通过传递存储在存储中的任何PDF uri来调用方法generateImageFromPdf(uri).

该方法将在您的存储的PDF文件夹中生成PDF.png.


小智 7

使用Android PDFRenderer组件

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()      
    }
}
Run Code Online (Sandbox Code Playgroud)