本人Android萌新, 因为最近需求.需要将PDF文件渲染到Android应用中进行展示.,于是马上去寻找解析PDF的库;第一条展示的就是 : Android PdfViewer:

github地址:

https://github.com/barteksc/AndroidPdfViewer

打开官网看见这一坨代码:

pdfView.fromUri(Uri)
or
pdfView.fromFile(File)
or
pdfView.fromBytes(byte[])
or
pdfView.fromStream(InputStream) // stream is written to bytearray - native code cannot use Java Streams
or
pdfView.fromSource(DocumentSource)
or
pdfView.fromAsset(String).pages(0, 2, 1, 3, 3, 3) // all pages are displayed by default.enableSwipe(true) // allows to block changing pages using swipe.swipeHorizontal(false).enableDoubletap(true).defaultPage(0)// allows to draw something on the current page, usually visible in the middle of the screen.onDraw(onDrawListener)// allows to draw something on all pages, separately for every page. Called only for visible pages.onDrawAll(onDrawListener).onLoad(onLoadCompleteListener) // called after document is loaded and starts to be rendered.onPageChange(onPageChangeListener).onPageScroll(onPageScrollListener).onError(onErrorListener).onPageError(onPageErrorListener).onRender(onRenderListener) // called after document is rendered for the first time// called on single tap, return true if handled, false to toggle scroll handle visibility.onTap(onTapListener).onLongPress(onLongPressListener).enableAnnotationRendering(false) // render annotations (such as comments, colors or forms).password(null).scrollHandle(null).enableAntialiasing(true) // improve rendering a little bit on low-res screens// spacing between pages in dp. To define spacing color, set view background.spacing(0).autoSpacing(false) // add dynamic spacing to fit each page on its own on the screen.linkHandler(DefaultLinkHandler).pageFitPolicy(FitPolicy.WIDTH) // mode to fit pages in the view.fitEachPage(false) // fit each page to the view, else smaller pages are scaled relative to largest page..pageSnap(false) // snap pages to screen boundaries.pageFling(false) // make a fling change only a single page like ViewPager.nightMode(false) // toggle night mode.load();

我就知道我找对了[手动滑稽];从上面的代码可以看出来,我们获取这个组件,通过代码链的形式来配置一系列参数,最后通过load()加载就可以了,真的十分的amaze呀!!!

那么废话不多说我们的直接根据他的文档介绍来完成我们的需求:

需求:添加,渲染PDF文件,并且能够像ViewPage一样滑动;

总共分为三步:

  1. 初始化项目,布局页面
  2. 将PDF添加到页面中
  3. 调整PDF展示效果,最终达到我们想要的效果;

那么第一步:既然要用我们的外部库,那么就需要引入我们的依赖:

implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'

implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'

这里有的两个版本,第一个3.2.0-beta.1是目前最新的版本,我们导入这个依赖就可以了,下面的2.8.2的版本,那么是目前比较稳定的版本,但是功能似乎没有3.2.0-beta全面,所以我不考虑使用;并且为了我们开发方便这里我开启了 ViewBinding;

viewBinding {enabled = true}implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'

项目同步成功之后我们还需要添加两个权限:用于读写文件

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

当然如果我们Android版本高于6.0,那么还需要动态申请权限,这一步我们拿到第二步来完成;如果以上步骤都已经完成了,那么恭喜你可以引入我们的PDF文件了:

引入文件非常简单,我们只需要在项目的main目录下创建一个assets目录,并且将我们需要PDF文件复制进去即可,就像这样:

文件导入成功我们开始写页面布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><com.github.barteksc.pdfviewer.PDFViewandroid:id="@+id/pdf_view"android:layout_width="match_parent"android:layout_height="match_parent"/><Buttonandroid:id="@+id/show_pdf"android:text="展示PDF文件"android:background="@drawable/btn_back"android:textColor="#fff"android:layout_margin="10dp"android:layout_gravity="bottom|right"android:padding="6dp"android:layout_width="70dp"android:layout_height="70dp"/>
</FrameLayout>

按钮背景:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><corners android:radius="100dp"/><solid android:color="#666"/>
</shape>

这里我们采用帧布局的形式,页面也很简单,我解释一下,我们先加上PDFView(这个就是放置PDF的容器)然后宽高占满父布局,然后放置一个按钮在这个容器的上面,这个按钮固定在右下角;简单的布局就完成了;

那么开始第二步:第二步事件我们的PDF文件读取到Android并且渲染到屏幕上,那么Android PdfViewer为我们提供了以下几种读取文件的方法:

