VUE前端,小程序,APP签名盖章
签名盖章功能就是把图片(签名或盖章)
与背景图片(需要签名的文件,如PDF)
合并起来,生成一个新的图片
此功能的开发流程顺序:
- 显示背景PDF
- 操作PDF:手势缩放,回到顶部,上下翻页
- 手绘签字功能
- 显示签章图片
- 操作签章图片:拖动位置,修改大小,删除,确定
- 合并背景与签章,生成结果文件
详细开发流程
显示和操作PDF:
我使用的是pdfh5
引入
import Pdfh5 from "pdfh5"
import "pdfh5/css/pdfh5.css"
使用:url等同于img的src
这里我设置了maxZoom:1,意思是禁止缩放,默认为最大缩放3倍
this.pdfh5 = new Pdfh5("#preViewPdf", {
pdfurl: url,
maxZoom:1
})
元素
<div style="overflow: auto;height: 95%;">
<div id="preViewPdf"></div>
</div>
h5pdf自带的页码和回到首页功能

手绘签字功能:
使用的是vue-esign
引入
// import vueEsign from 'vue-esign' //使用库
import vueEsign from "@/components/vue-esign/src/index";//使用本地
使用
components: {
vueEsign
},
元素
<vueEsign ref="esign" :width="windowWidth" style="width: 100% !important;height:83vh !important;"
:isCrop="isCrop" :lineWidth="lineWidth" :lineColor="lineColor" :bgColor.sync="bgColor"></vueEsign>
vue-esign提供清空和保存功能:
this.$refs.esign.reset();//清空
this.$refs.esign.generate().then(res => {//保存
this.handleReset();
this.signSuccess(res);//res为base64文件
}).catch(err => {
console.log(err)
// this.$message.error('请签名之后提交!')
that.$toast.success("请签名之后提交");
})
},
此外,该控件还有画笔大小等设置功能
示例:

显示和操作签章图片:
代码比较长,这里不贴了
因为移动端和PC端不兼容,写了两个拖动代码
也有改图片大小和删除图片功能
总之就是一个简单的拖动图片和设置大小功能,示例:

