wxml2canvas爬坑之路
效果图:

前提:
公司要求生成一分报告并转为图片并保存,之前用canvas画过,但这次是在不想用canvas一点点画了,再往上找了n久,爬了n多坑,终于搞出来了
插件:
wxml2canvas
一:下载插件
npm install wxml2canvas
二:构建npm
微信开发者工具: 工具 --> 构建npm
三:使用
import Wxml2Canvas from 'wxml2canvas'
好了,坑开始了!!!!!!!!!!!!
坑一:引入一直报错
解决方法
重新下载了好几次wxml2canvas,又清了缓存n次
总结:微信开发者工具太辣鸡了
坑二:文字不换行
解决方法:
data-type="inline-text"
text标签的 data-type 由 text 修改为 inline-text
坑三:文字按整个canvas的宽度来换行,超过的部位还被裁了

解决方法:手动换行
计算这里一行最多可以放几个文字,然后把这一段文本分割成几行,最后循环遍历显示
<view class="function">
<text class="my_draw_canvas" wx:for="{{instructionTextList}}" wx:key="index" data-type="inline-text" data-text="{{item}}">
{{item}}
</text>
<!-- <text class="my_draw_canvas" data-type="inline-text" data-text="测试测试测测试测试测试测试测试测试测试测试测试测试测试测试试测试">
测试测试测测试测试测试测试测试测试测试测试测试测试测试测试试测试
</text> -->
</view>
坑四:最后的图片不显示wxss中写的border代码

解决方法:
let drawMyImage = new Wxml2Canvas({
element: 'myCanvas', // canvas的id,
obj: that, // 传入当前组件的this
options: {class: ".exc-c",limit: ".limit-r",},
width: that.data.width * 3,
height: that.data.height * 3,
// width: 794,
// height: 1123,
background: '#ffffff', // 生成图片的背景色
progress(percent) { // 进度
// console.log(percent);
},
finish(url) { // 生成的图片
console.log('url',url)
wx.hideLoading()
that.savePoster(url)
},
error(res) { // 失败原因
console.log(res);
wx.hideLoading()
}
}, this);
let data = {
// 获取wxml数据
list: [
{
type: 'wxml',
class: '.my_canvas .my_draw_canvas', // my_canvas要绘制的wxml元素根类名, my_draw_canvas单个元素的类名(所有要绘制的单个元素都要添加该类名)
limit: '.my_canvas', // 要绘制的wxml元素根类名
x: 0,
y: 0,
},
{ //绘制横线 logo下面
type: 'line', x: 10, y: 50,x2:760,y2:50,
style: {
width: 1,
stroke: '#000'
}
},
{ // 车牌下面
type: 'line', x: 10, y: 178,x2:760,y2:178,
style: {
width: 1,
stroke: '#000'
}
},
{// 检测部位 下面
type: 'line', x: 170, y: 208,x2:760,y2:208,
style: {
width: 1,
stroke: '#000'
}
},
{// 功能/作用 下面
type: 'line', x: 10, y: 318,x2:760,y2:318,
style: {
width: 1,
stroke: '#000'
}
},
{// 正常状态 下面
type: 'line', x: 10, y: 354,x2:760,y2:354,
style: {
width: 1,
stroke: '#000'
}
}, // {// 画竖线 左边
// type: 'line', x: 10, y: 178,x2:10,y2:that.data.height-186,
// style: {
// width: 1,
// stroke: '#000'
// }
// },
// {// 画竖线 右边
// type: 'line', x: 760, y: 178,x2:760,y2:that.data.height-186,
// style: {
// width: 1,
// stroke: '#000'
// }
// },
// {// 车牌照片 右边
// type: 'line', x: 170, y: 178,x2:170,y2:318,
// style: {
// width: 1,
// stroke: '#000'
// }
// },
// {// 检测部位 右边
// type: 'line', x: 250, y: 178,x2:250,y2:318,
// style: {
// width: 1,
// stroke: '#000'
// }
// },
]
}
// 绘制canvas
drawMyImage.draw(data, this);
坑五:不同型号手机显示错位
好不容易填了一下第四个坑,但是屏幕越大的手机,线条往右下方偏移越严重
希望的样式:(12pro)

(13pro) (ipad)

以上我感觉是不能用 type: 'line' 一条条地画了,搞了整整两三天,最终放弃
最后解决方法:在需要画线的地方,插入一个view当做一条线
<view class="my_draw_canvas" data-type="text" style="width: 80px;height: 1px;background: rgba(0, 0, 0, 1);"></view>
<view class="my_draw_canvas" data-type="text" style="width: 1px;height: 1000px;background: rgba(0, 0, 0, 1);"></view>
以上,线条可以在不同型号、版本的手机上完美呈现
然而,坑依然没有结束!!!!!!!!!!!!!
坑六:下载后图片不显示
因为写静态页面的时候都是引入本地的图片,所以点击导出的时候是完全没有问题的,但是换成了后台动态数据,要根据地址去显示服务器上的图片的时候,就开始作妖了!!!!!
解决方法:先把图片下载至本地
wx.downloadFile({
url: `图片地址`,
success: function(res){
let leftLogo = res.tempFilePath
if(res.dataLength > 0){
that.setData({
leftLogo:leftLogo,
})
}else{
that.setData({
leftLogo:"",
})
}
},
fail: function (error) {
wx.showToast({
title: "预下载左侧logo失败",
icon: 'none'
})
}
})
<image class="my_draw_canvas" src="{{leftLogo}}" data-type="image" data-url="{{leftLogo}}"></image>
以上就是我画图的所有心累里程
后续还有两个bug没解决:
bug一:微信开发者工具中导出图片有问题,但手机上没问题
(电脑) (手机)

