当前位置: 首页 > news >正文

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中使用代码动态获取权限

if (Build.VERSION.SDK_INT >= 23) {String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.INTERNET};//验证是否许可权限for (String str : permissions) {if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {//申请权限this.requestPermissions(permissions, REQUEST_CODE_CONTACT);}}}

3.布局文件使用ViewPager

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><androidx.viewpager.widget.ViewPagerandroid:id="@+id/vp_pdf"android:layout_width="match_parent"android:layout_height="match_parent"></androidx.viewpager.widget.ViewPager></LinearLayout>

4.打开pdf文件读取

 public void init() {String FILE_NAME = getIntent().getStringExtra("path");//文件路径,根据项目需求修改final File file = new File(FILE_NAME);if (!file.exists()){Toast.makeText(PdfActivity.this,"文件不存在",Toast.LENGTH_SHORT).show();}mInflater = LayoutInflater.from(this);vpPdf =findViewById(R.id.vp_pdf);try {openRender();} catch (IOException e) {e.printStackTrace();}}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)private void openRender() throws IOException {File file = new File(FILE_NAME);if (!file.exists()) {//复制文件到本地存储InputStream asset = getAssets().open(FILE_NAME);FileOutputStream fos = new FileOutputStream(file);byte[] buffer = new byte[1024];int size;while ((size = asset.read(buffer)) != -1) {fos.write(buffer, 0, size);}asset.close();fos.close();}//初始化PdfRendermDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);if (mDescriptor != null) {mRenderer = new PdfRenderer(mDescriptor);}//初始化ViewPager的适配器并绑定MyAdapter adapter = new MyAdapter();vpPdf.setAdapter(adapter);}class MyAdapter extends PagerAdapter {@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic int getCount() {return mRenderer.getPageCount();}@Overridepublic boolean isViewFromObject(View view, Object object) {return view==object;}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)@Overridepublic Object instantiateItem(ViewGroup container, int position) {View view = mInflater.inflate(R.layout.item_pdf, null);PhotoView pvPdf = view.findViewById(R.id.iv_pdf);pvPdf.setEnabled(true);if (getCount() <= position) {return view;}PdfRenderer.Page currentPage = mRenderer.openPage(position);Bitmap bitmap = Bitmap.createBitmap(1080, 1760, Bitmap.Config.ARGB_8888);currentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);pvPdf.setImageBitmap(bitmap);//关闭当前Page对象currentPage.close();container.addView(view);return view;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {//销毁需要销毁的视图container.removeView((View) object);}}

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

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void closeRenderer() throws IOException {if (mRenderer != null){mRenderer.close();}if (mDescriptor != null){mDescriptor.close();}}

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【React】二次封装Antd的Table组件
  • SQL注释方法 -- 单行注释/多行注释
  • 数据结构(三)循环链表
  • 【数据结构】排序算法大全(快速、堆、归并、插入、折半、希尔、冒泡、计数、基数)各算法比较、解析+完整代码
  • UE4/UE5像素流送云推流:多人访问不稳定、画面糊、端口占用多等
  • 3D Slicer:从入门到精通——数据模块之DICOM
  • 【C语言】结构体内存对齐:热门面试话题
  • day15
  • 百度 提前批 国际化广告部 (深圳-机器学习/数据挖掘/自然语言处理工程师) 一面+二面面经
  • 记录centos中操作(查找、结束、批量)进程以及crontab定时写法的知识
  • 数据库SQL语言实战(十)(最后一篇)
  • c++ set/multiset容器
  • 大数据智慧消防解决方案(24页PPT)
  • 【华为OD机试-C卷D卷-200分】二叉树的广度优先遍历(C++/Java/Python)
  • LLM中的RoPE位置编码代码解析与RoPE的性质分析(一)
  • CAP 一致性协议及应用解析
  • Laravel Mix运行时关于es2015报错解决方案
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • NSTimer学习笔记
  • uni-app项目数字滚动
  • Vim Clutch | 面向脚踏板编程……
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 计算机在识别图像时“看到”了什么?
  • 前端路由实现-history
  • 由插件封装引出的一丢丢思考
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #if #elif #endif
  • (0)Nginx 功能特性
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C语言)fread与fwrite详解
  • (C语言)二分查找 超详细
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (算法)区间调度问题
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转载)hibernate缓存
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET 8 跨平台高性能边缘采集网关
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET是什么
  • @AliasFor 使用
  • @Service注解让spring找到你的Service bean
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [2016.7 day.5] T2
  • [ABC294Ex] K-Coloring
  • [BZOJ1178][Apio2009]CONVENTION会议中心