微信小程序云开发如何将页面生成为pdf?

项目场景:

最近有小伙伴问了一个问题,那就是微信小程序云开发如何将页面生成为pdf?但是在没有后端工程师的协助下,我们要怎么办了?


解决方案:

于是便逛了一下微信社区,但很遗憾腾讯baba没有给出相应的api或解决方案,好在有神奇的留言,最终找到了关键词,那就是wxml→canvas→img→pdf,wxml转化转化成canvas之后在生成img,微信官方已经给出了组件wxml-to-canvas可以解决,那么img转化成pdf要怎么办呢?可以用pdf-lib,好在看到了黄宝~这位大佬的文章,省去了很多时间去理解文档。


效果图:

可以从GIF中看到,我已经把要用到的功能都写完善了,点击生成pdf后会生成一张图片存到云服务器,之后会调用云函数把图片转换成pdf文件并上传到云服务器(转换后其实可以把多余的图片删了,但是为了直观一点我就不处理了),这样我们就可以拿云服务器上https链接来用了。因为小程序还不支持把pdf文件保存到手机上,所以只能自己复制链接去浏览器下载了。
请添加图片描述
在实机上,微信会提供预览功能但是不可以直接下载,自己复制下载链接到浏览器下载就好。

请添加图片描述

Demo部分:

代码我就不粘出来了,有点多,需要的话有积分可以下载CSDN的,没有的话下载百度云的就好。

CSDN=》传送门
百度网盘=》提取码:agvk =》传送门

下载代码 Demo后,导入项目时用自己开通过云开发的AppID就好
在这里插入图片描述
接着把app.js里的云环境id换成你自己的,
在这里插入图片描述
接着打开img-to-pdf云函数里的index.js文件,把云环境id换成你自己的,
在这里插入图片描述
最后就是上传云函数了,务必记得上传,上传完就可以用了。
在这里插入图片描述
另外img-to-pdf云函数里的node包里安装了pdf-lib,为了方便本地测试,我就不删除了。代码的话主要部分都写了注释,问题不大,应该都能看懂。


动态设置参数:

因为这的wxml是一串字符串,所以不能向样式那样通过点的形式去更新,所以如果需要动态设置参数的话,需要把字符串标签提取出来写在renderToCanvas方法里,如果数据是数组对象类型,那么用for循环拼接一下字符就好了,字符串拼接可以参考这篇文章=》传送门

const {style} = require('./wxml.js');

Page({
  data: {
    src: ''
  },

  onLoad() {
    // 为了美观,把画布的宽度设置成屏幕的100%
    style.container.width = wx.getSystemInfoSync().windowWidth;
    // 获取wxml-to-canvas组件的节点
    this.widget = this.selectComponent('.widget')
    // 模拟调用接口
    setTimeout(() => {
      // 假设从后端获取到了数据
      let name = "weianl"
      this.renderToCanvas(name)
    })
  },

  // 把页面数据渲染到canvas
  renderToCanvas(name) {
    const wxml = `<view class="container">
                    <view class="item-box red">
                    <text class="text">${name}</text>
                    </view>
                    <view class="arrows">
                      <text class="text">↓</text>
                    </view>
                    <view class="item-box green">
                      <text class="text">cavans ☛ img</text>
                    </view>
                    <view class="arrows">
                      <text class="text">↓</text>
                    </view>
                    <view class="item-box blue">
                      <text class="text">img ☛ pdf</text>
                    </view>
                  </view>`
    this.widget.renderToCanvas({
      wxml,
      style
    }).then((res) => {
      // console.log('container', res.layoutBox)
      this.container = res
    }).catch(err => {
      // console.log(err)
      // 防止canvas组件没有初始化完成
      setTimeout(() => {
        this.renderToCanvas(name)
      }, 100);
    })
  },

  // 生成pdf
  createPDF() {
    wx.showLoading({
      title: '生成中',
    })
    this.widget.canvasToTempFilePath().then(res => {
      console.log(res)
      let tempFilePath = res.tempFilePath;
      // 定义存放到云服务器的文件夹及图片名字
      const cloudPath = 'wxmlToPdf-img/' + parseInt(new Date().getTime() / 1000) + '.png';
      // 把图片上传到云服务器
      wx.cloud.uploadFile({
        cloudPath: cloudPath,
        filePath: tempFilePath, // 文件路径
      }).then(res => {
        console.log(res)
        // 调用图片转化PDF云函数
        wx.cloud.callFunction({
          name: 'img-to-pdf',
          data: {
            width: this.container.layoutBox.width,
            height: this.container.layoutBox.height,
            fileID_img: res.fileID
          }
        }).then(res => {
          console.log(res)
          wx.hideLoading()
          this.setData({
            fileID_pdf: res.result.data.fileID,
            https_pdf: res.result.data.pdf
          })
          wx.showToast({
            title: '生成成功!',
            icon: 'none'
          })
        })
      }).catch(error => {
        // handle error
      })

    })
  },

  // 预览PDF
  previewPDF() {
    // pdf文件在云服务器的id
    let fileID_pdf = this.data.fileID_pdf;
    // console.log(fileID_pdf)
    if (!fileID_pdf) {
      wx.showToast({
        title: '请先生成PDF',
        icon: 'none'
      })
      return false;
    }
    wx.showLoading({
      title: '加载中',
    })
    wx.cloud.downloadFile({
      fileID: fileID_pdf
    }).then(res => {
      // console.log(res)
      wx.openDocument({
        filePath: res.tempFilePath,
        success: function (res) {
          wx.hideLoading();
        }
      })
    }).catch(error => {
      // handle error
    })
  },

  // 复制PDF链接
  copyPDF() {
    // PDF文件在云服务器上的https链接
    let https_pdf = this.data.https_pdf;
    // console.log(https_pdf)
    if (!https_pdf) {
      wx.showToast({
        title: '请先生成PDF',
        icon: 'none'
      })
      return false;
    }
    wx.setClipboardData({
      data: https_pdf,
      success(res) {
        wx.showToast({
          title: '复制成功,快到浏览器打开/下载!',
          icon: 'none',
          duration: 3000
        })
      }
    })
  }

})

