2010-05-21 42 views
76

Trong ứng dụng của tôi, tôi sẽ nhận được luồng byte và chuyển đổi nó thành tệp pdf trong bộ nhớ điện thoại. Làm cách nào để hiển thị nó cho một pdf? Và hiển thị nó trên một hoạt động?Cách hiển thị PDF trong Android

+0

này đã được trả lời ở đây: http: //stackoverflow.com/a/16294833/2027232 –

Trả lời

113

Một số điện thoại (như Nexus One) đi kèm với phiên bản Quickoffice được cài đặt sẵn để có thể dễ dàng như gửi Mục đích thích hợp khi bạn đã lưu tệp vào thẻ SD.

public class OpenPdf extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Button button = (Button) findViewById(R.id.OpenPdfButton); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       File file = new File("/sdcard/example.pdf"); 

       if (file.exists()) { 
        Uri path = Uri.fromFile(file); 
        Intent intent = new Intent(Intent.ACTION_VIEW); 
        intent.setDataAndType(path, "application/pdf"); 
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

        try { 
         startActivity(intent); 
        } 
        catch (ActivityNotFoundException e) { 
         Toast.makeText(OpenPdf.this, 
          "No Application Available to View PDF", 
          Toast.LENGTH_SHORT).show(); 
        } 
       } 
      } 
     }); 
    } 
} 
+1

hmm bệnh cố gắng này vào ngày mai. vì vậy từ dòng byte tôi sẽ nhận được tôi cần phải lưu chúng như là một tập tin và sau đó thử làm mã đó. – Mikey

+16

hmm nếu tôi không cài đặt QuickOffice trong Android của mình thì sao? – Mikey

+2

như vậy? nếu bạn không có QuickOffice thì sao? – Necronet

17

Open pdf file in webview.

public class MyPdfViewActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    WebView mWebView=new WebView(MyPdfViewActivity.this); 
    mWebView.getSettings().setJavaScriptEnabled(true); 
    mWebView.getSettings().setPluginsEnabled(true); 
    mWebView.loadUrl("https://docs.google.com/gview?embedded=true&url="+LinkTo); 
    setContentView(mWebView); 
    } 
} 
+0

tôi nghĩ rằng điều này chỉ hoạt động với liên kết trình xem google, bởi vì nó chỉ phục vụ hình ảnh. Nếu chúng tôi sử dụng liên kết đến pdf trực tiếp, nó sẽ không hoạt động. Đúng không ? –

+0

Điều này dường như không hoạt động đối với các tệp cục bộ, chỉ các tệp từ xa. –

+2

Điều gì xảy ra nếu liên kết sẽ thay đổi? –

3

Đối với các tệp pdf cục bộ, bạn có thể hiển thị chúng thông qua thư viện của bên thứ ba. ví dụ: sử dụng MuPDF library, các loại tệp được hỗ trợ của nó bao gồm PDF, PNG và JPEG.

Một thiếu sót của MuPDF là nó sử dụng thư viện gốc để hoàn thành mục tiêu, do đó sẽ không dễ dàng chuyển ứng dụng này trên nền tảng BlackBerry sau này.

4

Android Lollipop (api 21) giới thiệu một API mới: PdfRenderer

API này cho phép bạn tạo ra một Bitmap từ một trang trong một tài liệu PDF.

Ngay:

  • có được một mô tả tập tin seekable từ tài liệu pdf của bạn:

    ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY) 
    
  • tạo PdfRenderer

    PdfRenderer renderer = new PdfRenderer(fd); 
    
  • chuẩn bị Bitmap

    Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_4444); 
    
  • được PdfRenderer.Page để render

    PdfRenderer.Page page = renderer.openPage(pageIndex); 
    
  • làm trang trên bitmap chuẩn bị

    page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); 
    
  • bây giờ bạn có thể làm những gì bạn muốn với bitmap.

  • lưu ý rằng 2 args rỗng cho phép bạn cắt một số phần trong trang và thực hiện chuyển đổi (sử dụng một Matrix) của clip
  • có một chế độ rendering: RENDER_MODE_FOR_PRINT. Nếu bạn cần chế độ này, có một số nguyên tắc để sử dụng đúng cách: đây là the details.

Here is a complete example on how to use this new API

+3

Có cách nào để đạt được điều này mà không lưu tệp trên điện thoại không? Tôi nhận được PDF như bytestream và tôi cần hiển thị nó cho người dùng mà không cần lưu nó trên điện thoại. –

+0

ràng buộc là chuyển một bộ mô tả tệp có thể tìm kiếm tới hàm tạo; và fd từ luồng ổ cắm không thể tìm kiếm được. Bạn có thể cố gắng lưu trữ tất cả các byte từ luồng trong bộ đệm và nhận fd có thể tìm kiếm được từ đó. – ben75

4

Thư viện này là đơn giản và hoạt động tốt: Android Pdf Viewer https://github.com/barteksc/AndroidPdfViewer

Cũ Trả lời ...

Tôi nghĩ rằng Joan Zapata cho chúng ta những giải pháp tốt hơn và đơn giản:

https://github.com/JoanZapata/android-pdfview

tôi đảm bảo với bạn rằng nó hoạt động!

1: https://github.com/JoanZapata/android-pdfview

+1

Alecs: Bạn đã sử dụng gì cho pdfName trong 'pdfView.fromAsset (pdfName)'? Tôi đã thử bằng cách sử dụng đường dẫn tuyệt đối, nhưng tập tin không được tìm thấy (và tôi chắc chắn nó là có). Ví dụ: /data/data/package.name/files/images/filename.pdf –

+1

Kính gửi @ h-bomb, bạn phải sử dụng phương thức ** fromasset ** khi pdf của bạn nằm trong bộ mã hóa nội dung của dự án của bạn. Để tải pdf từ thiết bị, bạn có thể sử dụng phương thức ** fromFile **. – Alecs

+1

Cảm ơn rất nhiều. Tôi quyết định sử dụng [FileProvider] của Android (https://developer.android.com/reference/android/support/v4/content/FileProvider.html) và cho phép ứng dụng bên ngoài mở tệp PDF. Ngạc nhiên thay, tài liệu và mã mẫu trong tài liệu dev của FileProvider là tuyệt vời. –

0

Để mở một pdf từ một mảng byte, bạn có thể sử dụng RadaeePDF, bạn có thể làm như sau vào hoạt động của bạn:

private PDFReader m_vPDF = null; 
private Document doc = new Document(); 

public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    Global.Init(this); 

    m_vPDF = new PDFReader(this); 
    doc.Close(); 

    int ret = m_doc.OpenMem(data, password); 
     switch(ret) 
     { 
      case -1://need input password 
       finish(); 
       break; 
      case -2://unknown encryption 
       finish(); 
       break; 
      case -3://damaged or invalid format 
       finish(); 
       break; 
      case -10://access denied or invalid file path 
       finish(); 
       break; 
      case 0://succeeded, and continue 
       break; 
      default://unknown error 
       finish(); 
       break; 
     } 

    m_vPDF.open(doc); 

    setContentView(m_vPDF); 
} 
Các vấn đề liên quan