国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android之WebView加載PDF鏈接預(yù)覽PDF文件

這篇具有很好參考價值的文章主要介紹了Android之WebView加載PDF鏈接預(yù)覽PDF文件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


前言

Android的webview壓根就不支持加載pdf,Android與iOS不同,iOS加載pdf,不管本地還是在線,直接使用webview渲染就可以了,而Android卻做不到,所以我們必須得扣腦殼了。方法也有很多種,比如第三方PDFview,MuPDF等,但是不推薦,引入進去apk體積會大很多,所以大多場景都是通過js解析,然后在webview中加載PDF文件,所以內(nèi)庫很小也就2兆多,那我們就開始吧。


一、效果圖

Android之WebView加載PDF鏈接預(yù)覽PDF文件,Android進階,WebView加載PDF,Android加載PDF,pdf預(yù)覽,webview加載PDF鏈接,Android webview

二、實現(xiàn)步驟

1.在項目main目錄下新建一個assets

2.新建一個js為index.js

var url = location.search.substring(1);

PDFJS.cMapUrl = 'https://unpkg.com/pdfjs-dist@1.9.426/cmaps/';
PDFJS.cMapPacked = true;

var pdfDoc = null;

function createPage() {
    var div = document.createElement("canvas");
    document.body.appendChild(div);
    return div;
}

function renderPage(num) {
    pdfDoc.getPage(num).then(function (page) {
        var viewport = page.getViewport(2.0);
        var canvas = createPage();
        var ctx = canvas.getContext('2d');

        canvas.height = viewport.height;
        canvas.width = viewport.width;

        page.render({
            canvasContext: ctx,
            viewport: viewport
        });
    });
}

PDFJS.getDocument(url).then(function (pdf) {
    pdfDoc = pdf;
    for (var i = 1; i <= pdfDoc.numPages; i++) {
        renderPage(i)
    }
});


3.新建一個HTML為index.html

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=4.0,user-scalable=no"/>
    <title>Document</title>
    <style type="text/css">
        canvas {
            width: 100%;
            height: 100%;
            border: 1px solid black;
        }
    </style>
    <script src="https://unpkg.com/pdfjs-dist@1.9.426/build/pdf.min.js"></script>
    <script type="text/javascript" src="index.js"></script>
</head>
<body>
</body>
</html>


4.xml布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff">

    <include
        android:id="@+id/include"
        layout="@layout/title_layout" />

    <WebView
        android:id="@+id/pdfwebview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/gosign"
        android:layout_below="@+id/include" />

    <TextView
        android:id="@+id/gosign"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_alignParentBottom="true"
        android:layout_centerInParent="true"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="10dp"
        android:layout_marginRight="30dp"
        android:layout_marginBottom="30dp"
        android:background="@drawable/blackground_home_blue"
        android:gravity="center"
        android:text="Go Sign"
        android:textColor="#ffffff"
        android:textSize="16dp" />

</RelativeLayout>

4.Activity類(kotlin)

注意:activity代碼要點在于WebSettings設(shè)置的參數(shù)和loadUrl()加載URL時加"file:///android_asset/index.html?"

class PDFWebViewActivity : Activity(), OnClickListener {

