web-dev-qa-db-de.com

Android PDF wird nicht in Browser und WebView geladen

Ich versuche, PDF -Dateien in Android Webview zu laden. wenn ich es gegoogelt habe Die beste Antwort, die ich gefunden habe, ist Google Text & Tabellen. Jetzt füge ich die PDF -Datei-URL am Ende dieser URL an https://docs.google.com/gview?embedded=true&url=

und laden Sie dann diese vollständige URL in die Android-WebView. Es lädt die PDF erfolgreich. Es gibt jedoch eine PDF -Datei unter der folgenden URL, die sowohl in WebView als auch im Chrome-Browser (auf meinem System) nicht geladen wird. Die URL PDF lautet

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

und wenn ich versuche, das PDF als https://docs.google.com/gview?embedded=true&url=www.expertagent.co.uk/asp/in4glestates/ {16D968D6 zu laden -198E-4E33-88F4-8A85731CE605}/{05c36123-4df0-4d7d-811c-8b6686fdd526} /external.pdf

dann heißt es Keine Vorschau verfügbar. Kann mir bitte jemand sagen, was hier falsch ist.

25
Abdul Mohsin

Dies ist keine vollständige Antwort. Ich habe verschiedene Möglichkeiten untersucht, aber immer noch keine überzeugende Erklärung für dieses Verhalten.

Theorie A: URL-Kodierung ... nein

Mein erster Gedanke war der gleiche wie @ gn1 - die geschweiften Klammern werden benötigt RL-Kodierung . Leider ändert die Kodierung des Parameters url nichts am Ergebnis.

Theorie B: Schlecht PDF file ... no

Als nächstes dachte ich, dass Google Text & Tabellen diese bestimmte PDF Datei nicht verarbeiten kann - es ist eine nicht unterstützte Version oder verwendet optionale Funktionen oder weist sogar Fehler auf, die andere Betrachter tolerieren. Ich habe eine Kopie heruntergeladen und auf gehostet Eine andere Website. Wenn ich Google Text & Tabellen auf den neuen Speicherort verweise, wird eine Vorschau angezeigt.

Theorie C: Unkooperativer Ort ... nein

Als nächstes dachte ich, dass diese Website möglicherweise aus irgendeinem Grund nicht mit Google Text & Tabellen zusammenarbeitet. Vielleicht hindert sie Google daran, sie zu indizieren. Ich habe einen anderen PDF Link auf derselben Site mit demselben Schema gefunden:

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

Wenn ich Google Text & Tabellen auf diesen Link verweise, wird eine Vorschau angezeigt.

Theorie D: Unterschiedliche Metadaten ... nein

Jetzt hatte ich einen Link, der funktionierte und einen, der nicht funktionierte. Vielleicht waren ihre Metadaten anders - z. Vielleicht war der eine, der funktionierte, mit application/pdf markiert und der andere nicht. Also habe ich mir die HTTP-Header angesehen.

Arbeits-URL:

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

Nicht funktionierende URL:

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

Ich sehe keine offensichtlichen signifikanten Unterschiede bei den Metadaten.

Theorie E: Seltsame Anfrage von Google ... nein

Ich greife zu diesem Zeitpunkt zugegebenermaßen nach Strohhalmen. Ich fragte mich, ob die Anfrage von Google irgendwie anders war - möglicherweise wurde ein Byte-Bereich oder eine undurchsichtige Komprimierung oder etwas anderes angefordert, und der Zielserver handhabte dies nicht durchgehend gut. Deshalb habe ich Google Text & Tabellen auf eine von mir gesteuerte Site verwiesen, um zu sehen, wie die HTTP-Anforderung aussah:

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)

Das ist überhaupt nicht komisch. Ich habe überprüft, ob die Zielsite Komprimierungsanforderungen ignoriert, damit keine fehlerhafte Komprimierung auftritt. Ich habe auch versucht, mit diesem User-Agent-Header auf die Zielwebsite zuzugreifen, und es schien keine Rolle zu spielen.


Ich habe also Hinweise gefunden, die uns helfen, das Problem zu erkennen, aber noch nichts, was das Problem erklärt. Ich poste in der Hoffnung, dass diese negativen Ergebnisse weiterhin für jemanden von Nutzen sind.

9
rhashimoto

Ich verwende das und arbeite für mich: 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

Den Beispielcode für das Öffnen von PDF ohne Download in Webview .__ auschecken. .

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

Wie es aussieht, enthält die URL, auf die Sie zeigen, einige gerätespezifische Standortreferenzen. 

Sie können die Datei in den internen Speicher herunterladen und dann mit einer bestimmten Absicht die PDF mit einer installierten App laden. 

Von So öffnen Sie eine PDF über Intent von der SD-Karte

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

Alternativ können Sie die Datei mit der Web-URL instanziieren

1
Oliver Hemsted

Ich lege die Datei auf meinen Server und es funktioniert gut. Dies ist ein Google Text & Tabellen-Problem, das in der URL oder in der Datei robots.txt aufgetreten ist. Das Dokument ist in Ordnung. Sie können die URL-Umschreibung verwenden, um Google Docs dazu zu bringen, zu glauben, dass es aus einem anderen Ordner stammt. Diese seltsamen Zeichen im Pfad könnten das Problem sein.

Doc loads fine

1
gn1

Laden Sie den Quellcode von hier herunter ( Öffnen Sie 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();
 }
 });
 }
}
0
Deepshikha Puri

Hier ist eine funktionierende Lösung für das Problem "Keine Vorschau verfügbar". Das genaue Problem liegt in der URL-Kodierung, die wir mit " http://docs.google.com/gview?url= " vergleichen. Das bedeutet, dass wir alle Sonderzeichen (:, /, & etc) von URL durch Unicode ersetzen müssen. Uri.encode ("") macht den Trick für uns.

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