效果图:

前提:

公司要求生成一分报告并转为图片并保存,之前用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爬坑之路的更多相关文章

  1. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  2. Vue 爬坑之路(六)—— 使用 Vuex + axios 发送请求

    Vue 原本有一个官方推荐的 ajax 插件 vue-resource,但是自从 Vue 更新到 2.0 之后,官方就不再更新 vue-resource 目前主流的 Vue 项目,都选择 axios ...

  3. Vue 爬坑之路(九)—— 用正确的姿势封装组件

    迄今为止做的最大的 Vue 项目终于提交测试,天天加班的日子终于告一段落... 在开发过程中,结合 Vue 组件化的特性,开发通用组件是很基础且重要的工作 通用组件必须具备高性能.低耦合的特性 为了满 ...

  4. Vue 爬坑之路(一)—— 使用 vue-cli 搭建项目

    vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli vue ...

  5. Vue 爬坑之路(十二)—— vue-cli 3.x 搭建项目

    Vue Cli 3 官方文档:https://cli.vuejs.org/zh/guide/ 一.安装 @vue/cli 更新到 3.x 之后,vue-cli 的包名从 vue-cli 改成了 @vu ...

  6. Tinker爬坑之路

    目的 热修复去年年底出的时候,变成了今年最火的技术之一.依旧记得去年面试的时候统一的MVP,然而今年却变成了RN,热修复.这不得不导致我们需要随时掌握最新的技术.不然可能随时会被淘汰.记得刚进公司,技 ...

  7. 安卓易学,爬坑不易——腾讯老司机的RecyclerView局部刷新爬坑之路

    针对手游的性能优化,腾讯WeTest平台的Cube工具提供了基本所有相关指标的检测,为手游进行最高效和准确的测试服务,不断改善玩家的体验.目前功能还在免费开放中. 点击地址:http://wetest ...

  8. Android爬坑之路

    做了那么久前端,现在终于可以回到我的老本行, 今天我用了一天的时间配置里Android开发环境,mac和windows双平台,eclipse和IDEA双平台,别问为什么,我就喜欢,中间大坑不断,再加上 ...

  9. 安卓易学,爬坑不易—腾讯老司机的RecyclerView局部刷新爬坑之路

    前言 安卓开发者都知道,RecyclerView比ListView要灵活的多,但不可否认的里面的坑也同样埋了不少人.下面让我们看看腾讯开发工程师用实例讲解自己踩坑时的解决方案和心路历程. 话说有图有真 ...

  10. Tinker + Bugly + Jenkins 爬坑之路

    前阵子 Android 端的线上崩溃比较多,热修复被提上日程.实现方案是 Tinker,Jenkins 打包,最后补丁包上传到 Bugly 进行分发.主要在 Jenkins 打包这一块爬了不少坑,现记 ...

随机推荐

  1. B. Going to the Cinema

    https://codeforces.com/contest/1782/problem/B 题目大意就是给定n个人,每个人有一个除自己之外的最少陪同人数,选一部分人去电影院,要求去的人人数大于等于去的 ...

  2. 在 MAC 上 进行 iOS 的 Airtest 自动化测试(未完成)

    1. 用USB连接 iPhone 和 mac . 从 连接 https://github.com/AirtestProject/IOS-Tagent 下载iOS-Targent工程文件, 在左上角选择 ...

  3. java8中CompletableFuture异步处理超时

    java8中CompletableFuture异步处理超时的方法 Java 8 的 CompletableFuture 并没有 timeout 机制,虽然可以在 get 的时候指定 timeout,但 ...

  4. Ajax 后台传值接收方法

    $.ajax({ method: 'post', //数据类型 url: 'service.ashx?method=PostFile', //传输页面和页面方法 dataType: "jso ...

  5. 前端入门知识点笔记本之js重定位函数

    1. call().bind().apply()的用法,改变this的指向,区别在于f.call(obj, arg1, arg2...),f.bind(obj, arg1, arg2,...)(),f ...

  6. SpringBoot写第一个接口

    服务可以理解为一个接口,一个controller,一个做业务请求的 新建一个HelloWorldController import org.springframework.boot.SpringApp ...

  7. react-signature-canvas 签名功能

    基于移动端需要扫码签名的功能,这里记录一下. 1.使用 react-signature-canvas 插件,npm i react-signature-canvas --save 2.此功能签名后生成 ...

  8. List一边插入数据后又移除数据

    记录最简单的三种方法,直接上代码: List<String> list = new ArrayList<>(); list.add("1"); list.a ...

  9. ubuntu中用vscode

    下载vscode 终端中输入code运行 输入sudo apt-get update sudo apt-get install gcc 此报错解决方式: sudo rm /var/lib/dpkg/l ...

  10. Kubernetes快速部署

    Kubernetes快速部署 kubernetes简介 kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014 ...