移动端实现PDF文件阅读的方法

前言:

咱们知道,Android系统自己不具有打开PDF文件的能力,所以在Android 要实现 PDF 阅读功能须要借助于第三方工具,通常而言有如下方案:javascript

  • 使用GoogleDocs提供的在线PDF阅读功能
  • 使用第三方应用阅读本地PDF文件
  • 使用PDFBox读取编辑PDF文件内容
  • 集成第三方SDK,实现本地阅读
  • 集成Mozilla的PDF.js,在 WebView 中阅读PDF文件
  • 使用 pdf2htmlEX 将PDF 文件转换成 HTML 或者图片

一. 使用GoogleDocs提供的在线PDF阅读功能

GoogleDocs 提供了多种文本格式的阅读能力,咱们只需经过 Android 的 WebView 便可实现打开在线 PDF 文档,代码以下所示:css

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://10.200.180.50/dilan/carfree/downLoad/test.pdf");
}

然而这种方案的缺陷一样明显:html

  • 不支持阅读本地PDF文件;
  • 国内一般状况下访问不了 Google 提供 的服务。

 

二. 使用第三方应用阅读本地PDF文件

用户手机中或多或少会装有一些带有PDF文件阅读功能的应用,例如WPS、Chrome、UC浏览器等,此时咱们能够借助于这些应用达到打开PDF文件的效果,只须要具有如下两个条件:前端

  • PDF 文件已保存在本地;
  • 用户手机中安装了支持 PDF 阅读的应用。

实现这个方案的代码示例以下:java

public void openPdfFile(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");
    startActivity(Intent.createChooser(intent, "打开PDF文件"));
}

 

三. 使用PDFBox读取编辑PDF文件内容

PDFBox(一个BSD许可下的源码开放项目)是一个为开发人员读取和建立PDF文档而准备的纯Java类库。它提供以下特性: 提取文本,包括Unicode字符,和Jakarta Lucene等文本搜索引擎的整合过程十分简单;加密/解密PDF文档;从PDF和XFDF格式中导入或导出表单数据;向已有PDF文档中追加内容;将一个PDF文档切分为多个文档;覆盖PDF文档等。下载地址点击这里android

1. 读取PDF内容

1     public void readPDF() {
 2         PDDocument helloDocument = null;
 3         try {
 4             helloDocument = PDDocument.load(new File(
 5                     "User/fqian/download/test.pdf"));
 6             PDFTextStripper textStripper = new PDFTextStripper("GBK");
 7             System.out.println(textStripper.getText(helloDocument));
 8 
 9             helloDocument.close();
10         } catch (IOException e) {
11             // TODO Auto-generated catch block
12             e.printStackTrace();
13         }
14     }

这种方式容许你读取PDF文件的内容,然后进行多种形式的展现,缺点也很明显,就是会失去原有的排版样式;c++

2. 将PDF文件转换为图片

1 public void convert2Image() {
 2     try {
 3         PDDocument doc = PDDocument
 4                 .load("User/fqian/download/test.pdf");
 5         int pageCount = doc.getPageCount();
 7         List pages = doc.getDocumentCatalog().getAllPages();
 8         for (int i = 0; i < pages.size(); i++) {
 9             PDPage page = (PDPage) pages.get(i);
10             BufferedImage image = page.convertToImage();
11             Iterator iter = ImageIO.getImageWritersBySuffix("jpg");
12             ImageWriter writer = (ImageWriter) iter.next();
13             File outFile = new File("User/fqian/download/"
14                     + i + ".jpg");
15             FileOutputStream out = new FileOutputStream(outFile);
16             ImageOutputStream outImage = ImageIO
17                     .createImageOutputStream(out);
18             writer.setOutput(outImage);
19             writer.write(new IIOImage(image, null, null));
20         }
21         doc.close();
23     } catch (FileNotFoundException e) {
24         // TODO Auto-generated catch block
25         e.printStackTrace();
26     } catch (IOException e) {
27         // TODO Auto-generated catch block
28         e.printStackTrace();
29     }
30 }

这种方式避免了直接读取文件内容再进行显示形成的样式缺失问题,可是当文件体积较大时,生成的图片所占空间也随之暴涨,所以客户端进行请求时面对的加载时间和流量耗费问题是比较尴尬的。git

 

四. 集成第三方SDK,实现本地阅读

事实上,已经存在了为数很多的免费或者付费的 PDF SDK,通常而言免费版在功能和性能等指标上与收费版可能存在必定差距。这种方式的优势是加载速度快和节约流量,缺点是会显著的增长安装包大小,例如 AndroidPdfViewer 的引入,剔除不经常使用的处理器架构,只保留 armeabi-v7ax86,仍是会增长将近 10M 的大小。github

免费版:

  • PDFium:Google 和 Foxit 合做开源的 Foxit 的 PDF 源码,做为 Chrome 浏览器的 PDF 渲染引擎组件,固然这是 C/C++ 实现的;
  • PdfiumAndroid:mshockwave 基于 PDFium 基础上适配 Android 平台的函数库;
  • AndroidPdfViewer:barteksc 基于 PdfiumAndroid 基础上实现的一个 PDF 阅读 Demo,支持常见的手势,缩放,双击等效果。
  • MuPDF: 一个轻量级的 开源 PDF 和 XPS 查看器

