Android用PdfRenderer类开发打开pdf文件的功能

       PdfRenderer是Android官方用于开发打开pdf文件功能的类,今天介绍一下它的最基本的使用。Android官方有一个相关的Sample,项目名是PdfRendererBasic,大家也可以参考一下。

       最简单的PdfRenderer使用只需要3步:

       1、用文件的路径生成一个File对象:   
            File file = new File("/mnt/sdcard/printTemplate.pdf");

       2、然后需要用ParcelFileDescriptor类将File对象打一下包:

         ParcelFileDescriptor pdfFile = null;
        try {
            pdfFile = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); //以只读的方式打开文件
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

       3、然后就可以用PdfRenderer类打开文件了:

        PdfRenderer renderer = null;
        try {
            renderer = new PdfRenderer(pdfFile);//用上面的pdfFile新建PdfRenderer对象
        } catch (IOException e) {
            e.printStackTrace();
        }

        final int pageCount = renderer.getPageCount();//获取pdf的页码数
        Bitmap[] bitmaps=new Bitmap[pageCount];//新建一个bmp数组用于存放pdf页面

        WindowManager wm = this.getWindowManager();//获取屏幕的高和宽,以决定pdf的高和宽
        float width = wm.getDefaultDisplay().getWidth();
        float height=wm.getDefaultDisplay().getHeight();

        for (int i = 0; i < pageCount; i++) {//这里用循环把pdf所有的页面都写入bitmap数组,真正使用的时候最好不要这样,
//因为一本pdf的书会有很多页,一次性全部打开会非常消耗内存,我打开一本两百多页的书就消耗了1.8G的内存,而且打开速度很慢。
//真正使用的时候要采用动态加载,用户看到哪页才加载附近的几页。而且最好使用多线程在后台打开。

            PdfRenderer.Page page = renderer.openPage(i);//根据i的变化打开每一页
            mBitmap=Bitmap.createBitmap((int)(width),(int)(page.getHeight()*width/page.getWidth()),Bitmap.Config.ARGB_8888);//根据屏幕的高宽缩放生成bmp对象
            page.render(mBitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);//将pdf的内容写入bmp中

            bitmaps[i]=mBitmap;//将pdf的bmp图像存放进数组中。

            // close the page
            page.close();
        }

        // close the renderer
        renderer.close();

     PDF页面全放入bitmaps数组之后,就可以用上一篇介绍的RecycleView将其显示到界面上。

 

记得要在Manifes文件中添加存储的读写权限:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="knowing.pleasure">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>

    <application
        android:allowBackup="true"
        android:requestLegacyExternalStorage="true"
        android:icon="@mipmap/ic_launcher"
……………………

并在打开app的时候检查权限,如用户没有授权则提醒用户授权。在onCreate方法中添加以下代码:

//申请sd读写权限
int permission_write = ContextCompat.checkSelfPermission(MainActivity.this,
        Manifest.permission.WRITE_EXTERNAL_STORAGE);
int permission_read = ContextCompat.checkSelfPermission(MainActivity.this,
        Manifest.permission.READ_EXTERNAL_STORAGE);
if (permission_write != PackageManager.PERMISSION_GRANTED
        || permission_read != PackageManager.PERMISSION_GRANTED) {
    Toast.makeText(this, "正在请求权限", Toast.LENGTH_SHORT).show();
    //申请权限,特征码自定义为1,可在回调时进行相关判断
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
  • 0
    点赞
  • 6
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值