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

news2024/12/30 3:12:37

在做项目时有这么一个需求,需要将当前页面指定区域的内容导出pdf到本地。借助了两个插件分别是html2canvas.js和pdf.js来实现。使用过程中遇到的问题及解决方法

解决一些问题:

  • 导出按A4纸大小排列
  • 预留页面边距的问题
  • 内容过多自动分页的问题
  • 直接使用jspdf中文乱码的问题
  • 直接使用jspdf文本自动换行的问题
安装依赖
  • 将页面转换成图片
    html2canvas 的作用就是根据 DOM 生成对应的图片。它的屏幕截图是基于 DOM 的,因此可能不会 100% 精确到真实的表示,因为它不会生成实际的屏幕截图,而是基于页面上可用的信息构建屏幕截图。
npm install html2canvas --save
  • 将图片导出成PDF
    JSPDF是一个JavaScript库,用于生成PDF文档。它可以直接在浏览器中生成PDF,也可以通过Node.js在服务器端生成PDF。JSPDF具有高度的自定义性和可扩展性,可以用于各种PDF生成需求。
npm install jspdf --save
具体使用
1、页面中创建一个容器ref=“contenterPdf”
<template>
<div>
    <div ref="contenterPdf">
        <img alt="Vue logo" src="../assets/logo.png" />
        <div>JSPDF是一个用于生成PDF文件的客户端JavaScript库。它提供了简单易用的API,使得我们可以在浏览器端创建PDF文件。相比于服务端生成PDF文件,使用JSPDF可以避免服务端的压力,并且能够实现更多的交互与设计效果。基于JSPDF,我们可以生成包括图表、表格、文字、图片、图形等各种元素的PDF文档,同时也可以设置字体、颜色、边框等多种属性来调整文档的样式。</div>
    </div>
    <button @click="handleExport">导出PDF文件</button>
</div>
</template>
2、创建/utils/htmlToPdf.js文件
import html2canvas from "html2canvas";
import jsPDF from "jspdf";

export const downloadPDF = page => {
    html2canvas(page, {
        useCORS: true, //允许canvas画布内 可以跨域请求外部链接图片, 允许跨域请求。
        allowTaint: true, //允许跨域
        scale: 2, 设置放大倍数
        backgroundColor: '#ffffff'//背景色
    }).then((canvas)=> {
        canvas2PDF(canvas);
    })
};

const canvas2PDF = canvas => {
    // 新建JsPDF对象
    const PDF = new jsPDF({
        orientation: 'p', //参数: l:横向  p:纵向
        unit: 'mm', //参数:测量单位("pt","mm", "cm", "m", "in" or "px")
        format: 'a4', //A4纸
    })
    const ctx = canvas.getContext('2d')
    const a4w = 190
    const a4h = 277 //A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
    const imgHeight = Math.floor(a4h * canvas.width / a4w) //按A4显示比例换算一页图像的像素高度
    let renderedHeight = 0

    while (renderedHeight < canvas.height) {
        let page = document.createElement("canvas");
        page.width = canvas.width;
        page.height = Math.min(imgHeight, canvas.height - renderedHeight); //可能内容不足一页

        //用getImageData剪裁指定区域,并画到前面创建的canvas对象中
        page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0);

        // canvas转图片数据保留10mm边距
        PDF.addImage(page.toDataURL('image/jpeg', 0.2), 'JPEG', 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width));

        renderedHeight += imgHeight;

        //判断是否分页,如果后面还有内容,添加一个空页
        if (renderedHeight < canvas.height) {
            PDF.addPage()
        }
    }

    PDF.save("导出.pdf");
};
3、页面方法中调用
<script>
import { downloadPDF } from "@/utils/htmlToPdf.js"
export default {
    data() {
        return {};
    },
    methods: {
        handleExport() {
            downloadPDF(this.$refs.contenterPdf)
        },
    },
};
</script>
  • 页面效果
    在这里插入图片描述

  • 导出效果
    在这里插入图片描述

  • 导出多页的效果
    在这里插入图片描述

解决jspdf中文乱码

如果是直接使用jsPDF生成pdf文件,中文是乱码。

PDF.text('JSPDF是一个用于生成PDF文件的客户端JavaScript库。它提供了简单易用的API,使得我们可以在浏览器端创建PDF文件。', 10, 100);

在这里插入图片描述

  • 解决方案

需要一个支持中文的字体ttf文件,可以在网上下载,也可以使用本地window/font/路径下的文件。
在这里插入图片描述

