在 WebView 中打开 PDF 文件

Posted

技术标签:

【中文标题】在 WebView 中打开 PDF 文件【英文标题】:Opening a PDF file inside a WebView 【发布时间】:2018-07-25 08:26:28 【问题描述】:

大约 2 天后,我尝试在我的自定义 WebvView 中打开 PDF 文件。这是我的WebView 代码:

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;

public class WebActivity extends AppCompatActivity 
    public
    WebView mywebViewfull;
    ProgressBar progressBar;



    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);
        String url = getIntent().getStringExtra("url");
        mywebViewfull = (WebView) findViewById(R.id.webnav1);
        progressBar=(ProgressBar)findViewById(R.id.progressbar1);
        WebSettings webSettings= mywebViewfull.getSettings();
        webSettings.setjavascriptEnabled(true);
        webSettings.setPluginState(WebSettings.PluginState.ON);
        webSettings.setGeolocationEnabled(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        webSettings.setBuiltInZoomControls(true);
        webSettings.setSaveFormData(true);
        webSettings.setAppCacheEnabled(true);
        webSettings.setDatabaseEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setLoadsImagesAutomatically(true);
        webSettings.setAllowFileAccess(true);
        webSettings.setAllowFileAccessFromFileURLs(true);
        webSettings.setAllowUniversalAccessFromFileURLs(true);
        webSettings.setUseWideViewPort(true);
        webSettings.setBuiltInZoomControls(false);
        webSettings.setGeolocationDatabasePath(getFilesDir().getPath());
        webSettings.setAllowFileAccess(true);
        webSettings.setAllowUniversalAccessFromFileURLs(true);
        mywebViewfull.loadUrl(url);
        mywebViewfull.setWebViewClient(new mywebViewfullClient());


    


    @Override
    public void onBackPressed() 
        if(mywebViewfull.canGoBack())
        
            mywebViewfull.goBack();
        

        else
        
            super.onBackPressed();
        
    
    class mywebViewfullClient extends WebViewClient 
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) 
        super.onPageStarted(view, url, favicon);
        progressBar.setVisibility(View.VISIBLE);
        //getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
       // android.support.v7.app.ActionBar actionBar = getSupportActionBar();
       // actionBar.hide();
    

    @Override
    public void onPageFinished(WebView view, String url) 
        super.onPageFinished(view, url);
        progressBar.setVisibility(View.GONE);
    
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
        if (url != null && url.startsWith("http://")) 
            //open url contents in webview
            return false;
        if (url != null && url.startsWith("https://")) 
                //open url contents in webview
            return false;
              //this must open pdf file
        if (url.endsWith(".pdf")) 
            mywebViewfull.loadUrl("https://docs.google.com/gview?embedded=true&url="+getIntent().getStringExtra("url"));
            return false;

        
        else 
            //external links in app
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;

        
    

    //back previous page
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) 
        if (event.getAction()==KeyEvent.ACTION_DOWN)
            switch (keyCode)
                case KeyEvent.KEYCODE_BACK:
                    if (mywebViewfull.canGoBack()) 
                        mywebViewfull.goBack();
                    
                    else  
                        finish();
                    
                    return true;
            
        
        return super.onKeyDown(keyCode, event);


    


所以...当我尝试打开 pdf document 时,我的应用程序中没有任何反应。

我看不出有什么问题!谁能帮帮我?

【问题讨论】:

拜托,如果对您有帮助,您介意接受我的回答吗?谢谢你。最良好的祝愿。 【参考方案1】:

没有原生支持在 Android 中打开 PDF 文件,但您有一些解决方法或多或少可以为您完成这项工作。替代品:

1 - 您可以打开系统默认应用程序以通过应用程序的意图读取 pdf 文件;

2 - 您可以使用第三方库在您的应用中打开 pdf;

3 - 您可以调用 Google Docs 网站功能在您的 webview 中打开您的 pdf 文件。为此,请使用以下代码示例:

String pdfUrl = "http://yourwebsite.com/yourfile.pdf";
String url = "http://docs.google.com/gview?embedded=true&url=" + pdfUrl;
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);

【讨论】:

从您的第 2 点来看,您能建议任何第三方库在应用程序内打开 pdf 吗? @Md.TahmidMozaffar 我使用 AndroidPdfViewer (github.com/barteksc/AndroidPdfViewer),效果很好。抱歉耽搁了。祝你好运。 AndroidPdfViewer 库加载 PDF 非常缓慢或有时未加载 @Annie“于 2018 年 2 月 14 日 17:53 回答”。感谢您的支持。最良好的祝愿。【参考方案2】:

如果您想在 Web 视图中显示 PDF,请使用:

   url = "https://docs.google.com/viewer?url=https://linkToYourPdf.pdf"

   webView.loadUrl(url);

如果您的 PDF 包含多于一页,请不要忘记启用垂直滚动

   webview.setVerticalScrollBarEnabled(true);

【讨论】:

【参考方案3】:

如果您选择 webview 选项,请尝试以下操作

WebView webview = (WebView) findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true); 
String pdf = "online pdf link";
webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf);

但请记住,如果您使用 google docs 来查看 pdf 或任何其他文档,google docs 可能会向您抛出错误说明

You've reached the bandwidth limit for viewing or downloading files that aren't in Google Docs format..... 所以好像不太靠谱

因此,请谨慎查看 Google 文档

如果您有通过资产文件夹阅读的pdf,请参考我的whole answer

【讨论】:

以上是关于在 WebView 中打开 PDF 文件的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 WebView 打开 PDF 文件

如何在 WebView Android Studio 中打开本地 pdf 文件

在应用程序中打开资产文件 pdf

尝试在 webview 中打开在线 PDF 文件时,我没有收到可用的预览消息

iOS 加载pdf格式的文件

将 WebView 中的传入 PDF 保存到内存