主頁 > 移動端開發 > 實作微信小程式和手機app(基于vue)PDF預覽功能

實作微信小程式和手機app(基于vue)PDF預覽功能

2021-12-17 09:04:33 移動端開發

引言:最近在做微信小程式和手機端app開發(基于vue),實作一個pdf預覽功能,

  • 需求:點擊pdf串列,跳轉到預覽pdf頁面,頁面上強制閱讀10s后,顯示一個按鈕回傳,更新閱讀狀態;
  • 要求:不能呼叫本地瀏覽器預覽,不能讓用戶下載pdf,強制閱讀10s后才可回傳;
  • 準備:pdf在線檔案:“http://cn.createpdfonline.org/pdffiles/test(20211215094117).pdf”

1.微信小程式端

  1. 方式一:webview
<web-view src="http://cn.createpdfonline.org/pdffiles/test(20211215094117).pdf" ></web-view>

運行結果在這里插入圖片描述
分析

  • 上述結果是在ios系統上運行的,pdf可以正常顯示;
  • 在android系統上,決議失敗,一直顯示空白界面;
  • 原因:ios可以自動決議pdf,安卓系統則決議不了;
  • 補充:在webview標簽上顯示按鈕,相信做過微信小程式開發的都了解webview標簽會默認占滿全屏,覆寫掉其他組件,這個時候如果我們想加一個按鈕就可以用cover-view標簽來實作,具體實作大家可以自己去探索,

總結:使用webview標簽在系統上兼容性并不好,不能控制下載狀態,而且在閱讀狀態上只能做到“假控制”,

2.手機app端(vue)

1. 使用 iframe、embed、新視窗打開

        <iframe class="iframe" src="http://cn.createpdfonline.org/pdffiles/test(20211215094117).pdf"></iframe>

        <embed class="iframe" src="http://cn.createpdfonline.org/pdffiles/test(20211215094117).pdf">

優點:簡單,支持大部分 PC 瀏覽器(IE 不支持),跨域資源同樣可以(無需 cors)
缺點:不支持移動端瀏覽器,不支持 IE 等低版本瀏覽器,樣式無法自定義,

2. 使用vue中的組件vue-pdf

安裝:打開命令列,直接使用npm或者yarn安裝

npm install --save vue-pdf
<template>
    <div class="pdf_wrap">
        <div class="pdf_list">
            <pdf  :src="src"  style="width: 100%" ref="pdf"> </pdf>
        </div>
    </div>
</template>

<script>
    import pdf from 'vue-pdf'
    export default {
        name: 'myTestOne',
        components: {
            pdf
        },
        data () {
            return {
                src: 'http://cn.createpdfonline.org/pdffiles/test(20211215094117).pdf',

            }
        },
        methods: {


        }
    }
</script>
<style scoped>
    .pdf_wrap {
        background: #fff;
        height: 100vh
    }
    .pdf_list {
        height: 80vh;
        overflow: scroll;
    }

</style>

當你運行這段代碼時(在pdf鏈接沒過期的情況下),你會驚奇地發現,會出現跨域問題,并報出以下錯誤:
跨域報錯
解決方案一
你需要聯系你的后端小伙伴,因為PDF 檔案作為靜態資源放在 nginx服務器中,
在 nginx.conf 中設定:

add_header Access-Control-Allow-Credentials true;
 add_header Access-Control-Allow-Origin $http_origin;

完整配置如下:

server {
	listen       80;
	server_name  localhost;
	
    add_header Access-Control-Allow-Credentials true;
    add_header Access-Control-Allow-Origin $http_origin;
    
    location / {
        root   pdf;
        index  index.html index.htm;
    }
}

解決方案二(存在問題,后期研究)
和vue 介面請求解決跨域問題一樣,在本地開發時同樣通過 webpack的devServer去代理pdf預覽的url(請求),其他環境(生成及測驗)則讓后端去解決,

解決開發環境pdf預覽跨域問題就是在devServer中添加一個代理即可:

//vue.config.js
proxy: {
            //當pdf和資料介面不在同一個請求地址下時,為pdf預覽追加一個代理
             "/pdf": {
                target:"http://cn.createpdfonline.org/pdffiles",
                changeOrigin: true,
                pathRewrite: {
                    '^/pdf': ''
                }
            }
        }

