首页 > 其他分享 >html2canvas使用记录

html2canvas使用记录

时间:2023-06-26 09:46:32浏览次数:30  
标签:canvas const img 记录 height html2canvas width 使用 document

1.生成图片有白边/黑边

设置 backgroundColor:#ffffff

2.本地生成图片没有白边/黑边,打包后生成图片有白边/黑边

查看打印容器/父级是否有定位,宽度过大/过小等,去掉定位或限宽

3.生成图片模糊

设置 scale参数

4.文字错位

设置字体

5.外链图片不显示

设置 useCors:true,同时将打印区的图片转为base64

6.safari 下设置图片名称有长度限制

7.获取不到容器,使用querySelector

例子:

const savePic = async () => {
   ....
        await qmsInventoryTablePreview(index)
        await getBase64Image()
        await html2canvas((document.body.querySelector('div#canvas-print') as HTMLDivElement).querySelector('.content'), {
            useCORS: true, scale: 3, backgroundColor: '#ffffff',

        }).then((canvas: any) => {
            let time = ((new Date()).toLocaleString()).slice(0, -3).replace(/\//g, '-')
            filename = filename ? filename : time + '_' + (document.getElementById('canvas-name') as HTMLElement).innerText
            setTimeout(() => {
                Canvas2Image.saveAsImage(canvas, canvas.width, canvas.height, 'jpg', filename);
            }, 100)
        })
    }
}
const getBase64Image = () => {
    return new Promise((res, _) => {
        let imgList = (document.body.querySelector('div#canvas-print') as HTMLDivElement).querySelectorAll('img')
        if (imgList.length == 0) return
        var img = document.createElement('img');
        img.src = imgList[0].src;
        img.setAttribute("crossorigin", "anonymous")
        img.onload = function () {
            var canvas = document.createElement("canvas");
            canvas.width = img.width;
            canvas.height = img.height;
            var ctx = canvas.getContext("2d");
            ctx.drawImage(img, 0, 0, img.width, img.height);
            var dataURL = canvas.toDataURL("image/png");
            (document.body.querySelector('div#canvas-print') as HTMLDivElement).querySelectorAll('img')[0].setAttribute('src', dataURL);
            res(true)
        }
    })
}
const savePdf = async () => {
    if (!inventoryDetail.value) return;
    let pages = A4Mode.value ? inventoryDetail.value!.length / 20 : 1
    for (let index = 1; index < pages + 1; index++) {
        ......
        await getBase64Image()
        await html2canvas((document.body.querySelector('div#canvas-print') as HTMLDivElement).querySelector('.content'), { backgroundColor: '#ffffff', useCORS: true, scale: 3, scrollX: 0, scrollY: 0 }).then((canvas: any) => {
            const PDF = new JsPDF('p', 'mm', 'a4')
            const ctx = canvas.getContext('2d')
            const a4w = 190;
            const a4h = 277;
            const imgHeight = Math.floor((a4h * canvas.width) / a4w)
            let renderedHeight = 0;
            while (renderedHeight < canvas.height) {
                const page = document.createElement('canvas');
                page.width = canvas.width
                page.height = Math.min(imgHeight, canvas.height - renderedHeight)
                page.getContext('2d')?.putImageData(ctx.getImageData(0, renderedHeight, canvas.height, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0)
                PDF.addImage(page.toDataURL('image/jpeg', 1.0), 'JPEG', 10, 10, a4w, Math.min(a4h, (a4w * page.height) / canvas.width))
                renderedHeight += imgHeight;
                console.log(canvas.height)
                if (renderedHeight < canvas.height) {
                    PDF.addPage()
                }
            }
            let time = ((new Date()).toLocaleString()).slice(0, -3).replace(/\//g, '-')
            let filename = time + '_' + (document.getElementById('canvas-name') as HTMLElement).innerText 
            PDF.save(`${filename}.pdf`)
        })
    }
}        

 

标签:canvas,const,img,记录,height,html2canvas,width,使用,document
From: https://www.cnblogs.com/Merrys/p/17504528.html

相关文章

  • template上使用v-for报错
    在template标签上使用v-for报错cannotbekeyed.Placethekeyonrealelementsinstead查了一下百度,是因为key需要绑定在真实的元素上<templatev-for="(item,index)inmenu":key="index"></template>解决方法:1、将template标签替换成别的标签2、将key绑定值写在别的......
  • prometheus 使用 ipmi exporter 增加硬件级别监控
    prometheus监控硬件安装ipmitool并加载相应模块yuminstallipmitoolfreeipmi-ymodprobeipmi_msghandlermodprobeipmi_devintfmodprobeipmi_poweroffmodprobeipmi_simodprobeipmi_watchdog下载ipmi_exporter源码包wgethttps://github.com/soundcloud/ipmi_......
  • macbook m1 使用 brew 安装 nginx + 多版本 php
    目录macbookm1使用brew安装nginx+多版本php安装多个php版本1.配置php仓库2.安装多版本php3.配置php-pfm的端口4.启动php-pfm服务5.切换php-cli命令行的版本安装nginxmacbookm1使用brew安装nginx+多版本php在FastAdmin开发是,可能会用到多个p......
  • 使用 Debian、Docker 和 Nginx 部署 Web 应用
    前言本文将介绍基于Debian的系统上使用Docker和Nginx进行Web应用部署的过程。着重介绍了Debian、Docker和Nginx的安装和配置。第1步:更新和升级Debian系统通过SSH连接到服务器。更新软件包列表:sudoaptupdate升级已安装的软件包:sudoaptupgrade第2步......
  • Windows Common Log File System (CLFS) Driver,也称为CLFS.sys,是Windows操作系统中的
    WindowsCommonLogFileSystem(CLFS)Driver,也称为CLFS.sys,是Windows操作系统中的一个驱动程序。它提供了一个通用的日志文件系统框架,用于记录和管理系统、应用程序和服务的日志。CLFS.sys文件的路径通常位于Windows操作系统的系统目录中。具体的路径取决于安装Windows的......
  • 服务器与本地资源同步,在ubuntu自建git库,使用nginx远程http访问
    xshell在linux与windows之间传文件虽然方便,但使用git才能真正实现资源同步。为实现服务器与本地资源同步,在ubuntu服务器端自建git库。使用 git-http-backend 搭建git服务的原理都是类似的,主要是利用web服务器(apache/nginx)进行用户认证,并将用户信息传递给CGI程序 ......
  • Nginx反向代理&记录用户IP地址企业案例
    反向代理机器节点:lb0110.0.0.30#lb01是反向代理服务器(包括负载均衡的功能)www0110.0.0.40www0210.0.0.50【演示反向代理功能】 图片解读:使用客户端机器www01,访问负载均衡lb01(反向代理),看到了www01,www02页面信息在www01服务器上检测客户端信息,发现请求是10.0.0.3......
  • 【mysql】parseTime=true 参数说明以及如何在 GORM 中使用它避免 Scan error on colum
    什么是parseTime=true参数parseTime=true是一个MySQL数据库连接参数,它告诉MySQL驱动程序将日期时间类型的值解析为time.Time类型。在MySQL中,日期时间类型的值可以表示为字符串,例如2022-07-0113:30:00。默认情况下,MySQL驱动程序将这些值作为[]uint8类型返回,这可能......
  • NetCore使用使用Scaffold-DbContext命令生成数据库表实体类
    1.根据数据库生成实体类ModelsScaffold-DbContext"DataSource=.;InitialCatalog=TEST;UserID=sa;Password=pwd;TrustServerCertificate=True"Microsoft.EntityFrameworkCore.SqlServer-OutputDirModels-Force  2.根据数据表生成实体类ModelsScaffold-DbConte......
  • C#使用企业微信群机器人推送生产数据
      在日常的工作生产中,经常会有将将生产数据或者一些信息主动推送给相关的管理人员,我们公司在开发WMS系统时,为了仓库的储存安全,需要在危废品库存达到一定的储量时,自动通知仓管员去处理危废品,所以就需要程序自动的通过企业微信告知仓管员,这个时候就需要用到企业微信的机器人了。......