展示PDF文件——Android/IOS

年后到现在,公司的项目紧,导致年初的计划并没有很好的执行。

最近熬夜越熬越晚,希望6月前能如期完成第一个目标。

今天谈谈直接在代码中加载PDF文件(公司的新需求,就地取材)。

我的需求背景:

1.首先,随着移动端继续侵占PC的场景,手机上阅读越来越普遍,而一些既有的PDF文本也就被希望加载到手机端做友好展示

2.其次,公司新项目的思路是展示型,尽可能减少网络交互(即尽可能少的调用接口获取数据),除了用户反馈、检测更新等,全项目只用了两个接口,大量业务逻辑是通过下载数据库在本地进行操作。因而,PDF文件本地展示也顺应而出

移动端的差异

Android 端和 IOS 端的区别在于,

1.优点:

Android端 :提供了丰富的接口,足以进行良好的用户交互

IOS端 : 调用简单,方法上大致有三种实现,最简单的就是用UIWebView直接展示

2.缺点:

Android端 : 调用麻烦,google相关服务无法调用,逼迫android端采用第三方库加载(或者自己写。。。),同时,因为集成了第三方库的项目会变得相当庞大,打包后大小增加15M左右。

IOS端 : 自定义麻烦,想要友好的交互需要手动修改,尤其是想要PageController的翻页效果,需要自己封装



下面进入代码主题

1.先上Android端:

github上 AndroidPdfViewer 的star 较多,故选了这个

项目地址:

https://github.com/barteksc/AndroidPdfViewer

首先, 在Gradle中添加依赖

 compile ‘com.github.barteksc:android-pdf-viewer:2.5.0‘

其次,xml布局文件

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

最后,代码调用:

 PDFView mPdfView = (PDFView) view.findViewById(R.id.pdf_fragment);
 mPdfView.fromAsset("sample.pdf")
                .defaultPage(0)//默认页
                .enableSwipe(true)//允许拖动
                .swipeHorizontal(false)//默认方向是竖轴的,改为true变为横轴
                .enableDoubletap(true)//允许双击放缩
                .onPageChange(this)//设置页码切换监听
                .load();

监听回调代码,(这里我用来记录用户上次浏览的页面)

    private int pdf_book_mark = 0;//定义默认的页码

    @Override
    public void onStop() {
        super.onStop();
        //stop 生命周期时 保存该页码到 SharePreference 中
        PreferenceUtil.save(getActivity(), "pdf_book_mark", pdf_book_mark);
    }

   @Override
    public void onPageChanged(int page, int pageCount) {
        LogUtil.i("page = " + page + " , pageCount =" + pageCount);
        pdf_book_mark = page;
    }

  //生命周期恢复展示时,默认加载页码 从SharePreference 中取出来
  private void lastBrowe() {
      ....

      mPdfView.defaultPage(PreferenceUtil.getSharePre(getActivity()).getInt("pdf_book_mark", 0))

      ...
    }

简单写了,看官可以自己尝试更多的UI交互

所有的调用接口如下:

  @Override
    public void onPageChanged(int page, int pageCount) {
        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)
                .onDraw(onDrawListener) // allows to draw something on a provided canvas, above the current page
                .onLoad(onLoadCompleteListener) // called after document is loaded and starts to be rendered
                .onPageChange(onPageChangeListener)
                .onPageScroll(onPageScrollListener)
                .onError(onErrorListener)
                .onRender(onRenderListener) // called after document is rendered for the first time
                .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
                .load();
    }

onPageScroll/ onPageChange/ onRender / password / onDraw

这几个足以定制丰富的场景。详情见 https://github.com/barteksc/AndroidPdfViewer



2.IOS端

我只实现了两种简单的方式,

第三种需要自定义,推荐参考

http://blog.csdn.net/qq_24901135/article/details/46438781

实现方式一 UIWebView:

- (void)viewDidLoad {
    [super viewDidLoad];
    //获取sample.pdf 文件路径(本地)
    NSString *path = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"pdf"];
    //UIWebView 的一般用法
    NSURL *url = [NSURL fileURLWithPath:path];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [self.webview loadRequest:request];
}

这种方式只能浏览,safari是不会让你有更多发挥空间的

实现方式二

首先 .h文件中实现该协议

UIDocumentInteractionControllerDelegate

其次 .m文件

#import "PDFViewController.h"
@interface PDFViewController ()

@property (strong, nonatomic) UIDocumentInteractionController *documentInteractionController;

- (IBAction)open:(id)sender;
- (IBAction)preview:(id)sender;

@end

@implementation PDFViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)open:(id)sender {
    UIButton *button = (UIButton *)sender;
    NSURL *URL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"pdf"];

    if (URL) {
        // Initialize Document Interaction Controller
        self.documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:URL];

        // Configure Document Interaction Controller
        [self.documentInteractionController setDelegate:self];

        // Present Open In Menu
        [self.documentInteractionController presentOpenInMenuFromRect:[button frame] inView:self.view animated:YES];
    }

}

