2013-06-21 70 views

回答

1

首先要在android中查看pdf,您必須將pdf轉換爲圖像,然後將其顯示給用戶。 (我打算使用webview)

所以要做到這一點,我們需要這個library。這是我編輯的git版本。

將庫導入到項目後,您需要創建活動。

的XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <WebView 
      android:id="@+id/webView1" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 

</LinearLayout> 

化java的onCreate:

//Imports: 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Base64; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewTreeObserver; 
import android.webkit.WebView; 
import com.sun.pdfview.PDFFile; 
import com.sun.pdfview.PDFImage; 
import com.sun.pdfview.PDFPage; 
import com.sun.pdfview.PDFPaint; 
import net.sf.andpdf.nio.ByteBuffer; 
import net.sf.andpdf.refs.HardReference; 
import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.RandomAccessFile; 
import java.nio.channels.FileChannel; 

//Globals: 
private WebView wv; 
private int ViewSize = 0; 

//OnCreate Method: 
@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //Settings 
    PDFImage.sShowImages = true; // show images 
    PDFPaint.s_doAntiAlias = true; // make text smooth 
    HardReference.sKeepCaches = true; // save images in cache 

    //Setup webview 
    wv = (WebView)findViewById(R.id.webView1); 
    wv.getSettings().setBuiltInZoomControls(true);//show zoom buttons 
    wv.getSettings().setSupportZoom(true);//allow zoom 
    //get the width of the webview 
    wv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() 
    { 
     @Override 
     public void onGlobalLayout() 
     { 
      ViewSize = wv.getWidth(); 
      wv.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     } 
    }); 

    pdfLoadImages();//load images 
} 

加載圖像:

private void pdfLoadImages() 
{ 
    try 
    { 
     // run async 
     new AsyncTask<Void, Void, Void>() 
       { 
        // create and show a progress dialog 
        ProgressDialog progressDialog = ProgressDialog.show(MainActivity.this, "", "Opening..."); 

        @Override 
        protected void onPostExecute(Void result) 
        { 
         //after async close progress dialog 
         progressDialog.dismiss(); 
        } 

        @Override 
        protected Void doInBackground(Void... params) 
        { 
         try 
         { 
          // select a document and get bytes 
          File file = new File(Environment.getExternalStorageDirectory().getPath()+"/randompdf.pdf"); 
          RandomAccessFile raf = new RandomAccessFile(file, "r"); 
          FileChannel channel = raf.getChannel(); 
          ByteBuffer bb = ByteBuffer.NEW(channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size())); 
          raf.close(); 
          // create a pdf doc 
          PDFFile pdf = new PDFFile(bb); 
          //Get the first page from the pdf doc 
          PDFPage PDFpage = pdf.getPage(1, true); 
          //create a scaling value according to the WebView Width 
          final float scale = ViewSize/PDFpage.getWidth() * 0.95f; 
          //convert the page into a bitmap with a scaling value 
          Bitmap page = PDFpage.getImage((int)(PDFpage.getWidth() * scale), (int)(PDFpage.getHeight() * scale), null, true, true); 
          //save the bitmap to a byte array 
          ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
          page.compress(Bitmap.CompressFormat.PNG, 100, stream); 
          stream.close(); 
          byte[] byteArray = stream.toByteArray(); 
          //convert the byte array to a base64 string 
          String base64 = Base64.encodeToString(byteArray, Base64.DEFAULT); 
          //create the html + add the first image to the html 
          String html = "<!DOCTYPE html><html><body bgcolor=\"#7f7f7f\"><img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>"; 
          //loop through the rest of the pages and repeat the above 
          for(int i = 2; i <= pdf.getNumPages(); i++) 
          { 
           PDFpage = pdf.getPage(i, true); 
           page = PDFpage.getImage((int)(PDFpage.getWidth() * scale), (int)(PDFpage.getHeight() * scale), null, true, true); 
           stream = new ByteArrayOutputStream(); 
           page.compress(Bitmap.CompressFormat.PNG, 100, stream); 
           stream.close(); 
           byteArray = stream.toByteArray(); 
           base64 = Base64.encodeToString(byteArray, Base64.DEFAULT); 
           html += "<img src=\"data:image/png;base64,"+base64+"\" hspace=10 vspace=10><br>"; 
          } 
          html += "</body></html>"; 
          //load the html in the webview 
          wv.loadDataWithBaseURL("", html, "text/html","UTF-8", ""); 
        } 
        catch (Exception e) 
        { 
         Log.d("CounterA", e.toString()); 
        } 
         return null; 
        } 
       }.execute(); 
       System.gc();// run GC 
    } 
    catch (Exception e) 
    { 
     Log.d("error", e.toString()); 
    } 
} 
+0

我在這裏實現了一個更好的選項:http://stackoverflow.com/a/16294833/2027232 –