效果图:

前提:

公司要求生成一分报告并转为图片并保存,之前用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. Python使用requests和requests_toolbelt上传文件

    1.requests-toolbelt官方文档:https://pypi.org/project/requests-toolbelt/ 2.环境安装 pip install requests-tool ...

  2. JavaScript 调用Bomb后端云

                                                     用简单的代码 展示代码的魅力 Bmob 是后端云 全方位一体化的后端服务平台 提供可靠的 Server ...

  3. Coursera Programming Languages, Part B 华盛顿大学 Week 1

    来上 programming language 的第二 part 了!这一部分介绍的语言是 Racket,之前就听说过它独特的括号语法,这次来具体了解一下 Racket definitions, fu ...

  4. 【2020NOI.AC省选模拟#8】C. 海盗

    题目链接 原题解: 可以发现,在给定的规则下,若前$i$个人参与分配,则每个人得到的金币个数是固定的. 假设在前$i-1$个海盗参与分配时,某个海盗能得到$x$个金币,则第$i$个海盗需要给他$x+1 ...

  5. mysql查询锁表和表解锁的操作

    转载自:https://www.cnblogs.com/qianxiaoruofeng/p/15542468.html 第一种 1.查询是否锁表 show OPEN TABLES where In_u ...

  6. 用java读取Excel并依据模板图生成对应的图片

    package test; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java. ...

  7. java循环中的break和continue的小笔记

    代码1: for(int i=0;i<10;i++){ System.out.println(i); continue; System.out.println("flag") ...

  8. Leetcode本地阅读器开发--01界面设计三

    这篇文章主要写一下怎样实现定类别查找. 1 void Widget::on_comboBox_currentIndexChanged(int index) 2 { 3 QString sortname ...

  9. python学习(day4)

    1.selenium库 import selenium #使用selenium跳过登陆 '''selenium pip install selenium ''' from selenium impor ...

  10. 【转载】matlab常用函数

    第一篇:Matlab软件函数 一.软件操作函数 1)命令窗口函数: clc:清空命令窗口,使用向上箭头翻看命令. open:打开文件,文本文件(*.doc),可执行文件(*.exe),图形文件(*.f ...