- (IBAction)preview:(id)sender {
    NSURL *URL = [[NSBundle mainBundle] URLForResource:@"sample" withExtension:@"pdf"];

    if (URL) {
        // Initialize Document Interaction Controller
        self.documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:URL];

        // Configure Document Interaction Controller
        [self.documentInteractionController setDelegate:self];

        // Preview PDF
        [self.documentInteractionController presentPreviewAnimated:YES];
    }

}

#pragma document
-(UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller{
    return self;
}

@end

这种方式能在View上层再开启一层展示PDF,同时带有一些UI交互可以操作。



大致如此。忙里偷闲,效果图晚上再贴。

明天愚人家,各位千万不要相信公司说加班的伎俩。

祝,四月愉快!

时间: 2024-08-03 16:42:27

展示PDF文件——Android/IOS的相关文章

在浏览器中使用JS打开并展示PDF文件

使用jquery.media.js插件 示例: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta content="IE=7.0000" http-equiv="X-UA-Compatible"/> <title>pdf阅读</title> <script type=&

Android开发笔记(一百四十一)读取PPT和PDF文件

读取ppt文件 读取纯文本 上一篇博文讲到在Android上如何读取word文件内容,那么office三剑客中还剩ppt文件的读取.前面解析word文件和excel文件时,都用到了poi库读取文件内容,对于ppt一样也可以通过poi读取幻灯片中的文本.HSLFSlideShow类就是poi中专门用于解析幻灯片的工具类,每张幻灯片又分别由单独的HSLFSlide类处理,幻灯片中的具体图文内容则由HSLFTextParagraph和HSLFTextRun进行分辨. 下面是使用poi解析ppt文件(2

Android 如何本地加载pdf文件

大部分app打开pdf文件是通过intent调起手机中能打开pdf文件的工具,来查看pdf文件,如果需求是,用户在app内下载好pdf文件后,不通过第三方的工具,本地打开. 这样的需求要怎么实现呢?上网查了一些资料,发现了一个很好用PDF开源库. 使用起来也很简单,首先添加PDFView的引用 compile 'com.github.barteksc:android-pdf-viewer:2.4.0' 布局中引用PdfView <LinearLayout xmlns:android="ht

IOS加载PDF文件

今天的任务是:在iOS上加载显示pdf文件. 方法一:利用webview [cpp] view plaincopy -(void)loadDocument:(NSString *)documentName inView:(UIWebView *)webView { NSString *path = [[NSBundle mainBundle] pathForResource:documentName ofType:nil]; NSURL *url = [NSURL fileURLWithPath

iOS:quartz2D绘图(在PDF文件上绘制图片)

quartz2D还可以在PDF文件上绘制图片,它有自己的PDF Graphics Context上下文,通过UIGraphicsBeginPDFContextToFile方法开始上下文后就可以绘制图片了,最后记得使用UIGraphicsEndPDFContext()方法结束上下文.绘制pdf时,既可以绘制单页pdf,也可以绘制多页pdf成一本书,在绘制开始时,使用UIGraphicsBeginPDFPage()开始新的一页这是非常重要的.下面演示绘制单页pdf和多页的pdf. 具体的实例如下:

转:?Android IOS WebRTC 音视频开发总结 (系列文章集合)

随笔分类 - webrtc Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:blackerteam 或 webrtcorgcn). callstats是一家做实时通讯性能测阅读全文 posted @ 2016-07-22 08:24

java代码编辑器 pdf文件预览 主流SSM 代码生成器 shrio redis websocket即时通讯

A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块 C 集成阿里巴巴数据库连接池druid  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩展性.稳定性和性能方面都有明显的优势 D 集成安全权限框架shiro   Shiro 是一个用 Jav

推荐下载App,如果本地安装则直接打开本地App(Android/IOS)

推荐下载App,如果本地安装则直接打开本地App(Android/IOS) - 纵观现在每家移动网站,打开首页的时候,都有各种各样的形式来提示你下载自身的移动App(Android/IOS),这是做移动客户端产品的一个很好地引流的手段.当然各家引流下载的交互和视觉各不相同,有的是完全“强奸”用户,有的是完全取悦用户.但是最终的形式就是你点击一个按钮之后,可以去下载对应的App(Android直接下载对应的Apk文件,IOS会跳转到App store的对应地址). 之前开发这个需求的时候,就是很简

将pdf文件转换成ppt需要注意哪些问题

作为一名办公室文员,经常会遇到文件格式转换之类的事情,有时候是处于编辑的需要,有时候是出于展示的需要.迅捷PDF转换器是是一款专业的文件格式转换工具,这是国内唯一一款具备专业水准的PDF转换工具,采用了新一代的PDF超线程解析核心技术.软件完全独立安装,不依赖于Adobe Acrobat,Acrobat Reader 软件,因此软件的执行效率更高,转换效果更好,使用起来也更为简单.也正是由于迅捷PDF转换成Word转换器采用了独家研发的PDF文件内容解析技术,因此能够更好地实现PDF文件内容的转