bug二:手机上有问题,电脑上没有
(电脑) (手机)

后续有解决方法了再补充
------2023-3-14
wxml2canvas爬坑之路的更多相关文章
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求
Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...
- Vue 爬坑之路(九)—— 用正确的姿势封装组件
迄今为止做的最大的 Vue 项目终于提交测试,天天加班的日子终于告一段落... 在开发过程中,结合 Vue 组件化的特性,开发通用组件是很基础且重要的工作 通用组件必须具备高性能.低耦合的特性 为了满 ...
- Vue 爬坑之路(一)—— 使用 vue-cli 搭建项目
vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli vue ...
- Vue 爬坑之路(十二)—— vue-cli 3.x 搭建项目
Vue Cli 3 官方文档:https://cli.vuejs.org/zh/guide/ 一.安装 @vue/cli 更新到 3.x 之后,vue-cli 的包名从 vue-cli 改成了 @vu ...
- Tinker爬坑之路
目的 热修复去年年底出的时候,变成了今年最火的技术之一.依旧记得去年面试的时候统一的MVP,然而今年却变成了RN,热修复.这不得不导致我们需要随时掌握最新的技术.不然可能随时会被淘汰.记得刚进公司,技 ...
- 安卓易学,爬坑不易——腾讯老司机的RecyclerView局部刷新爬坑之路
针对手游的性能优化,腾讯WeTest平台的Cube工具提供了基本所有相关指标的检测,为手游进行最高效和准确的测试服务,不断改善玩家的体验.目前功能还在免费开放中. 点击地址:http://wetest ...
- Android爬坑之路
做了那么久前端,现在终于可以回到我的老本行, 今天我用了一天的时间配置里Android开发环境,mac和windows双平台,eclipse和IDEA双平台,别问为什么,我就喜欢,中间大坑不断,再加上 ...
- 安卓易学,爬坑不易—腾讯老司机的RecyclerView局部刷新爬坑之路
前言 安卓开发者都知道,RecyclerView比ListView要灵活的多,但不可否认的里面的坑也同样埋了不少人.下面让我们看看腾讯开发工程师用实例讲解自己踩坑时的解决方案和心路历程. 话说有图有真 ...
- Tinker + Bugly + Jenkins 爬坑之路
前阵子 Android 端的线上崩溃比较多,热修复被提上日程.实现方案是 Tinker,Jenkins 打包,最后补丁包上传到 Bugly 进行分发.主要在 Jenkins 打包这一块爬了不少坑,现记 ...
随机推荐
- java GUI AWT包
第一个GUI程序,在netbeans里因为没有自动导包,害的我差点崩溃,因为没有导入AWT包,所以 public class Jfram { /** * @param args the command ...
- STM32工程建立
STM32工程建立 对于用keil5建立stm32工程有两种方法,一种在学习过程中比较方便的建立方式:我们称为工程方式一,另一个便是在实际工程中用的最多,也最普遍,在实际过程中用的最多的,我们称为工程 ...
- 23 Django--Q的使用
方式1: models.xx.objects.filter(Q(id=10)) models.xx.objects.filter(Q(id=10)&Q(age=10) # and models ...
- JS缓存三种方法_sessionStorage_localStorage_Cookie
1.sessionStorage:临时的会话存储 只要当前的会话窗口未关闭,存储的信息就不会丢失,即便刷新了页面,或者在编辑器中更改了代码,存储的会话信息也不会丢失. 2.localStorage:永 ...
- 1903021126 申文骏 Java 第四周作业 Java分支语句学习
项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 Java第四周作业 博客名称 1903021126 申文骏 Java 第四周作业 Java分支语句学习 要求 每道题要有题目,代码( ...
- SQL servr——基础篇之DML增删改查
DML:数据操作语言 用于添加.更新.删除和查询数据库中的语言 添加--insert语句 向数据表中插入新的行(记录)可多行可一行 语法:insert [into] 表名 [(column1,. ...
- Shell脚本基本命令5
1.sort的稳定性 例以前面两个字段为键值,排序这四行 $ sort -t_ -k1,1 -k2,2 <<EOF one_two one_two_three one_two_four ...
- 免费Linux RDP,用来练习linux或者Python,还能做成远程桌面
分类:资源| 阅读:1103次阅读 goorm提供了免费的Linux容器,用它来在线练习命令行是非常不错的. 它的注册非常简单:https://ide.goorm.io/ 直接用谷歌账号登录即 ...
- .netCore Nuget包引用记录
1.画图 System.Drawing.Common 2.
- doy 20 系统优化
系统优化 1.yum源的优化 CentOS base epel 自建yum仓库使用一个较为稳定的仓库wget -O /etc/yum.repos.d/CentOS-Base.repo h ...