web-dev-qa-db-fra.com

Android PDF ne pas charger 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ée est d'utiliser Google Docs. Maintenant, ce que j’ai fait, c’est d’ajouter l’URL du fichier PDF à la fin de cette adresse https://docs.google.com/gview?embedded=true&url=

puis chargez cette URL complète dans Android WebView. il charge le PDF avec succès. Mais il existe un fichier PDF sur l'URL suivante qui ne se charge pas dans WebView ni dans le navigateur Chrome (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} /external.pdf

et quand j'essaie de charger le PDF en tant que 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

alors il dit non disponible en aperçu. Quelqu'un peut-il s'il vous plaît me dire ce qui ne va pas ici.

25
Abdul Mohsin

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
isma3l

Consultez l'exemple de code pour ouvrir PDF sans télécharger, 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
Ashish Das

En apparence, l’URL que vous pointez inclut des références d’emplacement spécifiques à un périphérique. 

Vous pouvez télécharger le fichier dans le magasin interne, puis utiliser une intention de charger le PDF avec n'importe quelle application installée. 

De Comment ouvrir un PDF via Intent de la 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);

Sinon, vous pouvez instancier le fichier avec l’URL Web.

1
Oliver Hemsted

Je mets le fichier sur mon serveur et cela fonctionne bien. Il s'agit d'un problème de Google Documents rencontré dans l'URL ou le fichier robots.txt. Le document est bien. Vous pouvez utiliser la réécriture d'URL pour que Google Documents soit trompé en lui faisant croire qu'il s'agit d'un autre dossier. Le problème pourrait être ces personnages étranges dans le chemin.

Doc loads fine

1
gn1

Téléchargez le code source à partir d’ici ( Ouvrez le 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>

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();
 }
 });
 }
}
0
Deepshikha Puri

Voici une solution qui marche pour le problème 'Aucun aperçu disponible'. Le problème exact est le codage d'URL que nous concatérons 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 ("") fait le tour 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
Tushar Baweja