1、下载jspdf

在这里插入图片描述
里面有个fontconverter目录

2、双击打开fontconverter.html文件

在这里插入图片描述
选择你本地的ttf文件,点击“Create”按钮,会生成一个js文件。

3、将js文件放入自己的项目中

在页面中引入js文件

import '@/utils/simhei-normal.js'
4、设置字体
PDF.setFont('simhei')
PDF.text('JSPDF是一个用于生成PDF文件的客户端JavaScript库。它提供了简单易用的API,使得我们可以在浏览器端创建PDF文件。', 10, 100);

在这里插入图片描述

解决jspdf文本自动换行

上面乱码解决了,但是发现中文字不会自动换行。这个还需要进一步解决。

1、使用splitTextToSize解决

//文本内容
const reportTitle = 'JSPDF是一个用于生成PDF文件的客户端JavaScript库。它提供了简单易用的API,使得我们可以在浏览器端创建PDF文件。相比于服务端生成PDF文件,使用JSPDF可以避免服务端的压力,并且能够实现更多的交互与设计效果。基于JSPDF,我们可以生成包括图表、表格、文字、图片、图形等各种元素的PDF文档,同时也可以设置字体、颜色、边框等多种属性来调整文档的样式。'
//设置自动换行
const splitTitle = PDF.splitTextToSize(reportTitle, 190);
//添加文本内容
PDF.text(splitTitle, 10, 110);

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1201782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Outlook无法打印邮件

Outlook无法打印邮件 故障现象 Outlook选择文件无法打印&#xff0c;提示“除非选定某个项目&#xff0c;否则无法打印&#xff0c;请选定某个项目&#xff0c;然后再试” 故障截图 故障原因 此目录配置文件异常C:\Users\"用户名"\AppData\Roaming\Microsoft\Out…

el-upload上传附件预览只能上传一个,上传玩没有+号

el-upload上传附件预览只能上传一个&#xff0c;上传玩没有号 一、效果图二、主要代码 一、效果图 二、主要代码 实现原理是通过控制css显隐hideUpload 字段 <template><div id"uploadOne"><!-- 预览附件上传一个 --><el-upload:class"{ h…

TikTok数字艺术:短视频背后的视觉盛宴

在当今数字时代&#xff0c;社交媒体平台已经成为创意表达和文化传播的重要场所之一。其中&#xff0c;以短视频为代表的形式在TikTok这一平台上崭露头角&#xff0c;为创作者和观众提供了一个数字艺术的舞台。 本文将深入探讨TikTok数字艺术的独特之处&#xff0c;剖析短视频…

FAN73832MX 350mA-650mA 高压600V 能驱动MOSFET和IGBT 半桥栅极驱动IC

FAN73832MX是一款半桥、栅极驱动 IC&#xff0c;带关断和可编程死区时间控制功能&#xff0c;能驱动 MOSFET 和 IGBT&#xff0c;工作电压高达 600 V。飞兆的高压工艺和共模噪声消除技术可使高侧驱动器在高 dv/dt 噪声环境下稳定运行。先进的电平转换电路允许高侧驱动器的工作偏…

万界星空科技智能管理系统低代码平台

低代码平台正成为企业数字化基础设施的重要一环&#xff0c;越来越多的企业为了可持续的数字化建设&#xff0c;开始启用低代码平台&#xff0c;其选型除了平台易用性、应用搭建能力外&#xff0c;也关注与第三方平台的集成性&#xff0c;及厂商对行业knowhow的积累、品牌口碑及…

Vatee万腾科技决策力的未来展望:Vatee数字化创新新高度

在当今快速发展的科技时代&#xff0c;Vatee万腾以其卓越的科技决策力&#xff0c;不断开创数字化创新的新高度。 Vatee万腾一直被视为数字化创新的先锋。通过不断拓展科技边界&#xff0c;Vatee万腾致力于引领数字化创新的方向。其科技决策力在预测市场趋势、分析大数据、应用…

后台系统更改主题【el-color-picker】

Element el-color-picker 颜色选择器的使用 设置的页面 <script setup lang"ts"> import { getThemeColor } from "../../utils/colorChange"; import { useUserStore } from "/store/index"; import { reactive } from "vue"…

Java之“数字困境”:资产管理项目中的Bug追踪与启示

目录 1 前言2 问题的发现3 调试的开始4 深入调试5 调试心得与反思6 结语 1 前言 在程序员的日常工作中&#xff0c;我们时常面对各种令人头疼的问题&#xff0c;其中最令人崩溃的瞬间之一&#xff0c;就是当我们花费大量时间追踪一个看似复杂的bug&#xff0c;最终发现问题的根…

