繁体   English   中英

如何在 Android 中呈现 PDF

[英]How to render PDF in Android

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

某些手机​​(如 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();
                    }
                }
            }
        });
    }
}

在 webview 中打开 pdf 文件

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

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 个空参数可能允许您剪辑页面中的某些部分并执行剪辑的转换(使用Matrix

  • 还有另一种渲染模式: RENDER_MODE_FOR_PRINT 如果您需要此模式,有一些正确使用它的指南:这里是详细信息

这个库很简单而且运行良好: Android Pdf Viewer https://github.com/barteksc/AndroidPdfViewer

旧回复...

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

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

我向你保证它有效!

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

对于本地pdf文件,您可以通过第三方库进行渲染。 例如,使用MuPDF 库,其支持的文件类型包括 PDF、PNG 和 JPEG。

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

要从字节数组打开 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 );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM