Открыть PDF в WebView

Я хочу открыть PDF-файл в своем WebView, и я нашел и объединил коды на этом форуме.

Но он улавливает «Приложение PDF не найдено», хотя у меня установлено несколько приложений PDF, включая Adobe Reader.

Вот код:

private class PsvWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);

            if (url.contains(".pdf")) {
                Uri path = Uri.parse(url); 
                Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
                pdfIntent.setDataAndType(path, "application/pdf");
                pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

                try
                {
                    startActivity(pdfIntent);
                }
                catch(ActivityNotFoundException e)
                {
                    Toast.makeText(PsvWebViewActivity.this, "No PDF application found", Toast.LENGTH_SHORT).show();
                }
                catch(Exception otherException)
                {
                    Toast.makeText(PsvWebViewActivity.this, "Unknown error", Toast.LENGTH_SHORT).show();
                }

            }

            return true;
        }   } }

person TheLD    schedule 24.02.2012    source источник
comment
Мне кажется странным, что это не работает, и что единственным ответом было отображение его в WebView с помощью Google, хотя на самом деле это выглядело так, как будто вы хотели передать PDF-файл другому приложению для просмотра.   -  person Ryan    schedule 12.09.2012


Ответы (7)


(1) Google Docs Viewer, вы можете открыть его в браузере Android, например,

mWebView.loadUrl("https://docs.google.com/gview?embedded=true&url="+ webUrl);

Обновление:

(2) Проверьте эту библиотеку, в build.gradle (модуль приложения) добавьте эта зависимость,

compile 'com.github.barteksc:android-pdf-viewer:2.8.2'
person Samir Mangroliya    schedule 24.02.2012
comment
Хорошо, это работает, жаль, что это не работает в соответствии с методом, который я пробовал, я думаю, что веб-просмотр менее понятен. - person TheLD; 24.02.2012
comment
Это работает, но если вы измените документ в своем webUrl, потребуется время, чтобы это повлияло на документы Google. Он отображает старый документ. - person Manish Jain; 09.01.2013
comment
Он открывает только ограниченное количество URL-адресов. После этого он показывает сообщение Вы достигли максимальной пропускной способности. Любые альтернативы? - person Neha Nathani; 16.04.2013
comment
он работает, но иногда он недоступен для предварительного просмотра - person SAndroidD; 25.06.2015
comment
это швы больше не работает. этот URL перенаправляет на файл pdf - person KAPLANDROID; 05.02.2017
comment
Просто дает пустую страницу. - person FractalBob; 01.07.2017
comment
По состоянию на 12 июля 2018 года это решение больше не работает. Любой URL-адрес PDF, который я пытаюсь загрузить, я получаю сообщение об ошибке «Нет заголовка« Access-Control-Allow-Origin »в запрошенном ресурсе». Тот же код приложения и URL-адрес работали нормально до вчерашнего дня. - person user3911483; 12.07.2018
comment
что, если webUrl должен быть с заголовком, подобным авторизации?? - person Mycoola; 26.09.2018
comment
измените авторизацию заголовка на авторизацию токена queryparam, это решает проблему, конечно, если у вас есть доступ к серверной части - person Michał Ziobro; 28.11.2018
comment
это действительно помогло мне .. PS: pdf &url= от Google может быть urlencoded - person Mr Heelis; 07.09.2019

Я знаю, этот вопрос старый.

Но мне очень нравится подход Xamarin к использованию pdf.js от Mozilla. Он работает на более старых версиях Android, для этого вам не нужно специальное приложение PDF Viewer, и вы можете легко отображать PDF-файл внутри иерархии представлений ваших приложений.

Git для этого: https://mozilla.github.io/pdf.js/

Дополнительные параметры: https://github.com/mozilla/pdf.js/wiki/Viewer-options

Просто добавьте файлы pdfjs в каталог Assets:

введите описание изображения здесь

И назовите это следующим образом:

// Assuming you got your pdf file:
File file = new File(Environment.getExternalStorageDirectory() + "/test.pdf");

webview = (WebView) findViewById(R.id.webview);
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
settings.setBuiltInZoomControls(true);
webview.setWebChromeClient(new WebChromeClient());
webview.loadUrl("file:///android_asset/pdfjs/web/viewer.html?file=" + file.getAbsolutePath());

