Android WebView:显示带有PDF的网站 [英] Android WebView: Display Website with PDF

查看:101
本文介绍了Android WebView:显示带有PDF的网站的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的Xamarin.Android应用中,我正在使用WebView来显示网站:

In my Xamarin.Android App I am using a WebView to display a website:

AXML:

<LinearLayout
        android:id="@+id/auditStructurUseCaseLinearLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1">
        <WebView
            android:id="@+id/auditWebview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

Fragment.cs:

    _webview.SetWebViewClient(new ExtendWebViewClient());
    WebSettings webSettings = _webview.Settings;
    webSettings.JavaScriptEnabled = true;
    webSettings.DisplayZoomControls = false;
    webSettings.BuiltInZoomControls = true;
    _webview.LoadUrl(URL);

ExtendWebViewClient:

internal class ExtendWebViewClient : WebViewClient
{
    public override bool ShouldOverrideUrlLoading(WebView view, string url)
    {
        view.LoadUrl(url);
        return true;
    }
}

这对于普通网站非常有效.我可以在网站内导航,并且可以像普通浏览器一样使用它.

This works well for normal websites. I can navigate inside awebsite and can use it like a normal browser.

问题: 我想显示嵌入网站内的PDF.当今的浏览器随附有PDF插件来显示PDF,所以问题是,是否存在一种用于WebView的PDF插件,或者我是否缺少一些设置来在网站内显示PDF?

Problem: I want to display PDFs which are embedded inside a website. Today's browser come with PDF Plugins to display PDF, so the question is, is there a kind of PDF Plugin for the WebView or am I missing some settings to display a PDF inside a Website?

如果我尝试使用PDF打开网站,则该网站会要求提供PDF查看器.

If I try to open websites with PDF, the website asks for a PDF-Viewer.

翻译:很遗憾,由于您没有PDF查看器,因此无法显示PDF.您可以在此处下载PDF.

不幸的是,下载按钮也不起作用.

Unfortunately, the download-button is functionless aswell.

或者也许有人有另一种方法,它不使用WebView.

Or maybe someone has another approach which does not use a WebView.

我尝试使用_webview.SetWebChromeClient(new WebChromeClient());,但这会打开Chrome应用.因此,我尝试按照问题中的建议使用WebViewClientChromeViewClient.

I tried using _webview.SetWebChromeClient(new WebChromeClient()); but this opens the the Chrome App. So I tried to use WebViewClient and ChromeViewClient like suggested in this question.

WebSettings webSettings = _webview.Settings;
            webSettings.JavaScriptEnabled = true;
            webSettings.DisplayZoomControls = false;
            webSettings.BuiltInZoomControls = true;
            webSettings.SetSupportMultipleWindows(true);
            _webview.SetWebChromeClient(new WebChromeClient());
            _webview.SetWebViewClient(new ExtendWebViewClient());

但这会导致与上述相同的问题.

But this leads to the same problem as described.

推荐答案

使用此代码打开Web视图,然后我制作了一个浮动操作按钮",单击它,您可以下载pdf视图...制作确定您输入正确的网址

Use this code to open web view and then i have made a Floating Action Button and on the click of it, you can download the pdf view...Make Sure you enter correct URL's

首先..再建立一个名为PDFVIEW的类,我们将在我们的代码中使用该类方法...

BUT FIRST..MAKE ANOTHER CLASS NAMED PDFVIEW AND WE WILL USE THIS CLASS METHOD'S IN OUR CODE...

CLASS PDFVIEW代码...

CLASS PDFVIEW CODE...

public class PdfView {

private static final int REQUEST_CODE=101;

/**
 * convert webview content into to pdf file
 * @param activity pass the current activity context
 * @param webView webview
 * @param directory directory path where pdf file will be saved
 * @param fileName name of the pdf file.
 * */
public static void createWebPrintJob(Activity activity, WebView webView, File directory, String fileName, final Callback callback) {

    //check the marshmallow permission
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            activity.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
            callback.failure();
           return;
        }
    }

    String jobName = activity.getString(R.string.app_name) + " Document";
    PrintAttributes attributes = null;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        attributes = new PrintAttributes.Builder()
                .setMediaSize(PrintAttributes.MediaSize.ISO_A3)
                .setResolution(new PrintAttributes.Resolution("pdf", "pdf", 600, 600))
                .setMinMargins(PrintAttributes.Margins.NO_MARGINS).build();
    }
    PdfPrint pdfPrint = new PdfPrint(attributes);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        pdfPrint.print(webView.createPrintDocumentAdapter(jobName), directory, fileName, new PdfPrint.CallbackPrint() {
            @Override
            public void success(String path) {
                callback.success(path);
            }

            @Override
            public void onFailure() {
                callback.failure();
            }
        });
    }else {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            pdfPrint.print(webView.createPrintDocumentAdapter(), directory, fileName, new PdfPrint.CallbackPrint() {
                @Override
                public void success(String path) {
                    callback.success(path);
                }

                @Override
                public void onFailure() {
                    callback.failure();
                }
            });
        }
    }
}


