【jspdf】前端html生成pdf的两种办法 以及 引入中文字体

这篇具有很好参考价值的文章主要介绍了【jspdf】前端html生成pdf的两种办法 以及 引入中文字体。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

导出pdf有下面两种方法

1、使用canvas把html生成图片,然后使用jspdf生成pdf。优点:生成的pdf 样式还原度极高,缺点:图片形式的pdf无法编辑
2、直接使用jspdf的html方法直接把html生成pdf。优点:可编辑,缺点:只是把文本内容搂出来生成pdf,也就是说样式基本无,而且jspdf不支持中文字体的,如果有中文字体需要一 一引入字体

一、从图片导出pdf

1、安装插件html2canvas、jspdf

 yarn add jspdf
yarn add html2canvas

2、使用

//html使用的是Ant Design Vue框架,pdf_content为生成canvas区域
<div ref="pdf_content">
     <a-table :loading="loading" :dataSource="dataSource" :columns="columns" :pagination="ipagination" @change="handleTableChange" /> 
</div>
// js
import html2canvas from 'html2canvas'
import JsPDF from 'jspdf'

getpdf() { // 未分页
            const pdf_content = this.$refs.pdf_content
            html2canvas(pdf_content, {backgroundColor: '#fff', useCORS: true}).then((canvas) => { // 获取图片
                const dataURL = canvas.toDataURL('image/png')
                console.log(dataURL) // 生成的图片
                var contentWidth = canvas.width
                var contentHeight = canvas.height
                // 一页pdf显示html页面生成的canvas高度;
                var pageHeight = (contentWidth / 592.28) * 841.89
                // 未生成pdf的html页面高度
                var leftHeight = contentHeight
                // 页面偏移
                var position = 0
                // a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
                var imgWidth = 595.28
                var imgHeight = (595.28 / contentWidth) * contentHeight
                var pageData = canvas.toDataURL('image/jpeg', 1.0)
                var pdf = new JsPDF('', 'pt', 'a4')
                // 有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
                // 当内容未超过pdf一页显示的范围,无需分页
                if (leftHeight < pageHeight) {
                    // 在pdf.addImage(pageData, 'JPEG', 左,上,宽度,高度)设置在pdf中显示;
                    pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
                    // pdf.addImage(pageData, 'JPEG', 20, 40, 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('订单列表')
            })
        }

三、可能出现的问题
Ant Design Vue框架的分页组件中的一个样式影响了html2canvas,生成图片会缺失数字部分,如下图
【jspdf】前端html生成pdf的两种办法 以及 引入中文字体
【jspdf】前端html生成pdf的两种办法 以及 引入中文字体
a标签中的display: block;样式会导致导出图片中a标签内的内容没有显示成功,需要手动修改样式

/deep/ .ant-pagination-item a {
    display: unset;
}

二、html方法直接把html生成pdf

1、引入字体

ttf转js工具点击下载项目到本地,打开下面的文件
【jspdf】前端html生成pdf的两种办法 以及 引入中文字体
打开fontconverter,页面如下图
【jspdf】前端html生成pdf的两种办法 以及 引入中文字体

选择需要的字体的ttf文件,点击选择文件进行上传转换(一些字体可以在电脑本地找到地址:C:\Windows\Fonts)
【jspdf】前端html生成pdf的两种办法 以及 引入中文字体
上传后点击Create下载一个js文件,把这个文件放在项目中
【jspdf】前端html生成pdf的两种办法 以及 引入中文字体
在页面引入字体:require("@/utils/simhei-normal"); 字体转为js的时候都处理好了,只需要引入就可以直接使用了
【jspdf】前端html生成pdf的两种办法 以及 引入中文字体
在生成pdf之前使用pdf.setFont("simhei");设置字体即可文章来源地址https://www.toymoban.com/news/detail-495261.html

2、生成pdf

	var pdf = new jsPDF("x", "pt", [595, 750]);
      pdf.setFont("simhei"); // 使用字体
      const source = document.getElementsByClassName("content")[0];
      var options = {
        pagesplit: false, //设置是否自动分页
        background: "#FFFFFF", //如果导出的pdf为黑色背景,需要将导出的html模块内容背景 设置成白色。
      };
      await pdf.html(source, {
        callback: function (pdf1) {
          pdf1.save("test.pdf");
        },
        margin: [30, 0, 30, 0],
      });
      pdf.save("test.pdf");

到了这里,关于【jspdf】前端html生成pdf的两种办法 以及 引入中文字体的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue基于html2canvas和jspdf生成pdf文件,解决jspdf中文乱码及自动换行等问题

    在做项目时有这么一个需求,需要将当前页面指定区域的内容导出pdf到本地。借助了两个插件分别是html2canvas.js和pdf.js来实现。使用过程中遇到的问题及解决方法 解决一些问题: 导出按A4纸大小排列 预留页面边距的问题 内容过多自动分页的问题 直接使用jspdf中文乱码的问题

    2024年01月25日
    浏览(45)
  • 前端vue基于html2canva jspdf 实现前端页面加水印 并导出页面PDF

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月03日
    浏览(29)
  • (vue)Vue项目中使用jsPDF和html2canvas生成PDF

    效果: 1.:安装jsPDF和html2canvas 2.在需要生成PDF文档的组件中引入jsPDF和html2canvas 解决参考: 1.https://www.jianshu.com/p/31d37bef539b 2.https://www.php.cn/faq/556634.html 3.https://blog.csdn.net/m0_54967474/article/details/123820384

    2024年02月10日
    浏览(37)
  • vue2如何将页面生成 pdf 导出 html2Canvas + jspdf

    npm i html2canvas npm i jspdf import html2canvas from \\\'html2canvas\\\'; import jsPDF from \\\'jspdf\\\' export const htmlToPDF = async (htmlId, title = \\\"报表\\\", bgColor = \\\"#fff\\\") = {   let pdfDom = document.getElementById(htmlId)   pdfDom.style.padding = \\\'0 10px !important\\\'   const A4Width = 595.28;   const A4Height = 841.89;   let canvas = await html2canvas(pd

    2024年02月16日
    浏览(40)
  • 【无标题】使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一样

    问题:使用html2canvas和jspdf生成的pdf在不同大小的屏幕下文字大小不一样,在mac下,一切正常,看起来很舒服,但是当我把页面放在扩展屏幕下(27寸),再生成一个pdf,虽然排版一样,但是文字就变得非常小 下面的是在mac下的,上面是在扩展屏幕下的,最开始我以为是文字大

    2024年02月16日
    浏览(36)
  • 运行QT的.exe程序出现缺少动态链接库以及无法定位程序输入点的两种不同情况的解决办法

    一、出现无法定位程序输入点的错误 出现这种情况是因为下面的设置造成的 因为QtCreator的环境变量在mingw环境变量的上方造成的。 具体解决办法是将上面的环境变量下移即可。 至于为什么会这样,可以自行查找啦。 二、出现缺少动态链接库dll的错误 在加入mingw-64的环境变量

    2024年02月04日
    浏览(30)
  • html2canvas和jspdf实现html导出pdf文件

    实现原理 先使用html2canvas对页面进行截图,再使用jspdf将截图生成pdf文件 html2canvas:通过纯JS对浏览器页面进行截图 jspdf:一个基于 HTML5 的客户端解决方案,用于在客户端 JavaScript 中生成 pdf文件 的库 安装html2canvas和pdf 截图源码 1. 截长图不分页 2. 截图分页 导出pdf源码 函数调

    2024年02月12日
    浏览(35)
  • vue中使用html2canvas+jsPDF实现pdf的导出

    html2canvas依赖 jspdf依赖 pdf导出 以导出横向,A4大小的pdf为例 规律:1. html2canvas 中,在保持jsPDF中的宽高不变的情况下,设置html2canvas中的 width 和 height 值越小,导出的pdf越显示不全(会被放大,只能看到局部),反之值越大,导出的pdf越显示完整(值也不能过大,过大在pdf中就显

    2024年02月12日
    浏览(30)
  • html2Canvas+jsPDF 下载PDF 遇到跨域的对象存储的图片无法显示

        一、问题原因  对象存储的域名和你网址的域名不一样,此时用Canvas相关插件 将DOM元素转化为PDF,就会出现跨域错误。 二、解决办法  两步 1. 图片元素上设置属性  crossorigin=\\\"anonymous\\\"  支持原生img和eleme组件  2. 存储桶设置资源跨域访问 阿里腾讯云为例:↓ 阿里云OS

    2024年02月15日
    浏览(40)
  • pdf转png的两种方法

    背景:pdf在一般公司,没有办公系统,又不是word/wps/Office系统,读不出来,识别不了,只能将其转化为图片png,因此在小公司或者一般公司就需要pdf转png的功能。本文将详细展开。 1、fitz库(也就是PyMuPDF) 直接pip安装PyMuPDF即可使用,直接使用fitz操作,无需其他库。

    2024年02月04日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包