Крутая вещь: Если вы хотите уменьшить количество функций / элементов управления. Перейдите к файлу Assets/pdfjs/web/viewer.html и отметьте определенные элементы управления как скрытые. С участием

style="display: none;"

Например. Если вам не нравится правая панель инструментов:

<div id="toolbarViewerRight" style="display: none;">...</div>
person Lepidopteron    schedule 29.03.2017
comment
Большое спасибо! Мне нужно открыть pdf в автономном режиме, поэтому документ Google не подходит. - person Chandler; 24.04.2018
comment
можно ли прочитать файл из личной (внутренней папки приложения)? - person mas_bejo; 05.10.2018
comment
@mas_bejo Может быть, это поможет вам: stackoverflow.com/questions/11406084/. Но вы также можете открыть новый вопрос в StackOverflow, касающийся вашего вопроса. - person Lepidopteron; 05.10.2018
comment
Могу ли я разместить этот pdfjs на сервере и использовать URL-адрес сервера, чтобы открыть предварительный просмотр PDF, если я в сети? Это занимает 12 МБ, поэтому, когда мое приложение открывает онлайн-файлы PDF, было бы неплохо сохранить эти 12 МБ размера apk. - person Michał Ziobro; 28.11.2018
comment
как насчет CORS - совместного использования ресурсов между источниками. Я пытаюсь открыть файл с сетевого URL - person Michał Ziobro; 28.11.2018
comment
@MichałZiobro Это должно быть возможно, но помните о длительном времени загрузки, так как пользователю придется загружать pdf и pdfjs. - person Lepidopteron; 28.11.2018
comment
@MichałZiobro, пожалуйста, откройте новый вопрос по этой проблеме для более подробного объяснения возможностей вашей настройки. - person Lepidopteron; 28.11.2018
comment
Я решил эту проблему в viewer.js есть массив с такими разрешенными источниками null, mozilla и т. д. Я добавил свои домены, и он работает правильно. Я протестирую эту серверную часть и проверю, приемлемо ли время загрузки или лучше иметь больший размер apk (12 МБ без сжатия, если я сжимаю его, это занимает всего около 5-6 МБ). - person Michał Ziobro; 29.11.2018

Обновление: откроется встроенное приложение (средство просмотра PDF) для отображения файла PDF, если ОС >= Marshmallow (API 23), в противном случае откроется браузер для отображения PDF с использованием сервера «docs.google.com».

WebView webView = new WebView(this);

    String url = "http://www.pdf995.com/samples/pdf.pdf"; 

    // Support all types of OS versions.
    if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
        webView.loadUrl(url); // This will open it with a built-in PDF viewer app.
    else
        webView.loadUrl("http://docs.google.com/viewerng/viewer?url="+ url); // This will open it with a browser. On Android 5.0 (Api 21 - Lollipop) and bellow.

    // Set Download listener.
    webView.setDownloadListener((url1, userAgent, contentDisposition, mimetype, contentLength)
            -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url1))));
person Abdulmajeed Alyafey    schedule 27.12.2018
comment
Ответ содержит только код, пожалуйста, добавьте описание - person Akash Dubey; 27.12.2018

Вы можете попробовать это. он работает как для .pdf, так и для .docx

 String pdfUrl = "https://www.abcd.com/assets/uploads/profilepics/abc.pdf"; //your pdf url
 String url = "http://docs.google.com/gview?embedded=true&url=" + pdfUrl;

 WebView webView = findViewById(R.id.webview_cv_viewer);
 webView.getSettings().setSupportZoom(true);
 webView.getSettings().setJavaScriptEnabled(true);
 webView.loadUrl(url);
person Dinesh Sarma    schedule 31.01.2019

Если вы пытаетесь просмотреть PDF-файл с URL-адресом и не получаете доступ к содержимому, требующему аутентификации, лучшим вариантом будет:

val webPage = Uri.parse(customizedUrl) //This is optional, based on how your URL is provided
val intent = Intent(Intent.ACTION_VIEW, webPage)
startActivity(intent)

Браузер делегирует открытие документа программе просмотра PDF на устройстве.

person Shalbert    schedule 28.01.2021

Старый URL-адрес не работает, используйте этот новый URL-адрес

mWebView.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url="+ webUrl);

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

person Manohar    schedule 20.03.2018

эта работа для меня

webView.loadUrl("https://docs.google.com/viewer?url=" + "url of your pdf"); 
person Maysam R    schedule 31.05.2018