pdfView.fromUri(Uri)
pdfView.fromFile(File)
pdfView.fromBytes(byte[])
pdfView.fromStream(InputStream)
pdfView.fromAsset(String)

我们发现它能够通过URL , 文件 , 流等形式来读取PDF文件之外,它居然提供了fromAsset()这个方法,没错就是你想的那样,这个方法能够直接读取我们Asset目录下的文件;我们直接传入文件名字即可;这样我们读取PDF文件就非常简单了;

//先声明变量
private ActivityMainBinding mActivityMainBinding;
private static final int REQUEST_EXTERNAL_STORAGE = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mActivityMainBinding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(mActivityMainBinding.getRoot());getPermission();mActivityMainBinding.showPdf.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mActivityMainBinding.pdfView.fromAsset("data.pdf").load();}/*** 权限列表的*/private static String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};/*** 获取动态权限*/public void getPermission() {int hasWriteContactsPermission = ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_EXTERNAL_STORAGE);if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {if (!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.READ_EXTERNAL_STORAGE)) {Log.d("yx", "get permission");ActivityCompat.requestPermissions(MainActivity.this,PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);}Log.d("yx", "get permission2");ActivityCompat.requestPermissions(MainActivity.this,PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);}Log.d("yx", "wait for PERMISSION_GRANTED");while ((ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_EXTERNAL_STORAGE)) != PackageManager.PERMISSION_GRANTED) {}Log.d("yx", "wait for PERMISSION_GRANTED finish");}@Overrideprotected void onResume() {/*** 设置为横屏*/if(getRequestedOrientation()!= ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}super.onResume();}

这里有点长,但总体完成的工作不多,首先我们初始化了ViewBindiing对象,并且调用了getPermission这个的方法,这个方法就是我前面说的动态的申请权限了,传入一个权限列表,系统会向用户申请权限列表中的权限,直接拿来复制使用即可(我也是复制的doge);下面重写onResume()方法,目的是为了屏幕能够强制横向;

重头戏在下面,我们为按钮设置了一个点击监听,在回调接口中我们写入加载PDF文件的代码,看起来是非常的简单,但是此时我们运行程序,然后点击按钮就能够成功加载PDF了;但是看起来展示的效果不尽人意;

那么光速进入我们的第三步:接下来我们调整PDF展示的格式,还记得上面那一坨代码吗?里面展示了各种配置方法,我们传入参数就可展示效果 . 那么还记得我们需求吗?PDF要像ViewPage那样展示;并且能够适应屏幕:

首先我们屏幕需要滑动:

enableSwipe(true) //控制屏幕滑动,默认为true能够滑动
为了防止用户双击方法,我们需要禁用双击:
enableDoubletap(false) //禁用双击,默认为true,可以双击

想让页面能够像ViewPage一样滑动(官方文档也有介绍):

swipeHorizontal(true) //开启横向滑动 因为我们强制横屏
pageSnap(true) //启动页面捕捉
autoSpacing(true) //自动间距
pageFling(true) //开启翻页

最后我们想要PDF文档能够适应屏幕大小:

pageFitPolicy(FitPolicy.WIDTH) //控制PDF文件适配模式 有以下三种模式
  1. WIDTH : 最宽页面的宽度等于屏幕宽度;
  2. HEIGHT : 最高页面的高度等于屏幕高度
  3. BOTH  : 基于最宽和最高的页面,每个页面都被缩放以在屏幕上完全可见

这里我就直接翻译过来的,怕解释错误,我的理解就是一个以高为主,一个以宽为主,一个则自适应;那么了解完所有配置方法之后我们来改进代码:

mActivityMainBinding.pdfView.fromAsset("data.pdf")//启用滑动.enableSwipe(true)//禁用双击.enableDoubletap(false).swipeHorizontal(true).pageSnap(true).autoSpacing(true).pageFling(true).pageFitPolicy(FitPolicy.BOTH) .load();

我们按照上面的方法进行配置,适配我选择的BOTH模式,最后别忘记了.load()进行加载;那么整个项目我们就完成了;对我来说还是一次非常不错的体验;毕竟又学到了很多东西;(尤其是看文档这一块的);当然PDFviewer还有很多配置的方法我没有见到,大家可以去github官网去逐一 的体验,这里就不过多的赘述了;

最终的效果:

第一次写博客,不足的地方请多多包含,有错误的地方请在评论区指正,本人Android开发入门,还需多多学习,希望大佬们不要嫌弃;

这里也提前祝大家新春快乐,感谢!

Android使用PDFviewer渲染PDF文件相关推荐

  1. android 在线预览pdf文件

    android原生webView不支持预览pdf文件,ios却可以,所以android想要实现在线预览webView要通过其他方法,有以下几种方法: 1.andorid原生自带的pdf管理库,主要提供 ...

  2. android中打开查看pdf文件可用mupdf

    项目中用到过mupdf第三方库来开发android应用直接打开pdf文件的功能,为了更多的了解mupdf库上网找资料发现一篇个人文章写的还不错,拿来记录一下: 一时兴起 因为自己前段时间一直在做故事会 ...

  3. android APP内显示PDF文件

    android APP内显示PDF文件 最近公司要做一个小功能,显示在APP内部显示pdf文件,刚接到任务感觉非常简单的一小功能,做的时候才发现在真的很不好实现. 因为android的webView与 ...

  4. Android 使用PdfDocument生成PDF文件及遇到的问题

    一.PdfDocument使用 PdfDocument是Android原生的生成pdf文件的类,这个类的使用可参考: https://developer.android.google.cn/refer ...

  5. 关于Android 在线预览PDF文件

    本篇文章大部分为转载内容,不过最后有我自己使用后的小总结,原文地址:https://www.jianshu.com/p/9e3ff8385e6f Android PdfViewer: 项目地址: ht ...

  6. android 在线预览pdf文件(目前最全)

    android原生webView不支持预览pdf文件,ios却可以,所以android想要实现在线预览webView要通过其他方法,有以下几种方法: 一.andorid原生自带的pdf管理库,主要提供 ...

  7. Android在线预览pdf文件的几种方式

    Android原生WebView不支持预览pdf文件,ios却可以,所以Android想要实现在线预览WebView要通过其他方法,有以下几种方法: 第一种方式: andorid原生自带的pdf管理库 ...

  8. android打开教程,Android 打开网络上pdf文件

    1.基本思路: 打开网络pdf 思路整体还是来源与图片的加载. android中加载网络图片的框架有很多个.如image-laoder, fresco.glide等,首先都是从内存中找图片,如果内存中 ...

  9. Android 打开网络上pdf文件

    之前写过一篇Android打开本地pdf文件的文章,最后总结的时候说,后面一定要拓展库,让其也能打开网络的的pdf文件.今天终于可以兑现承诺了.frok一份代码https://github.com/J ...

  10. Android环境下生成PDF文件

    一.背景 公司需要一个从本地选择图片生成pdf文件并上传的功能,由于Android本身并没有对pdf的支持,这里选择使用一个第三方的库来达成需求. 二.库的选择 2.1 当前主流的库 在众多Java语 ...

最新文章

  1. 算法---------前 K 个高频元素(Java版本)
  2. Base64转文件,图片
  3. 2018.10.30-dtoj-4008-纸牌游戏(cards)
  4. 青龙羊毛——灰兔掌赚吹牛逼
  5. 机器学习算法基础——机器学习概述
  6. Java接受带文件的表单_Javaweb使用getPart接收表单文件过程解析
  7. Ubuntu16.04下面壁纸切换软件variety设置
  8. linq 查询的结果会开辟新的内存吗?
  9. [洪流学堂]Hololens开发入门篇1之模拟器开发环境配置
  10. asp.net页面中Menu控件下拉菜单被frame挡住和iframe自适应高度的解决办法
  11. shell脚本中,for的用法
  12. 【CTF】关于md5总结
  13. 第六章 PCB 的 DRC 检查、拼版设计及资料输出
  14. 【蓝牙】室内外定位技术-钛斗™星地融合定位系统
  15. 蓝奏云软件库源码分享下载(后端源码)
  16. php伪协议xss,XSS漏洞学习
  17. 短期连载 第1回 万代南梦宫工作室动画的流派 BNS动作捕捉汐留工作室的采访
  18. sourceTree 完全卸载
  19. 《战争通论》详细分析世界十大兵书…
  20. PCB抗干扰设计原则(转)

热门文章

  1. java反射基础_Java反射基础 - havie的笔记 - 记笔记 - 私塾在线 - 只做精品视频课程服务...
  2. Citrix XenApp 6.5客户端自动下载(无需从官网下载)
  3. oracle中怎么sqlprompt,oracle提示符sqlprompt
  4. 2022电工杯AB题思路分析
  5. 毕设项目系列教程-智慧校园管理系统
  6. linux文件系统目录操作实验报告,Linux操作系统实验报告
  7. RIPv2的认证(Enabling RIPv2 Autherization)
  8. 基于基因数据的神经网络模式分类研究
  9. 【转载】google搜索从入门到精通
  10. python 表白程序代码_程序员如何实现表白代码