如何在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 ); }