    private lateinit var relative_back: RelativeLayout
    private lateinit var text_title: TextView
    private lateinit var url: String//接收URL
    private lateinit var title: String//接收title
    private lateinit var pdfwebview: WebView
    private lateinit var gosign: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //去掉狀態(tài)欄
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            val decorView = window.decorView
            val option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            decorView.systemUiVisibility = option
            window.statusBarColor = Color.parseColor("#00000000")
        }
        //修改狀態(tài)欄文字為黑色
        window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
                View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
        setContentView(R.layout.pdfwebviewlayout)
        url = intent.getStringExtra("url")!!.trim { it <= ' ' }
        title = intent.getStringExtra("title")!!.trim { it <= ' ' }
        instantiation()
    }

    fun instantiation() {
        EventBus.getDefault().register(this)
        relative_back = findViewById(R.id.relative_back)
        text_title = findViewById(R.id.text_title)
        text_title.text = title
        pdfwebview = findViewById(R.id.pdfwebview)
        gosign = findViewById(R.id.gosign)
        gosign.setOnClickListener(this)
        relative_back.setOnClickListener(this)
        webviewDe(url)
    }

    override fun onClick(v: View?) {
        when (v?.id) {
            R.id.relative_back ->
                finish()
        }
    }

    /**
     * webview顯示
     */
    @SuppressLint("SetJavaScriptEnabled", "JavascriptInterface")
    private fun webviewDe(url: String) {
        println("網(wǎng)頁url打?。?/span>$url")
        val webSettings: WebSettings = pdfwebview.getSettings()
        webSettings.cacheMode = WebSettings.LOAD_DEFAULT
        //設(shè)置加載進來的頁面自適應(yīng)手機屏幕
        webSettings.useWideViewPort = true
        webSettings.loadWithOverviewMode = true
        //問題2:基本都需要支持JS
        webSettings.javaScriptEnabled = true
        webSettings.allowFileAccess = true
        //支持通過JS打開新窗口
        webSettings.allowFileAccessFromFileURLs = true
        webSettings.allowUniversalAccessFromFileURLs = true
        webSettings.javaScriptCanOpenWindowsAutomatically = true
        webSettings.setGeolocationEnabled(true)
        webSettings.domStorageEnabled = true
        webSettings.setAppCacheEnabled(false)
        pdfwebview.scrollBarStyle = WebView.SCROLLBARS_OUTSIDE_OVERLAY
        //觸摸焦點起作用
        pdfwebview.requestFocus()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //http與https的方法
            webSettings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW
        }
        // 添加js交互接口類,并起別名 Android
        pdfwebview.addJavascriptInterface(JavascriptImgInterface(), "Android")

        //設(shè)置WebChromeClient類
        pdfwebview.webChromeClient = object : WebChromeClient() {
            //獲取網(wǎng)站標(biāo)題
            override fun onReceivedTitle(view: WebView, title: String) {
                println("標(biāo)題在這里$title")
            }

            //圖片選取
            override fun onShowFileChooser(
                webView: WebView,
                filePathCallback: ValueCallback<Array<Uri>>,
                fileChooserParams: FileChooserParams,
            ): Boolean {
                return true
            }
        }
        //設(shè)置WebViewClient類
        pdfwebview.webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
                // 返回值是true的時候控制去WebView打開,為false調(diào)用系統(tǒng)瀏覽器或第三方瀏覽器
                view.loadUrl(url)
                return true
            }

            //設(shè)置加載前的函數(shù) kotlin這里favicon: Bitmap?的Bitmap?必須加?
            override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
                if (!this@PDFWebViewActivity.isFinishing) 
                {
                    println("開始加載了")
                    DialogUtils.showLoadingDialog(this@PDFWebViewActivity)
                }
            }

            //設(shè)置結(jié)束加載函數(shù)
            override fun onPageFinished(view: WebView, url: String) {
                println("結(jié)束加載了")
                try {
                    DialogUtils.hideLoadingDialog()
                } catch (e: Exception) {
                }
            }
        }
        pdfwebview.loadUrl("file:///android_asset/index.html?$url")
    }

    class JavascriptImgInterface {
        /**
         * 注意: 在Android4.2極其以上系統(tǒng)需要給提供js調(diào)用的方法前加入一個注釋:@JavaScriptInterface;
         * 在虛擬機當(dāng)中 Javascript調(diào)用Java方法會檢測這個anotation,
         * 如果方法被標(biāo)識@JavaScriptInterface則Javascript可以成功調(diào)用這個Java方法,否則調(diào)用不成功。
         */
        //js調(diào)用Android方法給web返回Token值
        @JavascriptInterface
        open fun Android_Token(): String? {
            println("打印的token:" + SpUtil.get(ConstantUtil.TOKEN, ""))
            return SpUtil.get(ConstantUtil.TOKEN, "")
        }

    }
}

