2012-06-28 23 views
2

Я знаю, что этот вопрос задан много раз, но для меня все еще неясно, есть ли существующая и надлежащим образом работающая библиотека для отображения документов PDF.Библиотека просмотра PDF в формате PDF

Я только хочу просмотреть документ PDF, который хранится внутри моего приложения. Открытие новой операции подходит для меня, мне не нужно отображать ее в существующем виде. Я уже создал фрагмент кода, чтобы запустить намерение активности для чтения моего локального файла PDF, но, конечно, если на устройстве уже не установлено приложение PDF Viewer, то ничего не происходит.

Я слышал о APV, VuDroid, droidreader и т. Д., Но кажется, что все они являются APK, а не библиотеками, которые могут использоваться внутри моего кода приложения.

Итак, есть ли у вас настоящая библиотека для Android?

Заранее спасибо.

+0

Пожалуйста, проверьте мой ответ, и если у вас возникли проблемы, сообщите мне. –

+0

См. Ниже ссылку моего SO-ответа для чтения pdf-файла с SD-карты и добавьте файл PDFViewer.jar в путь сборки java вашего приложения. [Чтение PDF с помощью PDFViewer] (http://stackoverflow.com/questions/11152956/example-of-code-to-implement-a-pdf-reader/11153601#11153601) –

+0

Я не понимаю. Где доступна библиотека? – thomaus

ответ

0

Во-первых, чтобы просмотреть pdf-файл в android, вам необходимо преобразовать 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 
} 

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

Я получаю ошибку на этой двух строках ByteBuffer bb = ByteBuffer.NEW (channel.map (FileChannel.MapMode.READ_ONLY, 0, channel.size())); PDFFile pdf = new PDFFile (bb); Ошибка как с ключевым словом NEW, так и с файлом PDFFile (bb), и как его решить. –

0

Мне нравится MuPDF Adnroid lib, так как он написан на C++/NDK и имеет уникальные функции, такие как кликабельные изображения (я имею в виду URL-адрес, связанный с изображением) - не встречал никакой другой библиотеки с этой функцией, и мне это действительно нужно.
You actually can open PDF using no lib at all: using WebView via google docs, но мне это не нравится, потому что IC требуется все время при использовании MuPDF. Я могу DL pdf-файл и свободно открывать его в автономном режиме в любое время. Также способ WebView более «твердый» для устройства означает, что батарея разряжается + отстает + нагрев процессора и использует больше трафика (по сравнению с DL & show way).

+0

Можете ли вы рассказать о том, как использовать MuDroid? – Senhor

+0

Я считаю, что они предоставили пример приложения. Я уверен, что они действительно заставляли меня помнить, что я модифицировал пример приложения для выполнения моих конкретных задач. – Stan

Смежные вопросы