移動端實現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動態加載頁面,經過這種方式,發佈者能夠得到足夠的權限去自由控制頁面,例如延遲加載。

除了以上的命令之外,還有不少實用方式,好比截取片斷轉換、修改像素等,這裏再也不贅述,感興趣的能夠去官網查看。

相關文章
相關標籤/搜索