Android 在线预览PDF文件

作者: S晔枫 | 来源:发表于2018-01-22 17:29 被阅读3596次

    需求: 最近公司要求项目中增加资料库, 能在线查看pdf格式的文件, 且只能查看不能下载 .
    在网上找了不少文章, 说实话都不是很理想, 要么需要收费, 要么基本都只支持本地查看, 后来果断直接在github搜索, 找到了合适的第三方框架 :

    Android PdfViewer:
    项目地址: https://github.com/barteksc/AndroidPdfViewer
    功能很强大, 使用也比较广, 亲测可以使用.
    唯一的缺点 :添加到项目中 会使apk增加16M, 这是最不能接受的, 故弃用.

    PdfViewPager:
    项目地址: https://github.com/voghDev/PdfViewPager
    可加载assets/SD卡/URL(在线预览) ,(ps: 我目前就是使用的此框架)
    优点: 使用比较方便, 也不大

    使用:

    1. 依赖:

       compile 'es.voghdev.pdfviewpager:library:1.0.3'
      
    2. xml布局 (可根据自己项目, 增减)

       <RelativeLayout xmlns:android="http://schemas.android.com/apk/res  /android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical">
       <RelativeLayout
           android:id="@+id/rl_root"
           style="@style/title_style">
      
           <ImageView
            android:id="@+id/iv_back"
           android:layout_width="wrap_content"
           android:layout_height="match_parent"
           android:layout_centerVertical="true"
           android:paddingLeft="@dimen/value15"
           android:src="@drawable/icon_back" />
      
           <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_centerInParent="true"
           android:text="资料详情"
           android:textColor="@color/color_white"
           android:textSize="16sp" />
      
       </RelativeLayout>
      
       <RelativeLayout
       android:id="@+id/remote_pdf_root"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_below="@id/rl_root">
      
       <es.voghdev.pdfviewpager.library.PDFViewPager
           android:id="@+id/pdfViewPager"
           android:layout_width="match_parent"
           android:layout_height="match_parent" />
      
       </RelativeLayout>
      
       <ProgressBar
       android:id="@+id/pb_bar"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true"
       android:layout_gravity="center" />
      
       </RelativeLayout>
      
    3. activity (注释很详细, 慢慢看)

      public class PDFDatabaseActivity extends BaseActivity implements     DownloadFile.Listener {
      
       private RelativeLayout pdf_root;
       private ProgressBar pb_bar;
       private RemotePDFViewPager remotePDFViewPager;
       private String mUrl = "http://partners.adobe.com/public/developer/en/xml/AdobeXMLFormsSamples.pdf";
       private PDFPagerAdapter adapter;
       private ImageView iv_back;
      
       @Override
       protected void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_database);
       initView();
      
       setDownloadListener();
       }
      
       protected void initView() {
       pdf_root = (RelativeLayout) findViewById(R.id.remote_pdf_root);
       pb_bar = (ProgressBar) findViewById(R.id.pb_bar);
       iv_back = (ImageView) findViewById(R.id.iv_back);
       iv_back.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               finish();
           }
       });
       }
      
       /*设置监听*/
       protected void setDownloadListener() {
       final DownloadFile.Listener listener = this;
       remotePDFViewPager = new RemotePDFViewPager(this, mUrl, listener);
       remotePDFViewPager.setId(R.id.pdfViewPager);
       }
      
       /*加载成功调用*/
       @Override
       public void onSuccess(String url, String destinationPath) {
       pb_bar.setVisibility(View.GONE);
       adapter = new PDFPagerAdapter(this, FileUtil.extractFileNameFromURL(url));
       remotePDFViewPager.setAdapter(adapter);
       updateLayout();
       }
      
       /*更新视图*/
       private void updateLayout() {
       pdf_root.removeAllViewsInLayout();
       pdf_root.addView(remotePDFViewPager, LinearLayout.LayoutParams.MATCH_PARENT,
               LinearLayout.LayoutParams.WRAP_CONTENT);
       }
      
       /*加载失败调用*/
       @Override
       public void onFailure(Exception e) {
         pb_bar.setVisibility(View.GONE);
       ToastUitl.show(this, "数据加载错误");
       }
      
       @Override
       public void onProgressUpdate(int progress, int total) {
       }
       }
      

    希望对大家有所帮助 !

    相关文章

      网友评论

      • f8ae722cf06d:您好,我试了试您说的第二种加载办法,就是你现在项目中正在使用的,发现加载出来的PDF是左右翻页的样式,不是上下翻页,请问可以修改为上下翻页的样式吗,谢谢
      • 活着_1919:频繁调用setDownloadListener查看不同的PDF文件的话会报内存溢出啊
        活着_1919:@S晔枫 哦哦 好吧
        S晔枫:@活着_1919 😳 这个我到没试过,你可以去github上,给作者提问试试😂
      • 梦想_永不止步:能给我发一份这个完整的代码吗 gaoweizhen@163.com 谢谢
      • 善良的小布丁:图片触控异常java.lang.IllegalArgumentException: pointerIndex out of range pointerIndex=-1 pointerCount=1如何解决?
        渐等时间逝去:重写viewpager 系统bug try cath https://blog.csdn.net/zhuwentao2150/article/details/52206524
        S晔枫:抱歉,我没有遇到类似的问题, 希望这个对你有帮助 https://stackoverflow.com/questions/16459196/java-lang-illegalargumentexception-pointerindex-out-of-range-exception-dispat
      • masterjiajiajia:这个是不是支持的安卓版本有要求啊,5.0以下的可以么?
        S晔枫:有要求, 5.0以下不行 only on API 21 or higher
      • eb67a9527cd6:这个库的系统支持呢?有没有什么限制?target
        善良的小布丁:这个里面会有一个图片触控的异常,java.lang.IllegalArgumentException: pointerIndex out of range pointerIndex=-1 pointerCount=1,请问如何解决?
        S晔枫:only on API 21 or higher
      • TastyDeath:PdfViewPager这个不支持Annotation Bookmark这些吧
        S晔枫:主要场景是实现PDF在线预览

      本文标题:Android 在线预览PDF文件

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