付费版:

  • Foxit 福昕 SDK:国内老牌的付费 PDF SDK,功能强大,若是 PDF 阅读功能在你的应用中比较经常使用但又不是核心功能,能够考虑接入它;
  • PlugPDF:国外的一款付费 PDF SDK,相似 Foxit SDK;

 

五. 集成Mozilla的PDF.js,在 WebView 中阅读PDF文件

PDF.js 是由Mozilla 主导推出的能够将PDF文件转换为H5页面进行展现的工具,有服务端和客户端两种集成方式来实如今 WebView 中打开 PDF 文件的功能。关于更多PDF.js的官方描述,请点击这里web

1. 服务端方式

PDF.js 提供了一套较完善的在 H5 页面中阅读 PDF 的方案,同时支持 Web 前端,Android 和 iOS WebView 加载。服务部署起来应该也比较简单,大体的方案以下:

  • 服务段建立一个HTML页面,该页面使用<iframe>标签来加载“generic/web/viewer.html?file={文件路径}”页面,此时 PDF.js 会负责将 PDF 渲染出来;
  • 客户端获取到HTML页面对应的URL;
  • 客户端经过 WebView 加载该页面。

更具体的方案须要服务端开发人员自行商议决定,大体流程点击这里

2. 客户端方式

PDF.js 也支持客户端集成方式,客户端须要把官方提供的 pdf.jspdf.worker.js 拷贝到工程的 assets 目录,同时在该目录下实现一个离线 H5 页面,该页面经过上述两个 js 文件实现 PDF 的阅读。该方案的缺点主要有三个:

  • 客户端起码增长 1~2M 的体积;
  • H5 页面的交互和设计须要从新实现,这部分的工做量就比较可观了;
  • 加载体积较大的PDF文件时耗时较长。

 

六. 使用 pdf2htmlEX 将PDF 文件转换成 HTML 或者图片

pdf2htmlEX 是由国内王路同窗发布的,能够实现绝大部分PDF文件转换为HTML文件的操做,服务端经过调用命令行预先将PDF文件转换为HTML文件,然后向客户端暴露URL,客户端经过WebView的方式加载便可。官方预览点击这里

1. 安装(官方安装指南请点击这里

pdf2htmlEX只能部署于类Unix环境,具体支持的系统环境列表以下:

  • Linux (for Ubuntu 12.10+)
  • OS X
  • Windows/Cygwin
  • Windows/Mingw-w64
  • Windows/MinGW, 须要对pdf2htmlEX作出部分修改. 详情请点击这里pdf2htmlEX on TeX Wiki (in Japanese) Ps.日语很差的同窗请增强学习......

Mac OS X

官方推荐使用brew来安装,安装完brew后可使用如下命令安装 pdf2htmlEX:

brew install pdf2htmlEX

Windows

在Windows下安装pdf2htmlEX,须要借助于MSYS2 + mingw-w64,具体流程点击这里

Fedora

在Fedora发行版本下须要添加以下依赖:

sudo yum install  cmake gcc gnu-getopt java-1.8.0-openjdk libpng-devel fontforge-devel cairo-devel poppler-devel libspiro-devel freetype-devel  poppler-data libjpeg-turbo-devel git make gcc-c++

2. 使用(官方使用指南请点击这里)

(1). 简单的转换为HTML

pdf2htmlEX --zoom 1.3 pdf/test.pdf

会在当前目录生成一个同名的HTML文件

  • zoom:表示缩放 后面的数字就是缩放比例,数字越小,生成的HTML显示界面越小,可是自己的bytes大小不受影响
  • pdf/test.pdf:是文件路径,相对于当前目录的路径
pdf2htmlEX -f 3 -l 5 --fit-width 1024 --bg-format jpg pdf/test.pdf
  • f:起始页码
  • l:结束页码
  • fit-width:页面宽度
  • bg_format: 背景图片格式

 

(2). 转换为复杂的目录(包含HTML,CSS,IMGS,FONTS)

pdf2htmlEX --embed cfijo --dest-dir out pdf/test.pdf

会在指定目录生成一个同名的html文件及附带的资源文件,各种资源文件(例如fonts、imgs、css和javascript)分别存储在不一样目录,这样展现界面能够更好的利用浏览器缓存的优点

  • embed cfijo:没有实际意义,是自己命令,不须要修改
  • out:自定义文件夹名称,全部的转换的文件都生成在此目录
  • pdf/test.pdf:源pdf文件
pdf2htmlEX --embed cfijo --split-pages 1 --dest-dir out --page-filename test-%d.page pdf/test.pdf

效果同上面的命令相似,可是会将每页分别存储于单独的文件目录,这些目录将会按照命令中的规则那样会被分别命名为test-0.page, test-1.page等等。同事依然会有一个同名HTML文件经过ajax动态加载页面,经过这种方式,发布者能够得到足够的权限去自由控制页面,例如延迟加载。

除了以上的命令之外,还有不少实用方式,好比截取片断转换、修改像素等,这里再也不赘述,感兴趣的能够去官网查看。

相关文章
相关标签/搜索