如何在 Android 中呈现 PDF

在我的应用程序中,我将收到一个字节流,并将其转换为手机内存中的 pdf 文件。我该怎么把它转换成 PDF 格式呢?然后在活动中展示出来?

86937 次浏览

有些手机(比如 Nexus One)预装了 速成办公室版本,所以一旦你将文件保存到 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();
}
}
}
});
}
}

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

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

MuPDF 的一个缺点是它使用本地库来实现目标,所以以后不容易将应用程序移植到 BlackBerry 平台上。

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

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

简而言之:

  • 从你的 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 页面进行渲染

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

      page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
    
  • 现在你可以用位图做你想做的了。

  • 请注意,2个空参数可能允许您剪辑页面中的某些部分,并执行剪辑的转换(使用 黑客帝国)

  • 还有另一种渲染模式: 打印。如果您需要这种模式,有一些指导方针来正确使用它: 这里是 详情

这个库很简单,运行良好: Android PDF 浏览器 Https://github.com/barteksc/androidpdfviewer

旧答复..。

我认为 Joan Zapata 给了我们一个更好更简单的解决方案:

Https://github.com/joanzapata/android-pdfview

我向你保证,它的工作!

Https://github.com/joanzapata/android-pdfview

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