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);
}