Android PDF ne se charge pas dans le navigateur et WebView

j'essaie de charger des fichiers PDF dans Android Webview. quand je l'ai Googlé. la meilleure réponse que j'ai trouvé est d'utiliser Google Docs. Maintenant ce que j'ai fait est d'ajouter L'URL du fichier PDF à la fin de cette url https://docs.google.com/gview?embedded=true&url=

et ensuite charger cette URL complète dans le WebView android. il charge le PDF avec succès. Mais il y a un fichier PDF sur L'URL suivante qui ne se charge pas dans WebView aussi bien que dans Chrome browser (sur mon système). L'URL PDF est

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

et quand j'essaie de charger le PDF comme https://docs.google.com/gview?embedded=true&url=www.expertagent.co.uk/asp/in4glestates/ {16D968D6-198E-4E33-88F4-8A85731CE605}/{05c36123-4df0-4d7d-811c-8b6686fdd526}/externe.pdf

alors il est dit pas de Preview disponible. est-ce que quelqu'un peut me dire ce qui ne va pas ici?

24
demandé sur Abdul Mohsin 2015-05-26 17:26:35

7 réponses

Ce n'est pas une réponse complète. J'ai étudié plusieurs possibilités mais je n'ai toujours pas d'explication convaincante pour ce comportement.

UNE Théorie: le codage d'URL ... n ° 151970920"

ma première pensée était la même que @gn1 - les crochets bouclés avaient besoin de encodage URL . Malheureusement, encoder le paramètre url ne change pas le résultat.

Théorie B: Mauvais fichier PDF ... n ° 151970920"

ensuite, J'ai pensé que peut - être Google Docs ne peut pas gérer ce fichier PDF particulier-il s'agit d'une version non supportée ou utilise des fonctionnalités optionnelles ou même a des erreurs que les autres téléspectateurs tolèrent. J'ai téléchargé une copie et hébergé sur un autre site. Quand J'ai pointé Google Docs au nouvel emplacement,il prévu amende.

Théorie C: non coopératifs site ... n ° 151970920"

ensuite j'ai pensé que peut - être ce site ne coopère pas avec Google Docs pour une raison quelconque-peut-être c'est le blocage de Google à partir de l'indexation. J'ai trouvé un autre lien PDF sur le même site avec le même schéma:

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

quand J'ai pointé Google Docs vers ce lien, il prévoyait fine.

Théorie D: les Différentes métadonnées ... n ° 151970920"

maintenant j'en ai un un lien qui fonctionne et un qui ne fonctionne pas. Peut - être que leurs métadonnées étaient différentes-par exemple, peut-être que celui qui a fonctionné était étiqueté application/pdf et que l'autre ne l'était pas. Alors j'ai regardé les en-têtes HTTP.

URL de travail:

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

URL qui ne fonctionne pas:

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

Je ne vois aucune différence significative dans les métadonnées.

Théorie E: demande étrange de Google ... n ° 151970920"

je suis certes, à saisir les pailles à ce point. Je me suis demandé si la requête de Google était différente d'une manière ou d'une autre - peut-être qu'elle demandait une plage de octets ou une compression obscure ou quelque chose, et le serveur cible ne l'a pas traitée de manière cohérente. J'ai donc pointé Google Docs sur un site que je contrôle pour voir à quoi ressemble la requête 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)

ce n'est pas bizarre du tout. J'ai vérifié que le site cible ignore les requêtes de compression, donc ce n'est pas un cas de compression buggée. J'ai aussi j'ai essayé d'accéder au site cible avec cet en-tête User-Agent et ça n'a pas semblé avoir d'importance.


" donc j'ai trouvé des indices qui nous aident à nous dire ce qui n'est pas le problème mais rien qui explique ce qui est. Je vais l'afficher dans l'espoir que ces résultats négatifs seront utiles à quelqu'un.

9
répondu rhashimoto 2015-06-04 00:42:51

j'utilise ceci et travaille pour moi: 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);
    }
}
8
répondu isma3l 2015-06-08 15:51:37

vérifiez le code exemple pour ouvrir PDF sans téléchargement, dans webview .

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

    PdfWebViewClient pdfWebViewClient = new PdfWebViewClient(this, webview);
    pdfWebViewClient.loadPdfUrl(
            "https://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0ahUKEwjgwIfp3KXSAhXrhFQKHQqEDHYQFggZMAA&url=http%3A%2F%2Fwww.orimi.com%2Fpdf-test.pdf&usg=AFQjCNERYYcSfMLS5ukBcT2Qy11YxEhXqw&cad=rja");
}


private class PdfWebViewClient extends WebViewClient
{
   private static final String TAG = "PdfWebViewClient";
   private static final String PDF_EXTENSION = ".pdf";
   private static final String PDF_VIEWER_URL = "http://docs.google.com/gview?embedded=true&url=";

