html2canvas 简介及使用(踩坑)jsPdf使用注意事项(pdf 分页)

7 篇文章 0 订阅
5 篇文章 0 订阅

需求目标:实现当前页面数据截图并保存为pdf

实现需求需要处理:

  • 处理部分dom样式

  • 跨域图片的处理

  • 添加平铺水印

  • 增加图片的清晰度

  • 将canvas转化为pdf

  • 下载图片

  • 上传图片

 

1. 当前页面长度过长,html2canvas手机上无法转化

我的解决方案:设置scale

https://github.com/niklasvh/html2canvas/issues/1915

html2canvas(document.body, {
            scale: window.devicePixelRatio > 2 ? 2: window.devicePixelRatio
          }).then(...);

 

2. 图片转化为pdf文件时,文件过大时:

doc.addImage(
    imgDataURL,
    'JPEG'/'PNG',
    0,
    0,
    width,
    height,
    '',
    'FAST'
);

 

 

使用jsPdf:

const doc = new JSPDF('', 'pt', [
   width * 0.75,
   height * 0.75,
]);

注意事项:

  1. 如果你的宽高使用的是px,在传参的时候需要乘以0.75
  2. 手机上doc.save无法下载
  3. 需要通过jsPdf返回Blob对象,使用
    var blob = doc.output('datauristring');

     

  4. 移动端使用doc.output,会刷新页面(存疑,大家可以注意下)

 

html2canvas:

通过纯JS对浏览器端经行截屏,但截图的精确度还有待提高,部分css不可识别,所以在canvas中不能完美呈现原画面样式

 

api

名称默认描述
allowTaintfalse是否允许跨域图像污染画布
backgroundColor#ffffff画布背景色(如果未在DOM中指定)。设置null为透明
backgroundColornull现有canvas元素用作绘图的基础
foreignObjectRenderingfalse如果浏览器支持,是否使用ForeignObject渲染
imageTimeout15000加载图像的超时时间(以毫秒为单位)。设置0为禁用超时。
ignoreElements(element) => false可从渲染中删除匹配的元素。
loggingtrue启用日志记录以进行调试
onclonenull克隆文档以进行渲染时调用的回调函数可用于修改将要渲染的内容,而不会影响原始源文档。
proxynull代理将用于加载跨域图像的网址。如果留空,则不会加载跨域图像。
removeContainertrue是否清除HTML2canvas临时创建的克隆DOM元素
scalewindow.devicePixelRatio用于渲染的比例尺。默认为浏览器设备像素比率。
useCORSfalse是否尝试使用CORS从服务器加载图像
widthElement 宽度canvas的宽度
高度Element 高度canvas的高度
XElement X偏移裁剪画布X坐标
yElement y偏移裁剪画布y坐标
scrollXElement 滚动X渲染元素时要使用的x滚动位置(例如,如果Element使用position: fixed
scrollYElement 滚动呈现元素时要使用的y-scroll位置(例如,如果Element使用position: fixed
windowWidthWindow.innerWidth渲染时使用的窗口宽度Element,这可能会影响媒体查询之类的内容
windowHeightWindow.innerHeight渲染时要使用的窗口高度Element,这可能会影响媒体查询之类的内容

不支持的css属性


pdf 分页处理

createDoc() {
    const _width = canvas.width
    const _height = canvas.height
    const a4Width = 595.28  // a4 实际宽度
    const a4Height = 841.89 // a4 实际高度
    // a4 单位转化为px的高度
    const pageHeight = (_width / a4Width) * a4Height;
    // 图片的高度 转化为pt单位
    const imgHeight =
        (a4Width / _width) * _height;

    //未生成pdf的html页面高度
    let leftHeight = _height;
    let doc = new JSPDF('', 'pt', 'a4');
    let position = 0;
    if (leftHeight < pageHeight) {
        doc.addImage(
            `${this.imgBase64}`,
            'JPEG',
            0,
            0,
            a4Width,
            imgHeight,
            '',
            'FAST'
        );
    } else {
        while (leftHeight > 0) {
            doc.addImage(
                `${this.imgBase64}`,
                'JPEG',
                0,
                position,
                a4Width,
                imgHeight,
                '',
                'FAST'
            );
            leftHeight -= pageHeight;  // px
            position -= a4Height; // pt
            // 避免添加空白页
            if (leftHeight > 0) {
                doc.addPage();
            }
        }
    }
    return doc;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值