cavans实现签名并且转化图片并且下载未pdf

1  html

    

    <div>
       <canvas id="canvasDom" className={styles.canvas} ref={canvasDom} width="350" height="150" />
    </div>
   <el-button @click="downPdf">下载PDF</el-button>
  </div>

2  选择插件

  

import html2Canvas from 'html2canvas';
import { jsPDF } from "jspdf"

3 签名函数

canvasFn(
            beginX, //: number,
            beginY, //: number,
            stopX, //: number,
            stopY, //: number,
            ctx // any,
        ) {
            //定义签名函数
            const writing = (
                beginX, //: number,
                beginY, //: number,
                stopX, //: number,
                stopY, //: number,
                ctx // any,
            ) => {
                ctx.beginPath(); // 开启一条新路径
                ctx.globalAlpha = 1; // 设置图片的透明度
                ctx.lineWidth = 3; // 设置线宽
                ctx.strokeStyle = 'red'; // 设置路径颜色
                ctx.moveTo(beginX, beginY); // 从(beginX, beginY)这个坐标点开始画图
                ctx.lineTo(stopX, stopY); // 定义从(beginX, beginY)到(stopX, stopY)的线条(该方法不会创建线条)
                ctx.closePath(); // 创建该条路径
                ctx.stroke(); // 实际地绘制出通过 moveTo() 和 lineTo() 方法定义的路径。默认颜色是黑色。
            };
            writing(
                beginX, //: number,
                beginY, //: number,
                stopX, //: number,
                stopY, //: number,
                ctx // any,
            );
        }

 

4  触发时监听

   注意:beginX = event.touches[0].clientX - this.offsetLeft; //不减会出现多余的比画,其他同理

let beginX, beginY;
        const canvas = document.getElementById('canvasDom'); //canvasDom.current;
        const ctx = canvas.getContext('2d');
        ctx.fillStyle = '#014578';
        ctx.fillRect(0, 0, canvas.width, canvas.height);
        canvas.addEventListener('touchstart', function(event) {
            event.preventDefault(); // 阻止在canvas画布上签名的时候页面跟着滚动
            beginX = event.touches[0].clientX - this.offsetLeft;
            beginY = event.touches[0].pageY - this.offsetTop;
        });
        canvas.addEventListener('touchmove', event => {
            event.preventDefault(); // 阻止在canvas画布上签名的时候页面跟着滚动
            event = event.touches[0];
            let stopX = event.clientX - canvas.offsetLeft;
            let stopY = event.pageY - canvas.offsetTop;
            this.canvasFn(beginX, beginY, stopX, stopY, ctx);
            beginX = stopX; // 这一步很关键,需要不断更新起点,否则画出来的是射线簇
            beginY = stopY;
        });

    5  转化图片并且下载未pdf

     注意:默认高度从0开始计算,

print() {
            let dom = document.getElementById('canvasDom');
            // console.log( html2Canvas)
             html2Canvas(dom, {
                allowTaint: true,
                width: 300, //设置获取到的canvas宽度
                height: 150, //设置获取到的canvas高度
                x: 0, //页面在水平方向滚动的距离
                y: 0 //页面在垂直方向滚动的距离
            }).then(canvas => {
                console.log(canvas)
                let canvasWidth = canvas.width;
                let canvasHeight = canvas.height;
                let pageHeight = (canvasWidth / 592.28) * 841.89; // 一页A4 pdf能显示的canvas高度
                let imgWidth = 595.28; // 设置图片宽度和A4纸宽度相等
                let imgHeight = (592.28 / canvasWidth) * canvasHeight; //等比例换算成A4纸的高度
                let totalHeight = imgHeight; // 需要打印的图片总高度,初始状态和图片高度相等
                let pageData = canvas.toDataURL('image/png', 1.0);
                console.log(canvasWidth,canvasHeight,pageHeight,imgWidth,imgHeight,totalHeight,pageData)
                let PDF = new jsPDF('p', 'pt', 'a4', true);
                if (totalHeight < pageHeight) {
                    //
                    PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight); // 从顶部开始打印
                } else {
                    let top = 0; // 打印初始区域
                    while (totalHeight > 0) {
                        PDF.addImage(pageData, 'JPEG', 0, top, imgWidth, imgHeight); // 从图片顶部往下top位置开始打印
                        totalHeight -= pageHeight;
                        top -= 841.89;
                        if (totalHeight > 0) {
                            PDF.addPage();
                        }
                    }
                }
                PDF.save('test.pdf');
            });
        },

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值