5.Activity類(Java)

注意:activity代碼要點在于WebSettings設(shè)置的參數(shù)和loadUrl()加載URL時加"file:///android_asset/index.html?"


public class PDFWebViewActivity extends Activity implements View.OnClickListener {

    private String url;//接收URL
    private String title;//接收title
    private ImageView left_black_risk;//返回鍵
    private TextView text_title;//title
    private RelativeLayout gosign;//去簽名
    private static String message;//返回消息
    private WebView webviewx5;//webview

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //去掉狀態(tài)欄
        if (Build.VERSION.SDK_INT >= 21) {
            View decorView = getWindow().getDecorView();
            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            getWindow().setStatusBarColor(Color.parseColor("#00000000"));
        }
        //修改狀態(tài)欄文字為黑色
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
                        View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        setContentView(R.layout.pdfwebviewlayout);
        url = getIntent().getStringExtra("url").trim();
        title = getIntent().getStringExtra("title").trim();
        instantiation();
    }

    private void instantiation() {
        webviewx5 = findViewById(R.id.webview);
        left_black_risk = findViewById(R.id.left_black_risk);
        text_title = findViewById(R.id.text_title);
        gosign = findViewById(R.id.gosign);
        text_title.setText(title);
        left_black_risk.setOnClickListener(this);
        gosign.setOnClickListener(this);
        webviewDe(url);
    }

    /**
     * webview顯示
     */
    @SuppressLint({"SetJavaScriptEnabled", "JavascriptInterface"})
    private void webviewDe(String url) {
        System.out.println("網(wǎng)頁url打印:" + url);
        WebSettings webSettings = webviewx5.getSettings();
        webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
        //設(shè)置加載進來的頁面自適應(yīng)手機屏幕
        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true);
        //問題2:基本都需要支持JS
        webSettings.setJavaScriptEnabled(true);
        webSettings.setAllowFileAccess(true);
        //支持通過JS打開新窗口
        webSettings.setAllowFileAccessFromFileURLs(true);
        webSettings.setAllowUniversalAccessFromFileURLs(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        webSettings.setGeolocationEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setAppCacheEnabled(false);

        webviewx5.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        //觸摸焦點起作用
        webviewx5.requestFocus();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //http與https的方法
            webSettings.setMixedContentMode(MIXED_CONTENT_ALWAYS_ALLOW);
        }
        // 添加js交互接口類,并起別名 Android
        webviewx5.addJavascriptInterface(new JavascriptImgInterface(), "Android");

        //設(shè)置WebChromeClient類
        webviewx5.setWebChromeClient(new WebChromeClient() {


            //獲取網(wǎng)站標(biāo)題
            @Override
            public void onReceivedTitle(WebView view, String title) {
                System.out.println("標(biāo)題在這里" + title);
            }

            //圖片選取
            @Override
            public boolean onShowFileChooser(WebView webView,
                                             ValueCallback<Uri[]> filePathCallback,
                                             FileChooserParams fileChooserParams) {
                return true;
            }
        });
        //設(shè)置WebViewClient類
        webviewx5.setWebViewClient(new WebViewClient() {

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // 返回值是true的時候控制去WebView打開,為false調(diào)用系統(tǒng)瀏覽器或第三方瀏覽器
                view.loadUrl(url);
                return true;
            }

            //設(shè)置加載前的函數(shù)
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                if (!PDFWebViewActivity.this.isFinishing())//xActivity即為本界面的Activity
                {
                    System.out.println("開始加載了");
                    DialogUtils.showLoadingDialog(PDFWebViewActivity.this);
                }
            }

            //設(shè)置結(jié)束加載函數(shù)
            @Override
            public void onPageFinished(WebView view, String url) {
                System.out.println("結(jié)束加載了");
                try {
                    DialogUtils.hideLoadingDialog();
                } catch (Exception e) {

                }
            }
        });
        webviewx5.loadUrl("file:///android_asset/index.html?" + url);
    }

    public class JavascriptImgInterface {
        /**
         * 注意: 在Android4.2極其以上系統(tǒng)需要給提供js調(diào)用的方法前加入一個注釋:@JavaScriptInterface;
         * 在虛擬機當(dāng)中 Javascript調(diào)用Java方法會檢測這個anotation,
         * 如果方法被標(biāo)識@JavaScriptInterface則Javascript可以成功調(diào)用這個Java方法,否則調(diào)用不成功。
         */
        //js調(diào)用Android方法給web返回Token值
        @JavascriptInterface
        public String Android_Token() {
            System.out.println("打印的token:" + SpUtil.get(ConstantUtil.TOKEN, ""));
            return SpUtil.get(ConstantUtil.TOKEN, "");
        }

        //js調(diào)用Android方法下載apk
        @JavascriptInterface
        public String Android_DownloadApk(String url) {
            //方式一:代碼實現(xiàn)跳轉(zhuǎn)
            Intent intent = new Intent();
            //通過intent發(fā)送數(shù)據(jù)
            intent.setAction("android.intent.action.VIEW");
            //創(chuàng)建一個鏈接  鏈接.語法解析
            Uri content_url = Uri.parse(url);
            //通過intent接受
            intent.setData(content_url);
            //開始于當(dāng)前intent
            startActivity(intent);
            return url;
        }
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            //返回鍵
            case R.id.left_black_risk:
                finish();
                break;
            //去簽名
            case R.id.gosign:
                break;
        }
    }
}


