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 打包这一块爬了不少坑,现记 ...
随机推荐
- vim ctrl+s 不能再操作
vim下编写代码不自觉按到Ctrl+S,此时vim就不能再操作了.发现vim下Ctrl+S是阻止之后的输入,可通过Ctrl+Q来解除.
- go 单测
1.在需要测试的go文件同级目录下创建${需要测试的文件名}_test.go文件 2. err, info :函数的返回值 "account-base-dd",1:传进去的参数 f ...
- css 伪类实现渐变线条
如下图所示: 需要实现渐变的小竖线或者小横线 可以用伪类, 代码如下: div { position: relative; z-index: 2; &::after{ content: ''; ...
- Docker基本命令之 容器管理
容器管理 查看正在运行的容器: docker ps 查看完整信息:docker ps --no-trunc 查看在运行或停止运行的容器:docker ps -a 查看容器系统资源的使用情况:docke ...
- openSUSE Tumbleweed 安装原生微信
优麒麟网站上有提供下载. 之前用 Ubuntu的时候,直接安装就可以使用. ...
- 数组(Java)
数组的定义 数组是相同类型数据的有序集合 数组描述的是相同类型的若干数据,按照一定的先后次序排列组合而成 其中,每个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们 数组的声明和创建 基本 ...
- 《Linux就该这么学》这本书写得真好,我很喜欢。
本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Linux教材,也是最有价值 ...
- 去除input框相关样式,只显示内容
<input /> css代码: .edit-input{ /* width: 20px; */ height: -webkit-fill-available; background: i ...
- InnoDB和MyISAM的区别(超详细)
1.事务 InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务: ...
- 小白开始成长了+洛谷1488与CF629A Far Relative’s Birthday Cake题解
终于开始我的博客生活了,希望博客可以让我记住学了什么,错了什么,接下来会有什么将出现. 记录写ACM生涯中的一些经验和网工经验吧,如果有人看我博客的话,希望可以留言给我提提意见,指导指导我啦~~~ 正 ...