Android PDF未在浏览器和WebView中加载

时间:2015-05-26 14:26:35

标签: android pdf webview

我正在尝试在Android Webview中加载PDF文件。当我用谷歌搜索它。我找到的最佳答案是使用Google文档。现在,我所做的是将PDF文件URL附加到此网址的末尾 https://docs.google.com/gview?embedded=true&url=

然后在android WebView中加载这个完整的URL。它成功加载PDF。但是,以下URL中有一个PDF文件未在WebView和Chrome浏览器(在我的系统上)中加载。 PDF网址是

http://www.expertagent.co.uk/asp/in4glestates/ {16D968D6-198E-4E33-88F4-8A85731CE605} / {05c36123-4df0-4d7d-811C-8b6686fdd526} /external.pdf

当我尝试加载PDF时 https://docs.google.com/gview?embedded=true&url=www.expertagent.co.uk/asp/in4glestates/ {16D968D6-198E-4E33-88F4-8A85731CE605} / {05c36123-4df0-4d7d-811C-8b6686fdd526} /external.pdf

然后它说没有预览可用。任何人都可以告诉我这里有什么不对。

6 个答案:

答案 0 :(得分:9)

这不是一个完整的答案。我研究了几种可能性,但对这种行为仍然没有令人信服的解释。

理论A:URL编码......否

我的第一个想法与@ gn1相同 - 需要花括号URL encoding。不幸的是,对url参数进行编码并不会改变结果。

理论B:错误的PDF文件......没有

接下来我认为Google Docs可能无法处理这个特定的PDF文件 - 它是一个不受支持的版本或使用可选功能,甚至还有其他观众容忍的错误。我下载了一份副本并将其托管在另一个网站上。当我将Google文档指向新位置时,它预览得很好。

理论C:不合作的地点......没有

接下来我想也许这个网站可能出于某种原因与谷歌文档合作 - 也许它阻止谷歌索引它。我在相同的网站上找到了另一个PDF链接,使用相同的方案:

http://www.expertagent.co.uk/asp/in4glestates/%7B6dad6f28-a59d-4b54-b277-52f077f4927f%7D/%7Be3a6d17c-d6a8-4e92-8f52-09c6721515fc%7D/External.pdf

当我将Google文档指向此链接时,它预览得很好。

理论D:不同的元数据......没有

现在我有一个有用的链接,而且没有一个链接。也许他们的元数据不同 - 例如或许那个有效的标签是application / pdf而另一个不是。所以我查看了HTTP标头。

工作网址:

HTTP/1.1 200 OK
Cache-Control: max-age=3600
Content-Length: 1767120
Content-Type: application/pdf
Last-Modified: Fri, 02 Nov 2007 12:45:00 GMT
Accept-Ranges: bytes
ETag: "46b1592e4e1dc81:13e6"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Wed, 03 Jun 2015 23:25:23 GMT

不工作的网址:

HTTP/1.1 200 OK
Cache-Control: max-age=3600
Content-Length: 4623702
Content-Type: application/pdf
Last-Modified: Mon, 11 May 2015 15:53:16 GMT
Accept-Ranges: bytes
ETag: "acac5d9828cd01:13e6"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Wed, 03 Jun 2015 23:25:42 GMT

我发现元数据没有明显的显着差异。

理论E:来自Google的奇怪请求......没有

此时我还是抓住吸管。我想知道来自Google的请求是否有所不同 - 可能是它要求字节范围或模糊压缩等等,目标服务器并不能很好地处理它。因此,我将Google Docs指向我控制的网站,以查看HTTP请求的外观:

GET /asp/in4glestates/%7B16D968D6-198E-4E33-88F4-8A85731CE605%7D/%7B05c36123-4df0-4d7d-811c-8b6686fdd526%7D/External.pdf HTTP/1.1
Host: www.example.com:55555
Connection: Keep-alive
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (compatible; Google AppsViewer; http://drive.google.com)

这根本不奇怪。我确实验证了目标站点忽略了压缩请求,因此不会出现错误压缩的情况。我也尝试使用User-Agent标题访问目标站点,但这似乎并不重要。

所以我找到了有助于告诉我们问题不在于什么的线索,但还没有解释什么是什么。我希望这些负面结果仍然对某人有用。

答案 1 :(得分:8)

我正在使用它并且对我有用:http://weimenglee.blogspot.com/2013/05/android-tip-displaying-pdf-document.html

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    WebView webView=new WebView(MainActivity.this);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setPluginState(WebSettings.PluginState.ON);
    //---you need this to prevent the webview from
    // launching another browser when a url
    // redirection occurs---
    webView.setWebViewClient(new Callback());

    String pdfURL = "http://www.expertagent.co.uk/asp/in4glestates/{16D968D6-198E-4E33-88F4-8A85731CE605}/{05c36123-4df0-4d7d-811c-8b6686fdd526}/external.pdf";
    webView.loadUrl(
            "http://docs.google.com/gview?embedded=true&url=" + pdfURL);

    setContentView(webView);
}

private class Callback extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(
            WebView view, String url) {
        return(false);
    }
}

答案 2 :(得分:1)

根据事物的外观,您指向的网址包含一些特定于设备的位置引用。

您可以查看将文件下载到内部存储,然后使用意图在安装了任何应用程序的情况下加载PDF。

来自How to open a PDF via Intent from SD card

File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/example.pdf");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);

或者,您可以使用web url

实例化该文件

答案 3 :(得分:1)

我把文件放在我的服务器上,它运行正常。这是在网址或robots.txt中遇到的Google文档问题。该文件很好。您可以使用网址重写来让Google Docs误以为它来自其他文件夹。路径中那些奇怪的角色可能就是问题所在。

Doc loads fine

答案 4 :(得分:0)

从此处下载源代码(Open pdf in webview android);

<强> activity_main.xml中

<RelativeLayout android:layout_width="match_parent"
 android:layout_height="match_parent"
 xmlns:android="http://schemas.android.com/apk/res/android">

 <WebView
 android:layout_width="match_parent"
 android:background="#ffffff"
 android:layout_height="match_parent"
 android:id="@+id/webview"></WebView>


 </RelativeLayout>

<强> MainActivity.java

package com.pdfwebview;

import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {

 WebView webview;
 ProgressDialog pDialog;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 init();
 listener();
 }

 private void init() {
 webview = (WebView) findViewById(R.id.webview);
 webview.getSettings().setJavaScriptEnabled(true);

 pDialog = new ProgressDialog(MainActivity.this);
 pDialog.setTitle("PDF");
 pDialog.setMessage("Loading...");
 pDialog.setIndeterminate(false);
 pDialog.setCancelable(false);
 webview.loadUrl("https://drive.google.com/file/d/0B534aayZ5j7Yc3RhcnRlcl9maWxl/view");

 }

 private void listener() {
 webview.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();
 }
 });
 }
}

答案 5 :(得分:0)

这里是“无预览可用”问题的有效解决方案。确切的问题是我们与“ http://docs.google.com/gview?url=”共同构成的URL编码。这意味着我们必须用unicode替换url的所有特殊字符(:,/和&等)。 Uri.encode(“”)为我们解决了难题。

String url = Uri.encode("your link");
    String finalUrl = "http://docs.google.com/viewer?url=" + url + "&embedded=true";

    WebSettings webSettings = webView.getSettings();
    webSettings.setBuiltInZoomControls(true);
    webSettings.setJavaScriptEnabled(true);
    webView.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);

    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.getSettings().setLoadWithOverviewMode(true);

    progressView.setVisibility(View.VISIBLE);
    webView.loadUrl(finalUrl);

    webView.setWebViewClient(new WebViewClient() {

        @Override
        public void onPageFinished(WebView view, String url) {
            view.getSettings().setLoadsImagesAutomatically(true);
            webView.setVisibility(View.VISIBLE);
            //progressView.setVisibility(View.VISIBLE);

            if (progressView != null && progressView.isShown()) {
                progressView.setVisibility(View.GONE);
            }

            Log.v("after load", view.getUrl());
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {

        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Toast.makeText(getApplicationContext(), description, Toast.LENGTH_SHORT).show();
            Log.e("error", description);

        }
    });