合并背景与签章
使用的是html2canvas
引入
import html2canvas from "@/utils/html2canvas.js";
使用(删除了保存到后端接口的代码)
html2canvas(document.querySelector(".pdfViewer"), {
// 以下字段可选
// width: 490, // canvas宽度
// height: 240, // canvas高度
// x: 0, // x坐标
// y: 0, // y坐标
foreignObjectRendering: true, // 是否在浏览器支持的情况下使用ForeignObject渲染
useCORS: true, // 是否尝试使用CORS从服务器加载图像
async: false, // 是否异步解析和呈现元素
// 以下字段必填
background: "#ffffff", // 一定要添加背景颜色,否则出来的图片,背景全部都是透明的
scale: 2, // 处理模糊问题
dpi: 300, // 处理模糊问题
onrendered: function (canvas) {
// https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement/toDataURL
// let url = canvas.toDataURL('image/png', 1.0)
let url = canvas.toDataURL();
console.log(url);
// },
// });
// html2Canvas(document.querySelector('.pdfViewer'), {
// allowTaint: true
// }).then(function (canvas) {
let contentWidth = canvas.width
let contentHeight = canvas.height
let pageHeight = (contentWidth / 592.28) * 841.89
let leftHeight = contentHeight
let position = 0
let imgWidth = 595.28
let imgHeight = (592.28 / contentWidth) * contentHeight
let pageData = canvas.toDataURL('image/jpeg', 1.0)
let PDF = new JsPDF('', 'pt', 'a4')
if (leftHeight < pageHeight) {
PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
} else {
while (leftHeight > 0) {
PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
leftHeight -= pageHeight
position -= 841.89
if (leftHeight > 0) {
PDF.addPage()
}
}
}
// PDF.save(title + '.pdf')
// let file = that.base64ConvertFile(PDF.output("dataurlstring"),"test.pdf");
pageData = PDF.output("dataurlstring");
// console.log(pageData);
// that.showCopperDialog = false;
// // //调用
// var arr = pageData.split(',');
var blob = that.dataURLtoBlob(pageData);
// const contentType = "image/jpeg"; // 文件类型
const contentType = 'application/pdf'; // 文件类型
const file = new File([blob], "pdf.pdf", {
type: contentType,
lastModified: Date.now()
});
let fileFormData = new FormData();
fileFormData.append("file", file);
},
}
)
html2canvas的保存注意事项:
页面需全部显示,不能又缩放
页面不能滚动到下面或者右边,要再保存前设置页面滚动复原
// window.pageYoffset = 0;
// console.log(document.querySelector(".pdfViewer").scrollTop+=10);
// console.log(document.querySelector(".pdfViewer").parentElement.scrollTop+=10);
//防止截图不全
document.querySelector(".pdfViewer").parentElement.parentElement.scrollTop = 0
document.querySelector(".pdfViewer").parentElement.parentElement.scrollLeft = 0
代码:gitee地址:https://gitee.com/jiongjiongys/sigz
407a4f37-fd09-4b00-873c-0eaa1ca3b473
VUE前端,小程序,APP签名盖章的更多相关文章
- Java生鲜电商平台-优惠券功能设计与开发(小程序/APP)
Java生鲜电商平台-优惠券功能设计与开发(小程序/APP) 说明:Java生鲜电商平台-优惠券功能设计与开发(小程序/APP) 目录 1.项目背景与需求分析 2.需求目的与功能点列表 3.业务逻辑 ...
- 小程序app.js小结
小程序app.js app.js import { ApiUrl } from 'utils/apiurl.js'; import { httpReq } from 'utils/http.js'; ...
- 基于uniapp自定义Navbar+Tabbar组件「兼容H5+小程序+App端Nvue」
uni-app跨端自定义navbar+tabbar组件|沉浸式导航条|仿咸鱼凸起标签栏 在跨端项目开发中,uniapp是个不错的框架.采用vue.js和小程序语法结构,使得入门开发更容易.拥有非常丰富 ...
- 【实战】SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 基于SpringBoot+uniapp简单通讯聊天软件 项目介绍 JavaDog Chat 简单通讯聊天软件是基于SpringBoot+MybatisPlus+ ...
- 微信小程序APP生命周期
小程序APP生命周期需要先从app.js这个文件开始,App() 必须在 app.js 中调用,必须调用且只能调用一次,app.js中定义了一些应用的生命周期函数 onLaunch----当小程序初始 ...
- 微信小程序-APP生命周期与运行机制
QQ讨论群:785071190 开发微信小程序之前需要先了解微信小程序运行机制以及其生命周期,小程序APP生命周期需要先从app.js这个文件开始. 阅读过"微信小程序-代码构成" ...
- Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP)
Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP) 说明:最近群里面的一个网友问的一个问题,让我陷入了深思,他问的问题很基础也很真实,"大佬,你们是怎么学习的呢?" ...
- vue制作小程序--mpvue
mpvue是一个使用 Vue.js 开发小程序的前端框架 http://mpvue.com/ sass的使用 https://segmentfault.com/q/1010000014194954 n ...
- 基于uni-app全端弹框组件uaPopup「兼容h5+小程序+app端|nvue」
uniapp兼容多端自定义模态弹框组件UAPopup ua-popup 一款轻量级的uniapp自定义弹窗组件.汇集了android.ios和微信弹窗效果(msg消息.alert提示框.dialog对 ...
- 微信小程序 app.json 配置
我们使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. 以下是一个包含了所有配置选项的简单配置app.json : { " ...
随机推荐
- Flask快速入门4-蓝图
十六,Flask 用蓝图实现模块化的应用 1,Flask 为什么使用蓝图? Flask 中的蓝图为这些情况设计: 把一个应用分解为一个蓝图的集合.这对大型应用是理想的.一个项目可以实例化 一个应用对象 ...
- ORA-01779: 无法修改与非键值保存表对应的列”中涉及的概念和解决方法
什么是键值保存表(Key-Preserved Table)? 在理解什么是键值保存表之前,首先要知道 可更新的联接视图 这个概念,键值保存表只是保存了允许更新的字段信息的一张表.为什么会出现这么一张表 ...
- 面试官:工作中优化MySQL的手段有哪些?
MySQL 是面试中必问的模块,而 MySQL 中的优化内容又是常见的面试题,所以本文来看"工作中优化MySQL的手段有哪些?". 工作中常见的 MySQL 优化手段分为以下五大类 ...
- .NET Cas 认证(基于Cookie)
项目需求:开发系统A 对接客户公司的cas 认证系统 B,实现单点登录 业务场景描述:打开A 系统地址,判断Cookie 是否登录状态,如果未登录,跳转B登录界面:如果已登录,直接获取到cookie ...
- 【C#】Winform监听USB串口设备拔插实现自动断开
[C#]Winform监听USB串口设备拔插 零.问题 最近在开发串口相关的软件,需要检测串口拔掉后主动关闭串口,因此需要检测到USB的拔插事件. 一.解决 在主窗口From类下覆盖WndProc方法 ...
- python练习-爬虫
场景: 1.网址hppt://xxx.yyy.zzz.cn2.打开网页后显示 : 3.填上姓名 身份证和验证码,点击查询后,返回查询结果. 4.页面有cookie. 方案一: 程序中嵌入浏览器根据网址 ...
- WPF旋转板栈设计一例
效果图 项目中需要做一个机台的平面视图,点击其中一个料盒时,弹出该料盒的料管列表,用WPF示例做了一下,效果如下: 用户控件XAML 1 <UserControl x:Class="W ...
- JVM 垃圾回收时产生的 concurrent mode failure 的原因是什么?
JVM 垃圾回收时产生的 concurrent mode failure 的原因是什么? 在 JVM 中,concurrent mode failure 是垃圾回收器(通常是 CMS,即 Concur ...
- Salt之Cpu 100%无响应故障 Salt request timed out. The master is not responding
报错信息如下: Salt request timed out. The master is not responding. You may need to run your command with ...
- [亲测]ThinkPHP中where方法中变量不解析的解决方法
2018年5月4日 01:15 血的教训,今天做一个项目,需要批量更新数据,所以where中必须用变量.发现where里的变量不解析并且会直接报错,然后通过搜索发现可以在双引号中的左右加号中包裹变量 ...