未来之光:十八数藏的文化数字化新篇章

在时代的浪潮中&#xff0c;十八数藏显现出文化数字化的新时代光芒。这一数字化的新篇章不仅仅是对传统文化的延续&#xff0c;更是一场对未来的引领。通过数字化&#xff0c;十八数藏打开了文化传承的崭新大门&#xff0c;为传统工艺注入了新的生命力。 数字技术为十八数藏带来…

十年后人工智能会统治人类?2024年人工智能未来趋势,变化将翻天覆地!

原创 | 文 BFT机器人 01 导读 人工智能在全球范围内呈爆发性增长&#xff0c;随着技术的不断创新和社会的积极适应&#xff0c;人工智能有望引领一场社会革命。 02 Gartner发布2024 年十大战略技术趋势 Gartner研究副总裁Bart Willemsen表示&#xff1a;“由于技术变革以及社…

去掉textarea右下角的图标

效果图如下&#xff1a; <textarea placeholder"请输入内容..." cols"20" rows"2"></textarea>重点代码 ::-webkit-resizer {display: none;}

uniapp 小程序 身份证 和人脸视频拍摄

使用前提&#xff1a; 已经在微信公众平台的用户隐私协议&#xff0c;已经选择配置“摄像头&#xff0c;录像”等权限 开发背景&#xff1a;客户需要使用带有拍摄边框的摄像头 &#xff0c;微信小程序的方法无法支持&#xff0c;使用camera修改 身份证正反面&#xff1a; <…

[sd_scripts]之gen_img

https://github.com/kohya-ss/sd-scripts/blob/main/docs/gen_img_README-ja.mdhttps://github.com/kohya-ss/sd-scripts/blob/main/docs/gen_img_README-ja.md1.图像生成 ckpt "/home/image_team/image_team_docker_home/lgd/e_commerce_sd/stable-diffusion-webui/mod…

数据结构-静态查找、二分查找、分块查找

静态查找 在静态查找表中&#xff0c;我们只允许下面两件事&#xff1a; 1.在查找表中查找某个记录是否在表中 2.查找表中记录的各个属性 动态查找 在动态查找表中&#xff0c;我们允许四件事&#xff1a; 1.在查找表中查找某个记录是否在表中 2.查找表中记录的各个属性…

代理模式-静态动态代理-jdk动态代理-cglib动态代理

代理模式 静态代理 动态代理&#xff1a;jdk动态代理 cglib动态代理 注意 &#xff1a;下面的代码截图 要配合文字去看 我对代码的每一步都做了解释 所以需要配合图片观看提取吗1111https://pan.baidu.com/s/1OxQSwbQ--t5Zvmwzjh1T0A?pwd1111 这里直接把项目文件 及代码 …

Linux 使用随记

Linux 使用随记 shell 命令行模式登录后所取得的程序被成为shell&#xff0c;这是因为这个程序负责最外层的跟用户&#xff08;我们&#xff09;通信工作&#xff0c;所以才被戏称为shell。 命令 1、命令格式 command [-options] parameter1 parameter2 … 1、一行命令中第…

FNPLicensingService.exe 总提示要联网

目录预览 一、问题描述二、原因分析三、解决方案&#xff1a;四、参考链接 一、问题描述 FNPLicensingService.exe 总提示要联网 找到路径如下&#xff1a; C:\Program Files (x86)\Common Files\Macrovision Shared\FlexNet Publisher然而从文件目录来看&#xff0c;并没有…

成都优优聚美团代运营:打造高效电商运营的利器

一、引人注目的标题 在繁杂的电商市场中&#xff0c;成都优优聚美团代运营以其专业的服务&#xff0c;为商家提供了一站式的解决方案。那么&#xff0c;这个备受瞩目的代运营平台有何特别之处呢&#xff1f;今天&#xff0c;我们就来一探究竟。 二、平台背景与优势 成都优优聚…

Electronica Samtec展台连接器Demo回顾 | 224Gbps PAM4:令人瞠目的速率

【摘要/前言】 最近&#xff0c;我们正在为大家带来2023慕尼黑上海电子展虎家展台Demo演示回顾系列。 今天虎家工程师团队再次为大家带来系列第一期&#xff1a; 我们邀请到了合作伙伴Keysight&#xff0c;与我们一同带来了Samtec NovaRay高密度、高性能阵列连接器以及Keysig…