当前位置:   article > 正文

android pdf文件预览

android pdf文件预览

首先需要项目里面有pdf文件,或者手机本地有pdf文件,如果只是测试可以直接引入pdf文件到项目的assets目录下,如果是服务器上的pdf需要先下载到手机本地然后使用文件路径

废话不多说,上方法

1.引入build.gradle中引入需要的包

implementation 'com.github.chrisbanes:PhotoView:2.0.0'

2.声明获取权限

1)AndrooidManifest.xml中声明权限

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

如果是服务器文件需要下载,还需声明网络权限

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

2)Android 6.0新特性,一些保护权限,除了要在AndroidManifest中声明权限,还需要在activity中使用代码动态获取权限

  1. if (Build.VERSION.SDK_INT >= 23) {
  2. String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE,
  3. Manifest.permission.INTERNET};
  4. //验证是否许可权限
  5. for (String str : permissions) {
  6. if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
  7. //申请权限
  8. this.requestPermissions(permissions, REQUEST_CODE_CONTACT);
  9. }
  10. }
  11. }

3.布局文件使用ViewPager

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <androidx.viewpager.widget.ViewPager
  7. android:id="@+id/vp_pdf"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"></androidx.viewpager.widget.ViewPager>
  10. </LinearLayout>

4.打开pdf文件读取

  1. public void init() {
  2. String FILE_NAME = getIntent().getStringExtra("path");//文件路径,根据项目需求修改
  3. final File file = new File(FILE_NAME);
  4. if (!file.exists()){
  5. Toast.makeText(PdfActivity.this,"文件不存在",Toast.LENGTH_SHORT).show();
  6. }
  7. mInflater = LayoutInflater.from(this);
  8. vpPdf =findViewById(R.id.vp_pdf);
  9. try {
  10. openRender();
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  16. private void openRender() throws IOException {
  17. File file = new File(FILE_NAME);
  18. if (!file.exists()) {
  19. //复制文件到本地存储
  20. InputStream asset = getAssets().open(FILE_NAME);
  21. FileOutputStream fos = new FileOutputStream(file);
  22. byte[] buffer = new byte[1024];
  23. int size;
  24. while ((size = asset.read(buffer)) != -1) {
  25. fos.write(buffer, 0, size);
  26. }
  27. asset.close();
  28. fos.close();
  29. }
  30. //初始化PdfRender
  31. mDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
  32. if (mDescriptor != null) {
  33. mRenderer = new PdfRenderer(mDescriptor);
  34. }
  35. //初始化ViewPager的适配器并绑定
  36. MyAdapter adapter = new MyAdapter();
  37. vpPdf.setAdapter(adapter);
  38. }
  39. class MyAdapter extends PagerAdapter {
  40. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  41. @Override
  42. public int getCount() {
  43. return mRenderer.getPageCount();
  44. }
  45. @Override
  46. public boolean isViewFromObject(View view, Object object) {
  47. return view==object;
  48. }
  49. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  50. @Override
  51. public Object instantiateItem(ViewGroup container, int position) {
  52. View view = mInflater.inflate(R.layout.item_pdf, null);
  53. PhotoView pvPdf = view.findViewById(R.id.iv_pdf);
  54. pvPdf.setEnabled(true);
  55. if (getCount() <= position) {
  56. return view;
  57. }
  58. PdfRenderer.Page currentPage = mRenderer.openPage(position);
  59. Bitmap bitmap = Bitmap.createBitmap(1080, 1760, Bitmap.Config
  60. .ARGB_8888);
  61. currentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
  62. pvPdf.setImageBitmap(bitmap);
  63. //关闭当前Page对象
  64. currentPage.close();
  65. container.addView(view);
  66. return view;
  67. }
  68. @Override
  69. public void destroyItem(ViewGroup container, int position, Object object) {
  70. //销毁需要销毁的视图
  71. container.removeView((View) object);
  72. }
  73. }

 5.关闭pdf文件读取,一般activity销毁时需要使用

  1. @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
  2. private void closeRenderer() throws IOException {
  3. if (mRenderer != null){
  4. mRenderer.close();
  5. }
  6. if (mDescriptor != null){
  7. mDescriptor.close();
  8. }
  9. }

以上就是pdf文件读取的全流程 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/616925
推荐阅读
相关标签
  

闽ICP备14008679号