前言
纯前端(基于vue2)实现对上传的pdf,进行盖章或签名后,并将处理后的pdf下载下来
目标
1 实现pdf上传与预览
2 实现手动签名,签名与印章的拖拽移动
3 将盖章或签名的文件进行绘制与下载
实现效果展示
所用的第三方依赖
- pdfh5 实现pdf文件的在线预览
- vue-esign 在画布上面签名,生成签名图片
- html2canvas html绘制图片
- jspdf 生成pdf、下载pdf
大致的逻辑
盖章与签名以图片的形式在pdf预览上进行拖拽,拖拽到pdf上
将拖拽的图片dragImg放到pdfViewer下,循环pdfViewer下的元素如果有dragImg
文件目录
DragImg组件:主要是实现图片的拖拽效果
inedx主文件:文件的上传预览等
SignImg组件:签名组件
接下来,一步一步去实现我们所需的效果
1 pdf文件上传
用el-upload
实现上传并监听before-upload
事件,在before-upload事件中限制文件大小、格式、类型等,若文件符合使用FileReader()
方法将文件转化为Base64,url接收Base64
数据(本文用的是Base64实现文预览效果)。
若你想pdf5中使用地址
方式,可以在上传成功之后将文件下载到项目的对应位置,并将地址信息保存在url属性中。
2 pdf在线预览
安装
npm i pdfh5 -S
引入
import Pdfh5 from “pdfh5”
import “pdfh5/css/pdfh5.css”
使用
其它可参考pdf5说明文档<https://www.npmjs.com/package/pdfh5>
3 手动签名
将签名封装到SignImg组件中
安装
npm i vue-esign -S
引入
使用vue-esign生成签名照
使用了<vueEsign></<vueEsign>
标签来调用 vue-esign 插件,并通过设置 width
和 height
属性来自定义签字区域的大小。isCrop
设置是否裁剪,lineWidth
画笔粗细,lineColor
画笔颜色。
签名完成通过handleGenerate
方法将签名转化为图片
最终效果
上传印章
、盖章
以及签名照片的对象都是图片,通过拖拽图片
从而实现pdf的签名与盖章效果。
以下就不再对以上操作进行一一的详细展示,仅对说明如何实现图片拖拽效果
4 拖拽效果
封装一个DragImg
拖拽组件,将签名图片以及电子印章图片都放在这个组件中,从而实现签名与印章在pdf中的拖拽效果。
自定义拖拽指令drag
父元素绑定自定义指令,子元素展示图片
组件中的元素使用的是相对于父元素的绝对定位
5 pdf下载
会用到的第三放插件是JsPDF
与html2canvas
在下载之前,先大致讲一下盖章与签字到pdf上的处理逻辑
1 将dragImg放到.pdfViewer
元素下,通过循环查询.pdfViewer下的元素当className == 'dragImg'
。
根据dragImg.style.top - pdfViewer.style.top
,计算图片应插入第几页,修改dragImg绝对定位后将dragImg插入相对应的.pageContainer元素下。签名或者印章在对应的页面中。
2 html2canvas
将每一页绘制成图片,通过addPage
创建空白页与addImage
添加图片,实现pdf的生成。
3 PDF.save
()下载生成的pdf。
先说明一下 一会儿会用到的几个元素的id
.pdfViewer 存放整个pdf
.pageContainer pdf中的一页(多页就多个兄弟pageContainer)
.dragImg 是你拖拽的签名或者印章图
创建印章并拖拽
将签名或者印章方法对应的页面中
完整代码下载地址:
<https://download.csdn.net/download/weixin_45291798/88580529?spm=1001.2014.3001.5503>
其他
依赖安装报错解决
npm install canvas@2.8.0 --ignore-scripts
只执行npm install canvas会报新的错误