美文网首页安卓Android开发Android 进阶篇
第五章 Android加载PDF文件的使用

第五章 Android加载PDF文件的使用

作者: 忆念成风 | 来源:发表于2017-11-02 16:29 被阅读2656次

    1. Android 加载PDF

      早上看到的Android加载PDF的一个要求,然后想起之前看到过有这么个例子。github上已经开源了,一个第三方的依赖库。开源很久了,使用起来比较稳定。这里记录下。

    1.1 PDF View的使用

    1. 首先我们需要加载依赖库
        compile 'com.joanzapata.pdfview:android-pdfview:1.0.4@aar'
    
    1. 创建本地文件assets,存放本地的文件 sample.pdf。这里先只讲一下本地的,在线的稍后再提。
    image.png
    1. 在layout文件中编写布局文件
     <com.joanzapata.pdfview.PDFView
                 android:id="@+id/pdfview"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent" />
    
    
    1. 在代码中引用

    例子中的模板是这样的

      pdfView.fromFile(file)   //设置pdf文件地址
                    .defaultPage(1)         //设置默认显示第1页
                    .onPageChange(this)     //设置翻页监听
                    .onLoad(this)           //设置加载监听
                    .onDraw(this)            //绘图监听
                    .showMinimap(false)     //pdf放大的时候,是否在屏幕的右上角生成小地图
                    .swipeVertical( false )  //pdf文档翻页是否是垂直翻页,默认是左右滑动翻页
                    .enableSwipe(true)   //是否允许翻页,默认是允许翻
                    // .pages( 2 , 3 , 4 , 5  )  //把2 , 3 , 4 , 5 过滤掉
                    .load();
    
    
    • pages是可选的,它允许您根据需要过滤和排序PDF的页面
    • onDraw也是可选的,并且允许您在当前页面上方的提供的画布上绘制某些东西
      里面的属性都在代码中有注释,按照你的要求自己定制。

    我代码中的是这样的

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            PDFView pdfView = (PDFView) findViewById(R.id.pdfview);
            // 这个测试例子中,assets目录下sample.pdf
            // 缺省把该pdf定位到第一页。
        pdfView.fromAsset("sample.pdf")
                    .defaultPage(1)
                    .onPageChange(new OnPageChangeListener() {
                        @Override
                        public void onPageChanged(int page, int pageCount) {
                            // 当用户在翻页时候将回调。
                            Toast.makeText(getApplicationContext(), page + " / " + pageCount, Toast.LENGTH_SHORT).show();
                        }
                    }).load();
        }
    }
    
    

    运行效果:

    加载的pdf效果

      加载的pdf文件,来源于 github项目中的文件sample.pdf。我自己下载github项目下来本地编译一直出问题,后面就直接导入依赖库来运行,发现没什么问题。

    开源gitgub地址:https://github.com/JoanZapata/android-pdfview

    2. 注意

      因为看有人评论说项目依赖,或者编译出现问题什么的,然后查看了一下这个开源项目。作者已经在项目里面声明了:



      翻译:您可以在这里找到一个很好的替代品,这是一个依靠Pdfium而不是Vudroid / MuPDF的叉解码PDF文件,允许它使用Apache许可证2.0,这给您更多的自由。
    所以如果出现问题试用下这个。

    github地址:https://github.com/barteksc/AndroidPdfViewer

    下载下来了,编译通过没什么问题。使用起来和上面的差不多。

    1. 导向项目包
    compile 'com.github.barteksc:android-pdf-viewer:2.8.0'
    
    1. 在layout文件创建你的布局文件
       <com.joanzapata.pdfview.PDFView
            android:id="@+id/pdfView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
        />
    
    
    1. 在项目中的编写你的需求,还是在你的assets文件下放一个sample.pdf的文件,在java代码中编写需求
    public class MainActivity extends AppCompatActivity  {
    
        private static final String TAG = "MainActivity.class.getSimpleName()";
    
        public static final String SAMPLE_FILE = "sample.pdf";
    
        private PDFView pdfView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            pdfView = (PDFView)findViewById(R.id.PDFView);
    
            pdfView.fromAsset("sample.pdf")
                    .defaultPage(0)
                    .onPageChange(new OnPageChangeListener() {
                        @Override
                        public void onPageChanged(int page, int pageCount) {
                              setTitle(String.format("%s %s /%s",SAMPLE_FILE,page+1,pageCount));
                        }
                    })
                    .enableAnnotationRendering(true)
                    .swipeHorizontal(false)
                    .spacing(10)
                    .onPageError(new OnPageErrorListener() {
                        @SuppressLint("LongLogTag")
                        @Override
                        public void onPageError(int page, Throwable t) {
                            Log.e(TAG, "onPageError: Cannot load page"+page );
                        }
                    })
                    .load();
    
        }
    
    }
    
    
    运行效果

    3. 其他加载PDF的方式

      Android 系统对PDF的支持并不完美,在实际操作中,我们要想PDF能被好好阅读,需要自己采用一些别的方案。

    3.1 远程加载的方案

      提供一种思路,我们可以在自己的服务器上将PDF作为一个文件放置,然后将服务器上的文件下载到本地,再就是我们将服务器的文件通过上面介绍的方式加载出来。

    3.2 通过在WebView调用GoogleDocs功能

      这种方式使用起来很简单,就和普通的WebView加载Url一样使用,缺点是,因为我们国内目前无法直接访问Google提供的服务,所以仅供参考。

    public void setDocumentPath(final String path) {
        WebView webView = (WebView) findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setPluginsEnabled(true);
        webView.loadUrl("https://docs.google.com/viewer?url=http://www.asce1885.com/cms/wwwroot/ng/downLoad/011615200732.pdf");
    }
    

    3.3 调起第三方支持 PDF 阅读的应用

    前提条件:

    • PDF文件下载到本地
    • 手机中安装了PDF阅读的应用
    public Intent getPdfFileIntent(File file) {
        Intent intent = new Intent("android.intent.action.VIEW");
        intent.addCategory("android.intent.category.DEFAULT");
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        Uri uri = Uri.fromFile(file);
        intent.setDataAndType(uri, "application/pdf");
        return Intent.createChooser(intent, "Open File");
    }
    

    因为这个不是本应用的,所以会跳出本应用,然后跳转到第三方应用中。

    3.4 集成第三方 PDF SDK,在 Native 页面中阅读

      第三方应用商提供一些免费或者收费的SDK来供我们选择和使用,集成第三方的PDF,可以有效的加载PDF等文件,但是功能和性能等指标可能存在很大差异。收费的SDK性能指标可能最优,集成体验好,但是费用高,而且不论收费或者免费,对于安装包的大小会显著增加。目前市场是的主要有:Foxit 福昕 ,PlugPDF,PDFium,PdfiumAndroid,AndroidPdfViewer等。

    3.4 集成PDF.js,然后再在WebView上加载

      我们也可以将PDF文件存放到我们自己的服务器上,将PDF文件通过PDF.js服务端方式 去解析出来 。可以找服务端的同学去完成 ,大致的方案如下:

    • 客户端获取到在线 PDF 的链接
    • 将该链接作为参数,通过 WebView 向服务端的 PDF 服务发起请求
    • PDF 服务将该链接的 PDF 文件下载到服务端缓存目录,并调用 PDF.js 提供的能力将 PDF 渲染出来。

      客户端需要把官方提供的 pdf.js 和 pdf.worker.js 拷贝到工程的 assets 目录,同时在客户端本地实现一个离线 H5 页面,该页面通过上述两个 js 文件实现 PDF 的阅读。H5 页面的交互和设计需要设计师给出来,同时可能需要前端同学实现。

    pdf.js的github地址:https://github.com/mozilla/pdf.js

    3.5 将PDF文件转换成Html或者图片格式等其他方式

      有人提出一种可行性方案就是将PDF文件通过pdf2htmlEX转换成Html格式,然后我们在通过WebView来加载。当然这个在服务端完成,然后将转换的链接地址给移动端。这样就很方便了。当然我们也可以转成别的格式。就只是提供一种思路。具体的话有兴趣自己去琢磨琢磨。

    4. 总结

      各种PDF的选择方式看你的需求是怎样的,根据你的开发实际情况来选择你需要的方式。如果只考虑 PDF 阅读的功能,我们可以考虑调起第三方支持 PDF 阅读的应用这种方法为首选;如果是要查看本地的pdf的话,可以优先考虑PDF.js;如果要考虑在线阅读的话,那就选择服务端实现方案。

    本项目github地址:https://github.com/wangxin3119/PdfDemoView

    参考文章:http://www.jianshu.com/p/1bf49af6584d#fn_lemma_8

    相关文章

      网友评论

        本文标题:第五章 Android加载PDF文件的使用

        本文链接:https://www.haomeiwen.com/subject/savwpxtx.html