如何在Android中呈现PDF

时间:2010-05-21 15:21:01

标签: java android pdf

在我的应用程序中,我将收到一个字节流并将其转换为手机内存中的pdf文件。如何将其呈现为pdf?并在活动中展示它?

6 个答案:

答案 0 :(得分:114)

某些手机(如Nexus One)预装了Quickoffice版本,因此在将文件保存到SD卡后,就像发送相应的Intent一样简单。

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 :(得分:16)

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);
  }
}

答案 2 :(得分:7)

Android-Lollipop(api 21)推出了一个新API:PdfRenderer

此API允许您从PDF文档中的页面创建位图。

很快:

  • 从您的pdf文档中获取可搜索的文件描述符:

    ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
    
  • 创建PdfRenderer

    PdfRenderer renderer = new PdfRenderer(fd);
    
  • 准备位图

    Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_4444);
    
  • 获取要呈现的PdfRenderer.Page

    PdfRenderer.Page page = renderer.openPage(pageIndex);
    
  • 在准备好的位图上渲染页面

    page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
    
  • 现在您可以使用位图执行所需操作。

  • 请注意,2个空args可能允许您剪辑页面中的某些部分并执行剪辑的转换(使用Matrix
  • 还有另一种渲染模式:RENDER_MODE_FOR_PRINT。如果您需要此模式,则可以正确使用此模式:此处为the details

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

答案 3 :(得分:5)

这个库很简单,效果很好: Android Pdf Viewer https://github.com/barteksc/AndroidPdfViewer

旧回复......

  

我认为Joan Zapata为我们提供了更好,更简单的解决方案:

     

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

     

我向你保证它有效!

     

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

答案 4 :(得分:3)

对于本地pdf文件,您可以通过第三方库呈现它们。例如,使用MuPDF library,其支持的文件类型包括PDF,PNG和JPEG。

MuPDF的一个缺点是它使用本机库来实现目标,因此以后在BlackBerry平台上移植应用程序并不容易。

答案 5 :(得分:0)

要从字节数组中打开pdf,您可以使用RadaeePDF,您可以在活动中执行以下操作:

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 );
}