Android开发之pdf

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/AnalyzeSystem/article/details/51314323

Android手机里面读取显示pdf文件,如果只是简单的开发只需要参考官方提供的simple PdfRendererBasic demo即可。如果你还想支持手势、动画和缩放等高级功能,那么需要用到开源库,网上不错开源的库倒是有几个,稍后再来对比抉择,先来了官方simple PdfRendererBasic,先上效果图

pdf开发三部曲

  • 打开初始化Pdf读取器PdfRenderer

如果你是在Fragment里面使用,最好在onAttach方法初始化

    /**
     * Sets up a {@link android.graphics.pdf.PdfRenderer} and related resources.
     */
    private void openRenderer(Context context) throws IOException {
        // In this sample, we read a PDF from the assets directory.
        mFileDescriptor = context.getAssets().openFd("sample.pdf").getParcelFileDescriptor();
        // This is the PdfRenderer we use to render the PDF.
        mPdfRenderer = new PdfRenderer(mFileDescriptor);
    }
  • 读取内容

传入指定页码,读取内容转换成bitmap图片设置到ImageView

   private void showPage(int index) {
        if (mPdfRenderer.getPageCount() <= index) {
            return;
        }
        // Make sure to close the current page before opening another one.
        if (null != mCurrentPage) {
            mCurrentPage.close();
        }
        // Use `openPage` to open a specific page in PDF.
        mCurrentPage = mPdfRenderer.openPage(index);
        // Important: the destination bitmap must be ARGB (not RGB).
        Bitmap bitmap = Bitmap.createBitmap(mCurrentPage.getWidth(), mCurrentPage.getHeight(),
                Bitmap.Config.ARGB_8888);
        // Here, we render the page onto the Bitmap.
        // To render a portion of the page, use the second and third parameter. Pass nulls to get
        // the default result.
        // Pass either RENDER_MODE_FOR_DISPLAY or RENDER_MODE_FOR_PRINT for the last parameter.
        mCurrentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
        // We are ready to show the Bitmap to user.
        mImageView.setImageBitmap(bitmap);
        updateUi();
    }
  • 关闭Pdf读取器PdfRenderer

PdfRenderer.Page提供了几个方法方便与我们使用,例如getIndex(获取当前页码)、getPageCount(总页码)等。在我们离开pdf展示页面时需要对资源进行释放,关闭Pdf读取器(fragment在生命周期onDetach调用释放关闭),如果你想做的像小说阅读一样,可以记录当前的index方便下次进入直接跳转到指定位置,书签就这个原理

  private void closeRenderer() throws IOException {
        if (null != mCurrentPage) {
            mCurrentPage.close();
        }
        mPdfRenderer.close();
        mFileDescriptor.close();
    }

如果你需要这个simple可以选择官网simple下面下载,如果你不能访问可以选择github上面下载:https://github.com/googlesamples/android-PdfRendererBasic,当然这个simple功能简单并不完善,仅仅实现了pdf简单展示,跟为高级功能我们接着往下看。

github上寻寻觅觅,最终锁定了两个目标

1.PdfViewPager

首先添加项目依赖

compile 'es.voghdev.pdfviewpager:library:0.2.1'

读写网络权限肯定需要的(本地pdf不需要网络),如果是网络pdf文件需要通过RemotePDFViewPager现在远程文件,DownloadFile.Listener回调下载结果,下载成功了需要为RemotePDFViewPager绑定适配器PDFPagerAdapter,在Activity销毁时需要释放PDFPagerAdapter

public class RemotePDFActivity extends AppCompatActivity implements DownloadFile.Listener {

 public void initPdfView(){
   RemotePDFViewPager remotePDFViewPager =
      new RemotePDFViewPager(context, "http://partners.adobe.com/public/developer/en/xml/AdobeXMLFormsSamples.pdf", this);
 }
 @Override
 public void onSuccess(String url, String destinationPath) {
    // That's the positive case. PDF Download went fine

    adapter = new PDFPagerAdapter(this, "AdobeXMLFormsSamples.pdf");
    remotePDFViewPager.setAdapter(adapter);
    setContentView(remotePDFViewPager);
 }

 @Override
 public void onFailure(Exception e) {
    // This will be called if download fails
 }

 @Override
 public void onProgressUpdate(int progress, int total) {
    // You will get download progress here
    // Always on UI Thread so feel free to update your views here
 }
 @Override
 protected void onDestroy() {
    super.onDestroy();

    adapter.close();
 }
}

根据github上面资料介绍,该库支持网络pdf、assets文件下的pdf、SDcard缓存的pdf文件,看上去挺不错的,但是,但是,但是尼玛还是有版本要求(没性趣再看下去了)

2.android-pdfview

这个库才是我的最爱!!同样支持多种方式加载pdf,向下兼容到API8,Configurator提供了builder的方式配置属性,让代码更简洁了,使用时Gradle依赖

compile 'com.joanzapata.pdfview:android-pdfview:1.0.4@aar'

xml布局

<com.joanzapata.pdfview.PDFView
        android:id="@+id/pdfview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

代码调用实例

pdfView.fromAsset(pdfName)
    .pages(0, 2, 1, 3, 3, 3)
    .defaultPage(1)
    .showMinimap(false)
    .enableSwipe(true)
    .onDraw(onDrawListener)
    .onLoad(onLoadCompleteListener)
    .onPageChange(onPageChangeListener)
    .load();

pages和onDraw是可选项,pages:它可以让你过滤和你需要的PDF页面顺序,onDraw:允许您在当前页面画布上画上一个的东西


上面这个库基本能满足我们开发所需了,然而实际项目开发中还会遇到各种问题,待以后项目中用到再来不全,这里只做一个简单纪录吧

猜你喜欢

转载自blog.csdn.net/AnalyzeSystem/article/details/51314323