最后想补习云函数的可以点击这里哦!! 传送门

  • 14
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
### 回答1: 微信小程序开发教程 PDF是一份教你如何开发微信小程序的电子书籍。微信小程序是一种轻量级的应用程序,它们可以在微信中直接运行,与APP类似,但不需要下载和安装。微信小程序开发需要一定的前端知识和微信公众平台开发经验,学习微信小程序开发需要有一定的耐心和时间。 微信小程序开发教程PDF涵盖了从入门到进阶的内容,适合初学者和有一定经验的开发者。它包括了微信小程序的基本概念、开发工具、框架、组件库和API等内容,还涵盖了微信小程序的设计原则、权限管理、数据存储和优化技巧等。此外,它还提供了编程实例和项目案例,帮助开发者快速上手并熟练掌握微信小程序开发技能。 学习微信小程序开发有很多好处,可以帮助你开发出轻量级、高效的应用程序,提高你的编程技能和工作竞争力。如果你想成为一名优秀的微信小程序开发者,你需要不断学习和实践,掌握新的技术和工具,并建立你自己的开发风格和项目经验。 ### 回答2: 微信小程序是一种轻量级的应用程序,可以在微信客户端内部运行,并且不需要像普通应用程序一样需要下载和安装。微信小程序的用户体验良好,具有快速加载、易于发布和分享等特点,因此被广泛应用于社交媒体、电商、线下场景等领域。 想要开发微信小程序,您可以查阅微信小程序开发教程PDF,这是一份系统、详细且权威的教程资料,涵盖了微信小程序的开发流程、技术要点、开发工具、调试排错、上线发布等方面的内容,可以帮助您快速上手、快速开发微信小程序。 在学习微信小程序开发教程PDF时,您需要先了解HTML、CSS、JavaScript等相关基础知识,并掌握微信小程序开发的三个重要组部分:WXML模板、WXSS样式和JavaScript代码。同时,您还需要掌握微信小程序开发的基本流程和工具,例如使用微信开发者工具进行开发、调试和发布微信小程序。 总的来说,学习微信小程序开发教程PDF需要一定的编程基础和实践经验,但不需要过多的技术经验,只要您有兴趣、有热情、有耐心,并且具备学习的动力,相信您一定可以掌握微信小程序的开发技能,并创造出更加有趣、实用的微信小程序作品。 ### 回答3: 微信小程序开发教程pdf是一本关于微信小程序开发的教程书。该书采用了全面系统的授课方式,通过积累自上到下、从零开始逐步实现微信小程序的开发,让读者能够更好地理解微信小程序的运行原理和开发技巧。 首先,该书对微信小程序的开发环境、工具和基本结构进行了介绍和讲解,为读者打下了坚实的基础。接着,书中详细讲解了小程序的各个组件,包括视图容器、页面渲染、数据绑定、事件处理等内容,并通过实例演示了如何在应用程序中使用这些组件。 同时,该书还介绍了微信小程序的开发规范和最佳实践,让读者能够更好地了解并掌握微信小程序的开发流程和开发技巧。另外,该书还包含了许多实例代码和详细的讲解,方便读者进行实战练习和调试。 总之,微信小程序开发教程pdf是一本系统全面、讲解详细、实例丰富的微信小程序开发教材,既适合初学者入门,也适合有一定基础的开发者提高技能。它不仅能够帮助读者掌握微信小程序开发的基础知识和技巧,还能够让读者了解到微信小程序开发市场的前景和未来趋势。
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值