在Android

时间:2017-07-25 08:10:03

标签: android pdf

我正在尝试从我的Android应用程序中打开一些pdf。我正在使用Intent来做到这一点:

Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
startActivity(intent);

这段代码适用于某些pdf但是当我尝试打开其他代码时它失败了。

这是Android向我展示的消息:

  

该文件存在问题。

我必须提到,使用一个Crystal Report模板创建没有问题的pdf,并且使用另一个创建失败的pdf。

相反,如果我打开我的浏览器(在我的计算机上)失败的pdf的URL,它不会给我任何打开它们的错误所以我想这可能是Android上的一些限制不同于一些pdf到另一个(在Crystal Report模板上),但我看不到它。

在Android上打开pdf文件有哪些限制? (大小,不允许的Crystal Report的一些参数等等)

我已经放弃了它可能是一个大小限制,因为提供问题的pdf文件小于不提供任何错误的文件。

证明我已经完成了:

  • 在浏览器上打开错误的PDF ~~>行
  • 在手机上下载错误的PDF并打开它~~>行
  • 在APP上打开错误的PDF ~~>的错误
  • 在PDF崩溃的公司的APP上打开好的PDF ~~>行

修改

我注意到我使用的是http://协议,但PDF是https://协议,因此我在Uri.parse方法上对其进行了更改。

当我进行此更改时,应用程序崩溃并在日志中显示错误:

  

android.content.ActivityNotFoundException:找不到处理Intent的活动

另外,我注意到那些没有给我任何错误的PDF都在http://协议而不是https://的网址中,所以我猜https://协议可以是问题。

我是否只能在意图上打开http://请求?

9 个答案:

答案 0 :(得分:10)

可能是Android PDF查看器应用无法解释该文件。 您是否尝试将完全相同的文件复制/下载到Android手机并从那里打开?

另外,我建议使用IntentChooser启动PDF查看器,只是为了在没有安装PDF查看器的情况下安全播放/给用户选择应用程序选项:

Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
Intent chooserIntent = Intent.createChooser(intent, "Open Report");
startActivity(chooserIntent);

答案 1 :(得分:8)

我找到了一种解决方法,可以在我的Android应用程序上查看我的PDF(但不允许我在应用程序上显示后下载它)。如果我使用Google Docs打开PDF,我可以用我的Intent打开它。

这是我必须在我的网址之前添加的内容:

https://docs.google.com/gview?embedded=true&url=

所以最后的网址将是:

https://docs.google.com/gview?embedded=true&url=https://myUrl.pdf

以下是我现在使用的整个代码:

String url= "https://docs.google.com/gview?embedded=true&url=https://url.pdf";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);

但仍然不够,因为我想在不需要使用第三方应用程序的情况下打开它。此外,使用Google Docs打开PDF格式很慢,我必须等待太多,直到PDF最终打开。

如果有人知道如何使用原生Android打开它,请告诉我。

如果我不使用Google文档打开它会怎样?

使用相同的代码,但只使用我的网址,而不是添加的Google文档网址,Android让我在两个应用程序之间进行选择:Adobe Acrobat Reader和Google Chrome。

  • 如果我使用谷歌浏览器打开它,它会下载PDF但不会自动打开。

  • 如果我用Adobe Acrobat Reader打开它,它会给我以下错误:

      

    无法显示PDF(无法打开)

答案 2 :(得分:4)

如果API> = 21,您可以使用PDFRenderer创建每个页面的位图,但它只能查看,不可编辑。这是我在飞行中编写的一个示例,缺少导航按钮,但那些不应该难以实现。

PdfRenderer renderer = new PdfRenderer(ParcelFileDescriptor.open(new File("/path/to/file.pdf"), 
            ParcelFileDescriptor.MODE_READ_ONLY));
    PdfRenderer.Page page = renderer.openPage(0);
    Bitmap bitmap = Bitmap.createBitmap(page.getWidth(), page.getHeight(),
            Bitmap.Config.ARGB_8888);
    page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
    imageView.setImageBitmap(bitmap);
    page.close();
    renderer.close();

修改

PdfRenderer需要FileDescriptor的本地文件。因此,根据我的知识,通过这种方法反过来查看云计算是不可能的。

答案 3 :(得分:4)

为android添加以下库:

//in app level build
compile 'com.joanzapata.pdfview:android-pdfview:1.0.4@aar'

//inside your xml file
<com.joanzapata.pdfview.PDFView
    android:id="@+id/pdfview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

//inside java code
 pdfView.fromAsset(pdfName)
.pages(0, 2, 1, 3, 3, 3)
.defaultPage(1)
.showMinimap(false)
.enableSwipe(true)
.onDraw(onDrawListener)
.onLoad(onLoadCompleteListener)
.onPageChange(onPageChangeListener)
.load();

了解更多信息,请使用此GitHub链接: https://github.com/JoanZapata/android-pdfview

答案 4 :(得分:3)

您可以使用Webview从URL打开PDF,如下所示:

cls.cursor

答案 5 :(得分:2)

使用意图以https://协议打开pdf文件,definitelly https://不是问题。

我看到你正在尝试这种方法来定义数据类型:

Intent intent = new Intent();
intent.setDataAndType(Uri.parse(url), "application/pdf");
startActivity(intent);

但会导致:

  

ActivityNotFoundException:找不到处理Intent的活动

如果您使用其他方法,可能无法在选项中看到PDF阅读器以打开此类文件:

  Intent intent = new Intent();
  intent.setDataAndType(Uri.parse(url), "application/pdf");
  Intent chooserIntent = Intent.createChooser(intent, "Open Report");
  startActivity(chooserIntent);

您必须在没有类型定义的情况下尝试此方法,它将完美运行:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);

通过intent打开pdf文件的此问题的其他原因是打开此类文件的默认应用程序,因此可能会配置损坏或无效的应用程序,因此请重置默认值:

转到Settings。 点按Applications。 点按Default Applications

选择应用并清除默认值

答案 6 :(得分:2)

你可以试试这个,

public void OpenPDFFile(String file_name) {
    try {
        File pdfFile = new File(getFile(), file_name);//File path
        if (pdfFile.exists()) //Checking for the file is exist or not
        {
            Uri path = Uri.fromFile(pdfFile);
            Intent objIntent = new Intent(Intent.ACTION_VIEW);
            objIntent.setDataAndType(path, "application/pdf");
            objIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            try {
                startActivity(objIntent);
                Log.e("IR", "No exception");
            }
            catch (ActivityNotFoundException e) {
                Log.e("IR", "error: " + e.getMessage());
                Toast.makeText(DownloadedPdfActivity.this,
                        "No Application Available to View PDF",
                        Toast.LENGTH_SHORT).show();
            }

        }
    }catch (Exception e){
        e.printStackTrace();
    }
}

    mWebviewPdf.getSettings().setJavaScriptEnabled(true);
    mWebviewPdf.getSettings().setLoadWithOverviewMode(true);
    mWebviewPdf.getSettings().setUseWideViewPort(true);
    pDialog = new ProgressDialog(PdfActivity.this, android.R.style.Theme_DeviceDefault_Dialog);
    pDialog.setTitle("PDF");
    pDialog.setMessage("Loading...");
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(false);
    mWebviewPdf.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            pDialog.show();
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            pDialog.dismiss();
        }
    });
    **mWebviewPdf.loadUrl("https://docs.google.com/gview?embedded=true&url=" + mUrl);**


 String url= "https://docs.google.com/gview?embedded=true&url=" + mUrl;
 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
 startActivity(intent);

您可以在webview中显示pdf。

答案 7 :(得分:2)

您可以在android中使用以下库: - //在app level build compile

  

compile'c​​om.github.barteksc:android-pdf-viewer:2.6.1'

你的xml中的

<com.github.barteksc.pdfviewer.PDFView
        android:id="@+id/pdfView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

在您的活动/片段中:

pdfView.fromUri(Uri)
or
pdfView.fromFile(File)
or
pdfView.fromBytes(byte[])
or
pdfView.fromStream(InputStream) // stream is written to bytearray - native code cannot use Java Streams
or
pdfView.fromSource(DocumentSource)
or
pdfView.fromAsset(String)

有关详细信息,请参阅此link

答案 8 :(得分:2)

您的问题是您的pdf正在Data / data文件夹中下载,当您尝试使用默认intent打开时,外部应用程序没有任何权限从data / data文件夹中打开文件,因此您需要下载应用程序外部目录的文件,然后尝试重新打开它将正常工作。