Вопрос по pdf, webview, java, webviewclient, android – Android - Загрузить PDF внутри веб-просмотра

2

У меня есть этот код веб-просмотра, и я хочу, чтобы PDF-файлы открывались, когда пользователь нажимает на PDF-ссылку. Вот код, можете ли вы сказать мне, что я должен поместить в область PDF этого? Я пробовал много разных способов и вообще не могу просмотреть PDF. Спасибо за помощь.

<code>webview.setWebViewClient ( new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        // do your handling codes here, which url is the requested url
        // probably you need to open that url rather than redirect:
        if (url.startsWith("tel:")) {
            startActivity(new Intent(Intent.ACTION_DIAL, Uri.parse(url)));
        } else if (url.startsWith("mailto:")) {
            url = url.replaceFirst("mailto:", "");
            url = url.trim();
            Intent i = new Intent(Intent.ACTION_SEND);
            i.setType("plain/text").putExtra(Intent.EXTRA_EMAIL,
                    new String[]{url});
            startActivity(i);

        } else if (url.startsWith("geo:")) {
            try {
            } catch (Exception e) {
                System.out.println(e);
            }

        } else if (url.endsWith("pdf")) {

            try {

            } catch (Exception e) {
                System.out.println(e);
            }

        } else {
            view.loadUrl(url);
        }
        return true;
        // then it is not handled by default action
    }
});
</code>

Ваш Ответ

5   ответов
0

FWIW, Mozilla имеетPDF-ридер-полностью-в-JavaScript это Apache лицензирован. Возможно, стоит обратить внимание, если вы не возражаете против дополнительного размера. Таким образом, вы можете делать все в браузере, и вам не придется полагаться на сторонние программы для чтения PDF.

1

Загрузка PDF в веб-просмотр:

WebView wv = (WebView) view.findViewById(R.id.webPage);
            wv.getSettings().setJavaScriptEnabled(true);
            wv.setWebViewClient(new WebClient());
            wv.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + mUrl);
            wv.getSettings().setBuiltInZoomControls(true);

mUrl - будет вашей PDF ссылкой

хороший ответ ..
1

Пожалуйста, ознакомьтесь с примером для обработки URL-адресов перенаправления и открытия 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;
    }
}
1

Я пытался справиться с этим точно таким же сценарием. Решение, которое я придумал, ниже.

public boolean shouldOverrideUrlLoading(WebView view, String url) {
            String cleanUrl = url;
            if (url.contains("?")) {
                // remove the query string
                cleanUrl = url.substring(0,url.indexOf("?"));
            }

            if (cleanUrl.endsWith("pdf")) {

                try {
                    Uri uriUrl = Uri.parse(cleanUrl);
                    Intent intentUrl = new Intent(Intent.ACTION_VIEW, uriUrl);
                    startActivity(intentUrl);
                    return true;

                } catch (Exception e) {
                    System.out.println(e);
                    Toast.makeText(context,"No PDF Viewer Installed", Toast.LENGTH_LONG).show();
                }
            }

            return false;
        }

Мне нужно было убедиться, что он будет обрабатывать ссылки PDF, даже если там была строка запроса. Все еще немного странно, так как cleanUrl должен заканчиваться на "pdf", но пока это так, это должно работать. Если вы предоставляете pdf-файлы через php-скрипт или что-то еще, вы можете захотеть копнуть немного глубже, обрабатывать вещи на основе типа MIME или чего-то подобного.

11

Это может быть так просто, как:

try
{
 Intent intentUrl = new Intent(Intent.ACTION_VIEW);
 intentUrl.setDataAndType(url, "application/pdf");
 intentUrl.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 myActivity.startActivity(intentUrl);
}
catch (ActivityNotFoundException e)
{
 Toast.makeText(myActivity, "No PDF Viewer Installed", Toast.LENGTH_LONG).show();
}

хотя я не пробовал это.

В наших приложениях мы ЗАГРУЖАЕМ PDF в файловую систему приложений, делаем его читаемым во всем мире, затем передаем путь в намерении, чтобы открыть приложение для просмотра PDF (например, Acrobat Reader). Обратите внимание, что вам также необходимо заботиться об очистке этих загруженных PDF-файлов!

в вашем блоке try положено

