代码之家  ›  专栏  ›  技术社区  ›  Aiko West

Android WebView:用PDF显示网站

  •  1
  • Aiko West  · 技术社区  · 7 年前

    在我的Xamarin机器人应用程序我正在使用WebView显示网站:

    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>
    

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

    这对普通网站很有效。我可以在awebsite中导航,并且可以像普通浏览器一样使用它。

    问题:

    如果我试图用PDF打开网站,网站会要求一个PDF查看器。

    : 很遗憾,无法显示PDF,因为您没有PDF查看器。你可以在这里下载PDF。 enter image description here

    或者有人 另一种方法 它不使用WebView。

    编辑:

    _webview.SetWebChromeClient(new WebChromeClient()); 但这会打开Chrome应用程序。所以我试着用 WebViewClient 和 ChromeViewClient 就像在 this 问题。

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

    但这也导致了同样的问题。

    3 回复  |  直到 7 年前
        1
  •  0
  •   Mayank Kumar Chaudhari    7 年前

    你可以像这样使用谷歌文档

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

    请参考问题 here .

    shouldOverrideLoadingUrl ()方法。

    根据评论编辑

    1. 使用iframe更改包含对pdf的引用的行-在iframe中加载google docs
    2. 而不是webview.loadUrl()尝试loadDataWithBaseURL()。-请参考 this answer
        2
  •  0
  •   Sagar Zala    7 年前

    把你喜欢的网址,

    url = "https://drive.google.com/viewerng/viewer?embedded=true&url=" + GetString(Resource.String.your_pdf_url);
    
        3
  •  0
  •   Ashmeet Arora    7 年前

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

    }

    @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());
                }
            }
        });
    

    }