如何在Android中呈现PDF

在我的应用程序中,我将收到一个字节stream并将其转换为手机内存中的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 Pdf查看器 https://github.com/barteksc/AndroidPdfViewer

旧回复…

我认为琼扎帕塔给了我们更好和简单的解决scheme:

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

我向你保证,它的工作原理!

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

对于本地的PDF文件,你可以通过第三方库来渲染它们。 例如,使用MuPDF库 ,其支持的文件types包括PDF,PNG和JPEG。

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

Android-Lollipop(api 21)引入了一个新的API: PdfRenderer

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

不久之后:

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

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

     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 。 如果你需要这个模式,有一些准则可以正确使用它:这里是细节 。

这里是一个关于如何使用这个新的API的完整例子

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