一.代码

二.效果图

三.实现

  • 准备

    • build.gradle

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

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

      Android10以上版本要在application中增加

      1
      android:requestLegacyExternalStorage="true"

      否则READ_EXTERNAL_STORAGE权限无效

  • 实现

    • 布局

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
         <?xml version="1.0" encoding="utf-8"?>
      <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/activity_main"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical">

      <com.github.barteksc.pdfviewer.PDFView
      android:id="@+id/pdfView"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>

      </FrameLayout>
    • java

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      PDFView.Configurator configurator;
      public void LoadFile(){
      File newFile = new File(Path);
      File newFile_ = new File(Path_);
      if(newFile!=null && newFile.exists() && newFile.canRead()){
      configurator = pdfView.fromFile(newFile);
      }else if(newFile_!=null && newFile_.exists() && newFile.canRead()){
      configurator = pdfView.fromFile(newFile_);
      }else{
      configurator = pdfView.fromAsset("TWPDF.pdf");
      }
      showPDFUI();
      }

      ...

      /**
      * .pages(0, 2, 1, 3, 3, 3) // 默认显示所有页面
      * .enableSwipe(true) // 允许使用滑动来阻止改变页面
      * .swipeHorizontal(false) //是否横向滑动显示
      * .enableDoubletap(true)
      * .defaultPage(0) //默认进入的页面
      * // 允许在当前页面上画一些东西,通常在屏幕中间可见
      * .onDraw(onDrawListener)
      * // 允许在所有页面上画一些东西,单独为每一页。仅对可见页面调用
      * .onDrawAll(onDrawListener)
      * .onLoad(onLoadCompleteListener) // 加载文档并开始呈现后调用
      * .onPageChange(onPageChangeListener)
      * .onPageScroll(onPageScrollListener)
      * .onError(onErrorListener)
      * .onPageError(onPageErrorListener)
      * .onRender(onRenderListener) // 第一次呈现文档后调用
      * // 点击一次调用,如果已处理则返回true,如果切换滚动句柄可见性返回false
      * .onTap(onTapListener)
      * .onLongPress(onLongPressListener)
      * .enableAnnotationRendering(false) // 呈现注释(例如注释、颜色或表单)
      * .password(null)
      * .scrollHandle(null)
      * .enableAntialiasing(true) // 在低分辨率屏幕上改进渲染
      * // dp中页面之间的间距。要定义间距颜色,设置视图背景
      * .spacing(0)
      * .autoSpacing(false) // 添加动态间距以适应屏幕上的每个页面
      * .linkHandler(DefaultLinkHandler)
      * .pageFitPolicy(FitPolicy.WIDTH) // 模式以适应视图中的页面
      * .fitEachPage(false) // 将每个页面适应于视图,否则较小的页面相对于最大的页面缩放
      * .pageSnap(false) // 将页面对齐到屏幕边界
      * .pageFling(false) // 在ViewPager这样的单一页面上做一个短暂的改变
      * .nightMode(false) // 切换夜间模式
      */
      private void showPDFUI(){
      configurator.enableSwipe(true)
      .swipeHorizontal(true)
      .enableDoubletap(false)
      .fitEachPage(false)
      .autoSpacing(true)
      .pageFitPolicy(FitPolicy.WIDTH)
      .onLoad(new OnLoadCompleteListener() {
      @Override
      public void loadComplete(int nbPages) {
      }
      })
      .onPageChange(new OnPageChangeListener() {

      @Override
      public void onPageChanged(int page, int pageCount) {
      mPageCount = pageCount;
      mPpagerIndex = page;
      }
      })
      .enableAnnotationRendering(false)
      .password(null)
      .scrollHandle(null)
      .enableAntialiasing(true)
      .spacing(0)
      .pageSnap(true)
      .nightMode(true)
      .load();
      }

跳转至指定页面的方法

1
2
3
4
5
6
7
/**
* Go to the given page.
*
* @param page Page index.
*/
public void jumpTo(int page, boolean withAnimation) {
}