總結(jié)

以上便是通過加載js的方式預(yù)覽PDF文件了,都有注釋自己慢慢去理解,有問題歡迎提出并指正!文章來源地址http://www.zghlxwxcb.cn/news/detail-545873.html

到了這里,關(guān)于Android之WebView加載PDF鏈接預(yù)覽PDF文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • pdf.js預(yù)覽pdf文件

    預(yù)覽pdf一般通過瀏覽器自帶的pdf預(yù)覽器就可以,但有時候需要窗口預(yù)覽或自定義操作,可以使用pdf.js操作 pdf.js需要構(gòu)建后使用,我們可以直接下載安裝pdfjs-dist,這是構(gòu)建好的版本 這里注意你的環(huán)境,新版本使用了可選鏈,空值合并和私有 class 字段/方法等,如果你的瀏覽器

    2024年02月03日
    瀏覽(28)
  • 【vue-pdf】PDF文件預(yù)覽插件

    1 插件安裝 vue-pdf GitHub:https://github.com/FranckFreiburger/vue-pdf#readme 參考文檔:https://www.cnblogs.com/steamed-twisted-roll/p/9648255.html catch報錯:vue-pdf組件報錯vue-pdf Cannot read properties of undefined (reading ‘catch‘)_你看我像是會的樣子嗎?的博客-CSDN博客 2 代碼示例 Example.01 超簡單分頁預(yù)覽 E

    2024年02月14日
    瀏覽(34)
  • SpringBoot+PDF.js實現(xiàn)按需分片加載預(yù)覽(包含可運行示例源碼)

    SpringBoot+PDF.js實現(xiàn)按需分片加載預(yù)覽(包含可運行示例源碼)

    本文的解決方案旨在解決大體積PDF在線瀏覽加載緩慢、影響用戶體驗的難題。通過利用分片加載技術(shù),前端請求時附帶range及讀取大小信息,后端據(jù)此返回相應(yīng)的PDF文件流。這種方式有效地減輕了服務(wù)器和瀏覽器的負擔(dān),提升了加載速度和用戶體驗。同時解決了首次加載全部

    2024年03月23日
    瀏覽(32)
  • 【Vue】vue2使用pdfjs預(yù)覽pdf文件,在線預(yù)覽方式一,pdfjs文件包打開新窗口預(yù)覽pdf文件

    【Vue】vue2使用pdfjs預(yù)覽pdf文件,在線預(yù)覽方式一,pdfjs文件包打開新窗口預(yù)覽pdf文件

    【Vue】vue2預(yù)覽顯示quill富文本內(nèi)容,vue-quill-editor回顯頁面,v-html回顯富文本內(nèi)容 【Vue】vue2項目使用swiper輪播圖2023年8月21日實戰(zhàn)保姆級教程 【Vue】vue2使用pdfjs預(yù)覽pdf文件,在線預(yù)覽方式一,pdfjs文件包打開新窗口預(yù)覽pdf文件 提示:這里可以添加本文要記錄的大概內(nèi)容: vue

    2024年02月07日
    瀏覽(26)
  • vue-pdf實現(xiàn)pdf文件在線預(yù)覽

    在日常的工作中在線預(yù)覽 PDF 文件的需求是很多的,下面介紹一下使用 vue-pdf 實現(xiàn)pdf文件在線預(yù)覽 使用 npm 安裝 vue-pdf npm install vue-pdf 使用 vue-pdf 顯示 PDF 文件 此時頁面中就會顯示我們提供的 PDF 文件了,但是此時只顯示了 PDF 文件的第一頁 按頁顯示 PDF 文件 使用 vue-pdf 能滿足

    2024年02月13日
    瀏覽(30)
  • 前端預(yù)覽pdf文件

    前端預(yù)覽pdf文件

    在前端開發(fā)中,很多時候我們需要進行pdf文件的預(yù)覽操作,下面給出幾種常見的預(yù)覽pdf文件的方法: 如果項目對pdf的預(yù)覽功能要求不高,只是要求能夠看的話,可以直接在瀏覽器上打開pdf文件的地址,代碼如下 PDF.js是一個由Mozilla開發(fā)的JavaScript庫,用于在網(wǎng)頁上呈現(xiàn)和操作

    2024年02月15日
    瀏覽(21)
  • 移動端頁面預(yù)覽pdf文件

    移動端頁面預(yù)覽pdf文件

    我們在項目中經(jīng)常會遇到預(yù)覽pdf文件的需求,對pc端來說實現(xiàn)這樣的功能相對簡單,因為可以直接在瀏覽器中打開文件鏈接進行預(yù)覽,這里就不再詳細介紹了。今天主要介紹一下手機端頁面如何實現(xiàn)pdf的預(yù)覽,無論是手機端web項目還是app中嵌入的web頁面,我們均可以通過pdf.

    2024年02月16日
    瀏覽(19)
  • 前端如何預(yù)覽pdf文件流

    前端如何預(yù)覽pdf文件流

    通過查找資料,可以找到如下幾種方案,其中最為成熟的方案是vue-pdf 1. iframe 既可以用來瀏覽本地static下的文檔,也可以預(yù)覽后端返回的文件流文檔 2. vue-pdf?較為完善的vue預(yù)覽pdf的方案 3. vueshowpdf?網(wǎng)絡(luò)上找到的一個他人封裝的pdf組件 優(yōu)點 缺點 原理 iframe/object/embed 簡單易用

    2024年02月17日
    瀏覽(24)
  • uniapp PDF文件預(yù)覽/打開

    在微信小程序環(huán)境下需要配置pdf域名

    2024年01月19日
    瀏覽(23)
  • 利用PDF.js在微信小程序里預(yù)覽PDF文件

    在微信小程序可以通過wx.downloadFile 和 wx.openDocument 兩個api下載并打開pdf文件。這種方式主要有不少的缺點: 1、需要下載才可以查看,且每次打開都需要下載生成一個臨時文件,如果PDF文件比較多的話,臨時文件會越來越多,且如果PDF文件比較大的話,打開會比較慢。 2、在導(dǎo)

    2024年02月03日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包