new DownloadPDFTask().execute(url);

СкачатьPDFTask класс:

public class DownloadPDFTask extends AsyncTask<String, Void, Integer> 
{
    protected ProgressDialog mWorkingDialog;    // progress dialog
    protected String mFileName;         // downloaded file
    protected String mError;            // for errors

    @Override
    protected Integer doInBackground(String... urls)
    {

     try
     {
      byte[] dataBuffer = new byte[4096];
          int nRead = 0;

          // set local filename to last part of URL
          String[] strURLParts = urls[0].split("/");
          if (strURLParts.length > 0)
            mFileName = strURLParts[strURLParts.length - 1];
          else
                mFileName = "REPORT.pdf";

          // download URL and store to strFileName

          // connection to url
      java.net.URL urlReport = new java.net.URL(urls[0]);
          URLConnection urlConn = urlReport.openConnection();
          InputStream streamInput = urlConn.getInputStream();
          BufferedInputStream bufferedStreamInput = new BufferedInputStream(streamInput);
          FileOutputStream outputStream = myActivity.openFileOutput(mFileName,Context.MODE_WORLD_READABLE); // must be world readable so external Intent can open!
          while ((nRead = bufferedStreamInput.read(dataBuffer)) > 0)
                outputStream.write(dataBuffer, 0, nRead);
          streamInput.close();
          outputStream.close();
      }
      catch (Exception e)
      {
       Log.e("myApp", e.getMessage());
       mError = e.getMessage();
       return (1);
      }

     return (0);
    }

    //-------------------------------------------------------------------------
    // PreExecute - UI thread setup
    //-------------------------------------------------------------------------

    @Override
    protected void onPreExecute()
    {
     // show "Downloading, Please Wait" dialog
     mWorkingDialog = ProgressDialog.show(myActivity, "", "Downloading PDF Document, Please Wait...", true);
     return;
    }

    //-------------------------------------------------------------------------
    // PostExecute - UI thread finish
    //-------------------------------------------------------------------------

    @Override
    protected void onPostExecute (Integer result)
    {
         if (mWorkingDialog != null)
      {
       mWorkingDialog.dismiss();
       mWorkingDialog = null;
      }

         switch (result)
         {
         case 0:                            // a URL

            // Intent to view download PDF
            Uri uri  = Uri.fromFile(myActivity.getFileStreamPath(mFileName));

            try
            {
                Intent intentUrl = new Intent(Intent.ACTION_VIEW);
                intentUrl.setDataAndType(uri, "application/pdf");
                intentUrl.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                myActivity.startActivity(intentUrl);
            }
            catch (ActivityNotFoundException e)
            {
                Toast.makeText(myActivity, "No PDF Viewer Installed", Toast.LENGTH_LONG).show();
            }

            break;

        case 1:                         // Error

            Toast.makeText(myActivity, mError, Toast.LENGTH_LONG).show();
            break;

        }

    }

}

любая ссылка на «myActivity»; должен быть заменен ссылкой на ваш класс деятельности

Нет, в отличие от UIWebView на iOS, Android WebView не отображает содержимое PDF. Вы можете попытаться напрямую вызвать намерение (то есть, нет AsyncDownloadTask), хотя вы не будете выполнять свою деятельность, несмотря ни на что.
Хм, так что лучшим способом в Android было бы вызвать асинхронную загрузку файла и сохранить его. Вы знаете, может ли процесс автоматически найти имя файла и сохранить его под SD-картой? Я всегда указывал имя при использовании этого. Спасибо! user1363871
Можно ли просто показать PDF-файл из веб-просмотра, не выполняя задачу асинхронной загрузки? user1363871
Я хотел бы просто передать ваш http: // {file} .pdf url цели, я думаю, что программа просмотра PDF (например, Acrobat) позаботится обо всем остальном. Если это не так, задача загрузчика должна дать вам хорошую отправную точку. Эта часть кода обрабатывает именование файлов, извлекает имя файла из вашего URL: // устанавливает локальное имя файла в последнюю часть URL String [] strURLParts = urls [0] .split (& quot; / & quot;); if (strURLParts.length & gt; 0) mFileName = strURLParts [strURLParts.length - 1]; иначе mFileName = & quot; REPORT.pdf & quot ;;

Похожие вопросы