签名盖章功能就是把图片(签名或盖章)

与背景图片(需要签名的文件,如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签名盖章的更多相关文章

  1. Java生鲜电商平台-优惠券功能设计与开发(小程序/APP)

    Java生鲜电商平台-优惠券功能设计与开发(小程序/APP) 说明:Java生鲜电商平台-优惠券功能设计与开发(小程序/APP) 目录 1.项目背景与需求分析 2.需求目的与功能点列表 3.业务逻辑 ...

  2. 小程序app.js小结

    小程序app.js app.js import { ApiUrl } from 'utils/apiurl.js'; import { httpReq } from 'utils/http.js'; ...

  3. 基于uniapp自定义Navbar+Tabbar组件「兼容H5+小程序+App端Nvue」

    uni-app跨端自定义navbar+tabbar组件|沉浸式导航条|仿咸鱼凸起标签栏 在跨端项目开发中,uniapp是个不错的框架.采用vue.js和小程序语法结构,使得入门开发更容易.拥有非常丰富 ...

  4. 【实战】SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目

    JavaDog Chat v1.0.0 基于SpringBoot+uniapp简单通讯聊天软件 项目介绍 JavaDog Chat 简单通讯聊天软件是基于SpringBoot+MybatisPlus+ ...

  5. 微信小程序APP生命周期

    小程序APP生命周期需要先从app.js这个文件开始,App() 必须在 app.js 中调用,必须调用且只能调用一次,app.js中定义了一些应用的生命周期函数 onLaunch----当小程序初始 ...

  6. 微信小程序-APP生命周期与运行机制

    QQ讨论群:785071190 开发微信小程序之前需要先了解微信小程序运行机制以及其生命周期,小程序APP生命周期需要先从app.js这个文件开始. 阅读过"微信小程序-代码构成" ...

  7. Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP)

    Java生鲜电商平台-关于学习生鲜电商平台的思考(小程序/APP) 说明:最近群里面的一个网友问的一个问题,让我陷入了深思,他问的问题很基础也很真实,"大佬,你们是怎么学习的呢?" ...

  8. vue制作小程序--mpvue

    mpvue是一个使用 Vue.js 开发小程序的前端框架 http://mpvue.com/ sass的使用 https://segmentfault.com/q/1010000014194954 n ...

  9. 基于uni-app全端弹框组件uaPopup「兼容h5+小程序+app端|nvue」

    uniapp兼容多端自定义模态弹框组件UAPopup ua-popup 一款轻量级的uniapp自定义弹窗组件.汇集了android.ios和微信弹窗效果(msg消息.alert提示框.dialog对 ...

  10. 微信小程序 app.json 配置

    我们使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. 以下是一个包含了所有配置选项的简单配置app.json : { " ...

随机推荐

  1. Linux下对LVM逻辑卷分区大小调整 [针对xfs和ext4文件系统]

    当我们在安装系统的时候,由于没有合理分配分区空间,在后续维护过程中,发现有些分区空间不够使用,而有的分区空间却有很多剩余空间.如果这些分区在装系统的时候使用了lvm(前提是这些分区要是lvm逻辑卷分区 ...

  2. 基于DotNetty实现自动发布 - 背景篇

    故事背景 小公司,单体项目,接口和页面都在一起,生产和测试环境都是 Windows 服务器和 IIS, 本地编译完成,把相关的页面和程序集拷贝到服务器上,尤其是涉及到多个页面,一个个页面找到对应的位置 ...

  3. String类的特点

    1.String类的特点 1.java程序中,只要是双引号字符串,就都是String类的对象 如图 只有String这一个类有这种特殊的创建对象方法 我们知道,只有对象才可以通过 点什么来调用方法,而 ...

  4. Condition的await()方法底层源码

    一.Condition的await()方法底层源码 以下是 ConditionObject 中 await 方法的源码及其详细分析: public final void await() throws ...

  5. mybatis的模糊查询的实现方式

    一.比较灵活 1:xml的配置 <select id="selectUserByUsername1" parameterType="string" res ...

  6. 什么是 MySQL 的主从同步机制?它是如何实现的?

    什么是 MySQL 的主从同步机制?它是如何实现的? MySQL 的主从同步机制是一种将主数据库(Master)上的数据实时或接近实时地同步到从数据库(Slave)的机制.通过这种机制,从数据库可以获 ...

  7. Windows系统设置开机自启动+分块压缩+文件共享

    开机自启动+分块压缩+文件共享 一.设置开机自启动 win+R 打开运行窗口,输入 shell:startup 此时桌面会弹出一个目录文件夹,只需要将需要启动的软件放入该文件夹即可开机自启. C:\U ...

  8. test-同步111

    视频如何拍? 旅拍技巧 旅拍微电影必拍内容 只要用这个思路,用手机拍也可以,只是相机效果更好一些. #小雨朵 #摄影教学 #旅行vlog #川西美景 #把生活拍成电影 - 抖音 (douyin.com ...

  9. 可持久化 01-trie 简记

    本文略过了 trie 和 可持久化的介绍,如果没学过请先自学. 在求给定一个值 \(k\) 与区间中某些值的异或最大值时,可以考虑使用在线的数据结构可持久化 01-trie 来维护. 01-trie ...

  10. Sentinel——热点规则

    目录 热点规则 配置热点规则 API配置热点规则 热点规则 热点规则是用于实现热点参数限流的规则.热点参数限流指的是,在流控规则中指定对某方法参数的 QPS 限流后,当所有对该资源的请求URL中携带有 ...