/**
 * create alert dialog to open the pdf file
 * @param activity pass the current activity context
 * @param title  to show the heading of the alert dialog
 * @param message  to show on the message area.
 * @param path file path create on storage directory
 */
public static void openPdfFile(final Activity activity, String title, String message, final String path){

    //check the marshmallow permission
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (activity.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            activity.requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
            return;
        }
    }

    AlertDialog.Builder builder=new AlertDialog.Builder(activity);
    builder.setTitle(title);
    builder.setMessage(message);
    builder.setPositiveButton("Open", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
            fileChooser(activity,path);
        }
    });

    builder.setNegativeButton("Dismiss", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });

    AlertDialog alert = builder.create();
    alert.show();

}

/** callback interface to get the result back after created pdf file*/
public interface Callback{
    void success(String path);
    void failure();
}


/**
 * @param activity pass the current activity context
 * @param path storage full path
 */
private  static void fileChooser(Activity activity, String path) {
    File file = new File(path);
    Intent target = new Intent("android.intent.action.VIEW");
    //Uri uri = FileProvider.getUriForFile(activity, "${applicationId}.com.package.name.fileprovider", file);
    Uri uri = FileProvider.getUriForFile(activity, activity.getApplicationContext().getPackageName()+ ".fileprovider", file);
    target.setDataAndType(uri, "application/pdf");
    target.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    Intent intent = Intent.createChooser(target, "Open File");
    try {
        activity.startActivity(intent);
    } catch (ActivityNotFoundException var6) {
        var6.printStackTrace();
    }

}

}

//现在是主要类别代码.

//NOW MAIN CLASS CODE..

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_orders);

    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    WebView wb = (WebView) findViewById(R.id.webview);

    wb.getSettings().setBuiltInZoomControls(true);


    Pbar = (ProgressBar) findViewById(R.id.pB1);


        WebSettings ws = wb.getSettings();
        ws.setJavaScriptEnabled(true);
        ws.setDomStorageEnabled(true);
        ws.setAllowFileAccess(true);
        wb.getSettings().setBuiltInZoomControls(true);
        //   wb.getSettings().setDisplayZoomControls(false);
        wb.clearCache(true);

    wb.setWebChromeClient(new WebChromeClient() {

        public void onProgressChanged(WebView view, int progress) {
            if (progress < 100 && Pbar.getVisibility() == ProgressBar.GONE) {
                Pbar.setVisibility(ProgressBar.VISIBLE);
            }
            Pbar.setProgress(progress);
            if (progress == 100) {
                Pbar.setVisibility(ProgressBar.GONE);
                pdfdownload.setVisibility(View.VISIBLE);
            }
        }

    });

    pdfdownload = (FloatingActionButton) findViewById(R.id.pdf);

    pdfdownload = (FloatingActionButton) findViewById(R.id.pdf);
    pdfdownload.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM + "/ANY_DIRECTORY/");

            final ProgressDialog progressDialog = new ProgressDialog(context);
            progressDialog.setMessage("Please wait");
            progressDialog.show();

            //PDFView Class Method
            PdfView.createWebPrintJob(context, wb, path, fileName, new PdfView.Callback() {

                @Override
                public void success(String path) {
                    progressDialog.dismiss();
                    PdfView.openPdfFile(context.this, getString(R.string.app_name), "Do you want to open the pdf file?" + fileName, path);
                }

                @Override
                public void failure() {
                    progressDialog.dismiss();

                }
            });

        }
    });

    wb.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:
            Log.e("redirectUrl", "" + url);


       //CHECK YOUR URL CONDITIONS TO OPEN RIGHT URL FOR PDF, IF ANY..OTHERWISE LOAD DIRECTLY
    if (url.contains("/guest/home")) {
                view.loadUrl(postUrl);
            } else {
                view.loadUrl(url);
            }

            return false; // then it is not handled by default action
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            Log.e("url finished", url);
                        }
    });

    wb.setDownloadListener(new DownloadListener() {
        public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
            Log.e("DOWNLOAD", url + " , " + userAgent + " , " + contentDisposition + " , " + mimetype + " , " + contentLength);
            try {
                DownloadManager.Request request = new DownloadManager.Request(Uri.parse(newURL[1].trim()));
                request.allowScanningByMediaScanner();
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); //Notify client once download is completed!
                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, file_name);
                DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                dm.enqueue(request);
                Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_LONG).show();
            } catch (Exception e) {
                Log.e("download", "download fail" + e.toString());
            }
        }
    });

}

这篇关于Android WebView:显示带有PDF的网站的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