• 保姆级vue-pdf的使用过程


    第一步  引入vue-pdf

    npm install --save vue-pdf

    第二步 按照需求我们慢慢进行

    01.给你一个pdf文件的url,需要在页面渲染

    代码

    1. <script>
    2. import pdf from 'vue-pdf'
    3. export default {
    4. components: {
    5. pdf
    6. },
    7. data() {
    8. return {
    9. url: "http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf",
    10. }
    11. }
    12. }
    13. script>

    这只是初体验,如果你的pdf只有一页,这样写当然没什么问题,但是当我们呢pdf 有很多页的时候,你会发现,这行不通了。所以,接下来,我们来看看怎么让它显示多页。

    02.渲染多页面的pdf

    1. <script>
    2. import pdf from 'vue-pdf'
    3. export default {
    4. components: {
    5. pdf
    6. },
    7. data() {
    8. return{
    9. url: '',
    10. numPages: 1,
    11. pdf: ''
    12. }
    13. },
    14. created() {
    15. this.pdf = require('vue-pdf')
    16. console.log('获取的pdf', this.pdf)
    17. },
    18. mounted: function() {
    19. this.getNumPages("http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf")
    20. },
    21. methods: {
    22. getNumPages(url) {
    23. var loadingTask = pdf.createLoadingTask(url)
    24. // var loadingTask = this.pdf.default.createLoadingTask(url)
    25. loadingTask.promise.then(pdf => {
    26. this.url = loadingTask
    27. this.numPages = pdf.numPages
    28. }).catch((err) => {
    29. console.error('pdf加载失败')
    30. })
    31. },
    32. }
    33. }
    34. script>

    这里边如果你省去了promise,控制台会报错如下

     vue.runtime.esm.js:4605 [Vue warn]: Error in mounted hook: "TypeError: loadingTask.then is not a function"

    还有需要了解的是你的 vue-pdf对象可以通过import去引,也可以通过require去引

    各个属性:

    • url :pdf 文件的路径,可以是本地路径,也可以是在线路径。
    • numPages : pdf 文件总页数。

    getNumPages 计算总页数,顺便给url和numPages赋值。

    注意啊,这句不一定非要写到mounted里面,你想写哪就写哪,比如你前端请求后端,后端返回一个pdf 的url,在那里写就行,写在你需要的地方。

    03.想不想让你的pdf带有分页交互及打印的功能,直接代码

    1. <script>
    2. import pdf from 'vue-pdf'
    3. export default {
    4. name: 'Home',
    5. components: {
    6. pdf
    7. },
    8. data() {
    9. return {
    10. url: "http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf",
    11. pageNum: 1,
    12. pageTotalNum: 1,
    13. pageRotate: 0,
    14. // 加载进度
    15. loadedRatio: 0,
    16. curPageNum: 0,
    17. }
    18. },
    19. mounted: function() {},
    20. methods: {
    21. // 上一页函数,
    22. prePage() {
    23. var page = this.pageNum
    24. page = page > 1 ? page - 1 : this.pageTotalNum
    25. this.pageNum = page
    26. },
    27. // 下一页函数
    28. nextPage() {
    29. var page = this.pageNum
    30. page = page < this.pageTotalNum ? page + 1 : 1
    31. this.pageNum = page
    32. },
    33. // 页面顺时针翻转90度。
    34. clock() {
    35. this.pageRotate += 90
    36. },
    37. // 页面逆时针翻转90度。
    38. counterClock() {
    39. this.pageRotate -= 90
    40. },
    41. // 页面加载回调函数,其中e为当前页数
    42. pageLoaded(e) {
    43. this.curPageNum = e
    44. },
    45. // 其他的一些回调函数。
    46. pdfError(error) {
    47. console.error(error)
    48. },
    49. }
    50. }
    51. script>
    • page: 当前显示的页数,比如第一页page=1
    • rotate : 旋转角度,比如0就是不旋转,+90,-90 就是水平旋转。
    • progress :当前页面的加载进度,范围是0-1 ,等于1的时候代表当前页已经完全加载完成了。
    • page-loaded :页面加载成功的回调函数,不咋能用到。
    • num-pages :总页数
    • error :加载错误的回调
    • link-clicked:单机pdf内的链接会触发。

    04.加载本地pdf的功能

    先安装file-loader:

    npm install --save file-loader

     然后在vue.config.js中加入以下内容:

    1. module.exports = {
    2. chainWebpack: config => {
    3. const fileRule = config.module.rule('file')
    4. fileRule.uses.clear()
    5. fileRule
    6. .test(/\.pdf|ico$/)
    7. .use('file-loader')
    8. .loader('file-loader')
    9. .options({
    10. limit: 10000,
    11. })
    12. },
    13. publicPath: './'
    14. }

    之后再url:require("../assets/1.pdf")就没有任何问题了,注意,vue-pdf src接收的是string对象,如果直接传url我这里报错了,你可能需要传url.default一下。

    其他

    打印界面字符乱码:

    这个我倒是碰到了,谷歌浏览器打印的时候,预览界面真的变成了 真·方块字 ,全是方块。这个问题是因为你pdf中使用了自定义字体导致的,具体解决方案如下:

    首先,找到这个文件:node_modules/vue-pdf/src/pdfjsWrapper.js

    然后根据github上这个issue,其中红色的是要删掉的,绿色的是要加上去的,照着改就可以解决了。

    地址: github.com/FranckFreib…

    根据我的实际测试,是可以解决打印乱码的问题的。

    跨域问题:

    网上用pdf.js 很多都会遇到跨域问题,这个我今天实际应用到自己的项目里面了,由于我服务端设置了跨域,所以没有出现跨域的问题,如果出现跨域需要修改你后端的请求头。

    写到这里已经是下班了,感谢老铁们的点赞,你们的点赞是我努力进步的动力

  • 相关阅读:
    GP08|财务&估值因子过滤实盘小市值
    WeakMap 弱引用 不会被GC所考量
    项目启动端口被占用 -- Web server failed to start. Port 8082 was already in use.
    spring进阶学习记录
    JAVA:实现合并排序的 ArrayList算法(附完整源码)
    微信小程序组件仿某音
    Mysql面试
    MySQL高级-SQL优化- update 优化(尽量根据主键/索引字段进行数据更新,避免行锁升级为表锁)
    福州大学《嵌入式系统综合设计》实验四:边缘检测
    VVC 预测值写入TXT文件(xCheckModeSplit()函数未写完)
  • 原文地址:https://blog.csdn.net/2201_75705263/article/details/134383308