   private Context mContext;
   private WebView mWebView;
   private ProgressDialog mProgressDialog;
   private boolean isLoadingPdfUrl;

   public PdfWebViewClient(Context context, WebView webView)
   {
      mContext = context;
      mWebView = webView;
      mWebView.setWebViewClient(this);
   }

   public void loadPdfUrl(String url)
   {
      mWebView.stopLoading();

      if (!TextUtils.isEmpty(url))
      {
          isLoadingPdfUrl = isPdfUrl(url);
          if (isLoadingPdfUrl)
          {
              mWebView.clearHistory();
          }

          showProgressDialog();
       }

      mWebView.loadUrl(url);
  }

  @SuppressWarnings("deprecation")
  @Override
  public boolean shouldOverrideUrlLoading(WebView webView, String url)
  {
      return shouldOverrideUrlLoading(url);
  }

  @SuppressWarnings("deprecation")
  @Override
  public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl)
  {
      handleError(errorCode, description.toString(), failingUrl);
  }

  @TargetApi(Build.VERSION_CODES.N)
  @Override
  public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request)
  {
      final Uri uri = request.getUrl();
      return shouldOverrideUrlLoading(webView, uri.toString());
  }

  @TargetApi(Build.VERSION_CODES.N)
  @Override
  public void onReceivedError(final WebView webView, final WebResourceRequest request, final WebResourceError error)
  {
      final Uri uri = request.getUrl();
      handleError(error.getErrorCode(), error.getDescription().toString(), uri.toString());
  }

  @Override
  public void onPageFinished(final WebView view, final String url)
  {
      Log.i(TAG, "Finished loading. URL : " + url);
      dismissProgressDialog();
  }

  private boolean shouldOverrideUrlLoading(final String url)
  {
      Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url);

      if (!isLoadingPdfUrl && isPdfUrl(url))
      {
          mWebView.stopLoading();

          final String pdfUrl = PDF_VIEWER_URL + url;

          new Handler().postDelayed(new Runnable()
          {
              @Override
              public void run()
              {
                  loadPdfUrl(pdfUrl);
              }
          }, 300);

          return true;
      }

      return false; // Load url in the webView itself
  }

   private void handleError(final int errorCode, final String description, final String failingUrl)
  {
      Log.e(TAG, "Error : " + errorCode + ", " + description + " URL : " + failingUrl);
  }

  private void showProgressDialog()
  {
      dismissProgressDialog();
      mProgressDialog = ProgressDialog.show(mContext, "", "Loading...");
  }

  private void dismissProgressDialog()
  {
      if (mProgressDialog != null && mProgressDialog.isShowing())
      {
          mProgressDialog.dismiss();
          mProgressDialog = null;
      }
  }

  private boolean isPdfUrl(String url)
  {
      if (!TextUtils.isEmpty(url))
      {
          url = url.trim();
          int lastIndex = url.toLowerCase().lastIndexOf(PDF_EXTENSION);
          if (lastIndex != -1)
          {
              return url.substring(lastIndex).equalsIgnoreCase(PDF_EXTENSION);
          }
      }
    return false;
  }
}
2
répondu Ashish Das 2017-05-23 06:18:42

par l'apparence des choses L'URL que vous pointez inclut des références d'emplacement spécifiques à l'appareil.

vous pouvez regarder le téléchargement du fichier à la boutique interne, puis en utilisant une intention de charger le PDF avec n'importe quelle application installée.

à Partir de Comment ouvrir un PDF via Intention de carte SD

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

alternativement vous pouvez instancier le fichier avec l'url web

1
répondu Oliver Hemsted 2017-05-23 12:26:36

j'ai mis le fichier sur mon serveur et ça fonctionne très bien. Il s'agit d'un problème Google Docs rencontré dans L'URL ou les robots.txt. Le document est très bien. Vous pouvez utiliser URL rewrite pour faire Google Docs être dupé en pensant qu'il est à partir d'un autre dossier. Ces personnages bizarres dans le chemin pourraient être le problème.

Doc loads fine

1
répondu gn1 2015-06-11 03:11:51

Téléchargez le code source ici ( Open pdf dans 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>

activité principale.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();
 }
 });
 }
}
0
répondu Deepshikha Puri 2017-03-24 08:01:41

Voici la solution de travail pour 'no Preview Available' issue.. Le problème Exact est dans l'encodage URL que nous concatons avec " "http://docs.google.com/gview?url= ". Cela signifie que nous devons remplacer tous les caractères spéciaux (:,/, & etc) de l'url par unicode. URI.encode("") faire l'affaire pour nous.

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

        }
    });
0
répondu Tushar Baweja 2018-07-26 05:37:23