如何在Android中呈现PDF


Answers:


115

某些手机​​(例如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
嗯,明天试试吧。所以从字节流中,我将需要将它们保存为文件,然后尝试执行该代码。
Mikey

18
嗯,如果我没有在Android中安装QuickOffice,该怎么办?
Mikey 2010年

2
所以?如果没有QuickOffice怎么办?
Necronet

如果电话没有快速办公室呢?
Tofeeq Ahmad 2011

6
如何直接从服务器打开PDF文件?而不是将其保存在设备上然后打开。
EnthuDeveloper 2011年

16

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

我认为这仅适用于Google查看器链接,因为它仅提供图像。如果我们直接使用pdf链接,它将无法正常工作。那是对的吗 ?
内森·

这似乎不适用于本地文件,仅适用于远程文件。
阿尔菲·汉森

2
如果链接会改变怎么办?
Shuhrat Akramov 2014年

3
“经过2天的持续测试,我在Google文档上收到一条错误消息,说您已经达到了查看或下载非Google Docs格式文件的带宽限制...。因此似乎不可靠。” stackoverflow.com/questions/2655972/...
Wédney尤里

9

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。如果需要此模式,则有一些正确使用它的准则:以下是详细信息


3
有什么方法可以在不将文件保存到手机上的情况下实现此目的?我正在获取PDF作为字节流,我需要将其显示给用户而不将其保存在手机上。
Gokhan Arik

约束是将可搜索的文件描述符传递给构造函数;并且套接字流中的fd不可搜索。您可以尝试将流中的所有字节存储在缓冲区中,并从中获取可搜索的fd。
ben75

5

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

旧回覆...

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

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

我向您保证,它有效!

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


1
Alecs:您在中的pdfName使用了什么pdfView.fromAsset(pdfName)?我尝试使用绝对路径,但未找到文件(并且我确定它在那里)。示例:/data/data/package.name/files/images/filename.pdf
h-bomb

1
亲爱的@ h-bomb,如果您的pdf位于项目的资产查找器中,则必须使用fromasset方法。要从设备加载pdf,可以使用 fromFile方法。
Alecs 2015年

1
非常感谢。我决定使用Android的FileProvider并允许外部应用程序打开PDF。令人惊讶的是,FileProvider开发文档中的文档和示例代码非常出色。
h炸弹

3

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

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


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 );
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.