咱們知道,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動態加載頁面,經過這種方式,發佈者能夠得到足夠的權限去自由控制頁面,例如延遲加載。
除了以上的命令之外,還有不少實用方式,好比截取片斷轉換、修改像素等,這裏再也不贅述,感興趣的能夠去官網查看。