運行結果如下:
在這里插入圖片描述
重新保存專案,這個pdf就會顯示在你的眼前,但是別高興得太早,這個pdf只有一頁,所以在這個基礎上進行以下優化:

  • 顯示多頁pdf
  • 顯示pdf總頁數
  • 實作一頁一頁翻pdf的功能
  • 監控當前頁面加載進度

代碼實作(多頁顯示):

<template>
    <div class="pdf_wrap">
        <div class="pdf_list">
            <pdf   v-for="i in numPages" :key="i" :page="i" :src="url"  style="width: 100%"  > </pdf>
        </div>
    </div>
</template>

<script>
    import pdf from 'vue-pdf'

    export default {
        name: 'myTestOne',
        components: {
            pdf
        },
        data () {
            return {
                src: 'http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf',
                numPages:1,
                url:''

            }
        },
        mounted: function() {
            this.getNumPages()

        },
        methods: {
            getNumPages() {
                this.url = pdf.createLoadingTask(this.src)
                this.url.promise.then(pdf => {
                    this.numPages = pdf.numPages // 這里拿到當前pdf總頁數
                })
            },
        }
    }
</script>
<style scoped>
    .pdf_wrap {
        background: #fff;
        height: 100vh
    }
    .pdf_list {
        height: 100vh;
        overflow: scroll;
    }

</style>

結果展示:
在這里插入圖片描述

該代碼在pdfjsWrapper.js檔案的第196行會報錯,(偷摸給注釋掉了)

			//pdfRender.cancel().catch(function(err) {
					//emitEvent('error', err);
				//});

代碼實作(單頁展示,可翻頁):

<template>
    <div>
        <div class="tools">
            <bk-button :theme="'default'" type="submit" :title="'基礎按鈕'" @click.stop="prePage" class="mr10"> 上一頁</bk-button>
            <bk-button :theme="'default'" type="submit" :title="'基礎按鈕'" @click.stop="nextPage" class="mr10"> 下一頁</bk-button>
            <div class="page">{{pageNum}}/{{pageTotalNum}} </div>
            <bk-button :theme="'default'" type="submit" :title="'基礎按鈕'" @click.stop="clock" class="mr10"> 順時針</bk-button>
            <bk-button :theme="'default'" type="submit" :title="'基礎按鈕'" @click.stop="counterClock" class="mr10"> 逆時針</bk-button>
        </div>
        <pdf ref="pdf"
             :src="url"
             :page="pageNum"
             :rotate="pageRotate"
             @progress="loadedRatio = $event"
             @page-loaded="pageLoaded($event)"
             @num-pages="pageTotalNum=$event"
             @error="pdfError($event)"
             @link-clicked="page = $event">
        </pdf>
    </div>
</template>
<script>
    import pdf from 'vue-pdf'
    export default {
        name: 'Home',
        components: {
            pdf
        },
        data() {
            return {
                url: "http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf",
                pageNum: 1,
                pageTotalNum: 1,
                pageRotate: 0,
                // 加載進度
                loadedRatio: 0,
                curPageNum: 0,
            }
        },
        mounted: function() {},
        methods: {
            // 上一頁函式,
            prePage() {
                var page = this.pageNum
                page = page > 1 ? page - 1 : this.pageTotalNum
                this.pageNum = page
            },
            // 下一頁函式
            nextPage() {
                var page = this.pageNum
                page = page < this.pageTotalNum ? page + 1 : 1
                this.pageNum = page
            },
            // 頁面順時針翻轉90度,
            clock() {
                this.pageRotate += 90
            },
            // 頁面逆時針翻轉90度,
            counterClock() {
                this.pageRotate -= 90
            },
            // 頁面加載回呼函式,其中e為當前頁數
            pageLoaded(e) {
                this.curPageNum = e
            },
            // 其他的一些回呼函式,
            pdfError(error) {
                console.error(error)
            },
        }
    }
</script>
<style scoped>
    

</style>

結果展示:
在這里插入圖片描述
**總結:**在實際測驗中發現以下問題

  • 場景:一個pdf串列,點擊每個pdf預覽;
  • 結果:在ios系統中偶爾會出現白屏的狀態,而在android系統中沒有這個問題,

經過以上的嘗試后,最后決定基于vue.js來實作業務要求,

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/382908.html

標籤:其他

上一篇:Flutter三棵樹理解

下一篇:某跨境出口電商APP引數解密

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more