咱们知道,Android系统自己不具有打开PDF文件的能力,所以在Android 要实现 PDF 阅读功能须要借助于第三方工具,通常而言有如下方案:javascript
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文件阅读功能的应用,例如WPS、Chrome、UC浏览器等,此时咱们能够借助于这些应用达到打开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(一个BSD许可下的源码开放项目)是一个为开发人员读取和建立PDF文档而准备的纯Java类库。它提供以下特性: 提取文本,包括Unicode字符,和Jakarta Lucene等文本搜索引擎的整合过程十分简单;加密/解密PDF文档;从PDF和XFDF格式中导入或导出表单数据;向已有PDF文档中追加内容;将一个PDF文档切分为多个文档;覆盖PDF文档等。下载地址点击这里。android
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++
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
事实上,已经存在了为数很多的免费或者付费的 PDF SDK,通常而言免费版在功能和性能等指标上与收费版可能存在必定差距。这种方式的优势是加载速度快和节约流量,缺点是会显著的增长安装包大小,例如 AndroidPdfViewer 的引入,剔除不经常使用的处理器架构,只保留 armeabi-v7a 和 x86,仍是会增长将近 10M 的大小。github
PDF.js 是由Mozilla 主导推出的能够将PDF文件转换为H5页面进行展现的工具,有服务端和客户端两种集成方式来实如今 WebView 中打开 PDF 文件的功能。关于更多PDF.js的官方描述,请点击这里。web
PDF.js 提供了一套较完善的在 H5 页面中阅读 PDF 的方案,同时支持 Web 前端,Android 和 iOS WebView 加载。服务部署起来应该也比较简单,大体的方案以下:
更具体的方案须要服务端开发人员自行商议决定,大体流程点击这里。
PDF.js 也支持客户端集成方式,客户端须要把官方提供的 pdf.js 和 pdf.worker.js 拷贝到工程的 assets 目录,同时在该目录下实现一个离线 H5 页面,该页面经过上述两个 js 文件实现 PDF 的阅读。该方案的缺点主要有三个:
pdf2htmlEX 是由国内王路同窗发布的,能够实现绝大部分PDF文件转换为HTML文件的操做,服务端经过调用命令行预先将PDF文件转换为HTML文件,然后向客户端暴露URL,客户端经过WebView的方式加载便可。官方预览点击这里。
pdf2htmlEX只能部署于类Unix环境,具体支持的系统环境列表以下:
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++
pdf2htmlEX --zoom 1.3 pdf/test.pdf
会在当前目录生成一个同名的HTML文件
pdf2htmlEX -f 3 -l 5 --fit-width 1024 --bg-format jpg pdf/test.pdf
pdf2htmlEX --embed cfijo --dest-dir out pdf/test.pdf
会在指定目录生成一个同名的html文件及附带的资源文件,各种资源文件(例如fonts、imgs、css和javascript)分别存储在不一样目录,这样展现界面能够更好的利用浏览器缓存的优点
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动态加载页面,经过这种方式,发布者能够得到足够的权限去自由控制页面,例如延迟加载。
除了以上的命令之外,还有不少实用方式,好比截取片断转换、修改像素等,这里再也不赘述,感兴趣的能够去官网查看。