Подтвердить что ты не робот

Android PDF не загружается в браузере и WebView

Я пытаюсь загрузить PDF файлы в Android Webview. когда я разобрал его. лучший ответ, который я нашел, - это использовать Документы Google. Теперь, что я сделал, добавьте URL-адрес файла PDF в конце этого URL-адреса https://docs.google.com/gview?embedded=true&url=

а затем загрузите этот полный URL-адрес в веб-обозревателе Android. он загружает PDF успешно. Но есть один файл PDF по следующему URL-адресу, который не загружается в WebView, а также в браузере Chrome (в моей системе). URL-адрес 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

тогда он говорит "Нет предварительного просмотра". может кто-нибудь, пожалуйста, скажите мне, что здесь не так.

4b9b3361

Ответ 1

Это не полный ответ. Я исследовал несколько возможностей, но до сих пор не имеет убедительного объяснения этого поведения.

Теория A: кодировка URL... no

Моя первая мысль была такой же, как @gn1 - требуемые фигурные скобки кодировка URL. К сожалению, кодирование параметра url не изменяет результат.

Теория B: Плохой файл PDF... no

Далее я подумал, что, возможно, Google Docs не может обрабатывать этот конкретный файл PDF - это неподдерживаемая версия или использует дополнительные функции или даже ошибки, которые допускают другие зрители. Я загрузил копию и разместил ее на другом сайте. Когда я указал Google Docs на новое местоположение, он был просмотрен отлично.

Теория C: Uncooperative site... no

Далее я подумал, что, возможно, этот сайт не сотрудничает с Google Docs по какой-то причине - возможно, это блокирует Google от его индексации. Я нашел еще одну ссылку PDF на том же сайте по той же схеме:

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

Когда я указал Google Docs на эту ссылку, он просмотрел все.

Теория D: разные метаданные... no

Теперь у меня была одна ссылка, которая работала, а другая - нет. Возможно, их метаданные были разными - например, возможно, тот, который работал, был помечен application/pdf, а другой - нет. Поэтому я посмотрел заголовки HTTP.

Рабочий 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

Не работает 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

Я не вижу явных существенных различий в метаданных.

Теория E: странный запрос от Google... no

Я, по общему признанию, хватаюсь за соломинку в этот момент. Я задавался вопросом, был ли запрос от 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, и это, похоже, не имело значения.


Итак, я нашел подсказки, которые помогают рассказать нам, что не проблема, но ничего не объясняет, что это такое. Я отправляю в надежде, что эти отрицательные результаты все равно будут полезны кому-то.

Ответ 2

Я использую это и работает для меня: 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);
    }
}

Ответ 3

Ознакомьтесь с примером кода для открытого PDF без загрузки в веб-обозревателе  .

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

Ответ 4

По внешнему виду URL-адреса, на которые вы указываете, содержат ссылки на определенные устройства.

Вы можете посмотреть загрузку файла во внутреннее хранилище, а затем использовать намерение загрузить PDF с любым установленным приложением.

От Как открыть PDF с помощью намерения с 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);

В качестве альтернативы вы можете создать экземпляр файла с веб-адресом

Ответ 5

Я помещаю файл на свой сервер, и он отлично работает. Это проблема Документов Google, встречающаяся в URL-адресе или файле robots.txt. Документ в порядке. Вы можете использовать переписывание URL-адресов, чтобы заставить Google Docs обманываться, думая, что это из другой папки. Эти странные символы на пути могут быть проблемой.

Doc loads fine

Ответ 6

Загрузите исходный код здесь (Откройте pdf в веб-браузере 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();
 }
 });
 }
}

Ответ 7

Вот рабочее решение проблемы "Предварительный просмотр недоступен". Точная проблема в кодировке URL, которую мы согласовываем с " http://docs.google.com/gview?url= ". Это означает, что мы должны заменить все специальные символы (:,/, & etc) URL-адреса на Unicode. 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);

        }
    });

Ответ 8

Может быть robots.txt сайта исключает каталог.

Я устал делать то же самое для этого сайта: https://www.pmsp.co.uk/ и он работает хорошо.