vue项目中将html转为pdf并下载

news2024/11/15 16:26:03

个人项目地址: SubTopH前端开发个人站

(自己开发的前端功能和UI组件,一些有趣的小功能,感兴趣的伙伴可以访问,欢迎提出更好的想法,私信沟通,网站属于静态页面)

SubTopH前端开发个人站icon-default.png?t=N7T8https://subtop.gitee.io/subtoph.github.io/#/home

以上 👆 是个人前端项目,欢迎提出您的建议😊

以下是正文内容...............

首先安装所需要的依赖

yarn add html2canvas
yarn add jspdf

下面是一个简单的案例,导出A4尺寸pdf

html代码

<template>
  <div class="biographical-notes-page">
    <p class="daochu" @click="getPdf">导出</p>
    <div class="biographical-notes" id="resultsHuiZongTableId">
      <div class="my-info">
        <div class="photo-box">
          <img src=" />
        </div>
        <div class="info-text">
          <p>
            <span>姓名:xxx</span>
          </p>
          <p>
            <span>年龄:xx</span>
          </p>
          <p>
            <span>电话:xxxxxxx</span>
          </p>
          <p>
            <span>邮箱:xxxxxxx@163.com</span>
          </p>
          <p>
            <span>工作经验:x年</span>
          </p>
          <p>
            <span>学历学位:本科</span>
          </p>
        </div>
      </div>
    </div>
    <!-- 加载动画 -->
    <div class="loading" v-if="loading">
      <p>PDF文件生成中...</p>
    </div>
  </div>
</template>

javaScript代码,重点是dpi设置控制pdf分辨率

<script>
import { reactive, toRefs, onBeforeMount, onMounted } from 'vue';
import html2Canvas from 'html2canvas';
import JsPDF from 'jspdf';
export default {
  name: '',
  setup() {
    const data = reactive({
      loading: false
    });
    onBeforeMount(() => {});
    onMounted(() => {});
    const [PDF_WIDTH, PDF_HEIGHT] = [595.28, 841.89];
    const getPdf = () => {
      const ele = document.querySelector('#resultsHuiZongTableId');
      downloadPdf(ele, 'A4.pdf');
    };
    const downloadPdf = (element, filename, options) => {
      if (!element) return;
      let marginX = (options && (options.marginX || options.margin)) || 0;
      let marginY = (options && (options.marginY || options.margin)) || 0;
      data.loading = true;
      return html2Canvas(element, {
        allowTaint: true,
        useCORS: true,
        dpi: 300, // 设置截图的分辨率
        scale: 300 / 96 // 设置截图缩放比例,以适应pdf的dpi
      }).then((canvas) => {
      
        let [contentWidth, contentHeight] = [canvas.width, canvas.height];
        let [realPdfWidth, realPdfHeight] = [
          PDF_WIDTH - marginX * 2,
          PDF_HEIGHT - marginY * 2
        ];

        let singlePageContentHeight = Math.ceil(
          (contentWidth / realPdfWidth) * realPdfHeight
        );
        let pageCount = Math.ceil(contentHeight / singlePageContentHeight);

        let pdf = new JsPDF({
          orientation: 'p',
          unit: 'px',
          format: [PDF_WIDTH, PDF_HEIGHT],
          compress: true
        });

        if (pageCount < 2) {
          pdf.addImage(
            canvas.toDataURL(),
            'JPEG',
            marginX,
            marginY,
            realPdfWidth,
            realPdfHeight
          );
        } else {
          for (let i = 0; i < pageCount; i++) {
            if (i > 0) {
              pdf.addPage();
            }

            let singlePageImgData = canvas
              .getContext('2d')
              .getImageData(
                0,
                i * singlePageContentHeight,
                contentWidth,
                singlePageContentHeight
              );

            let tempCanvas = document.createElement('canvas');
            tempCanvas.width = contentWidth;
            tempCanvas.height = singlePageContentHeight;
            tempCanvas.getContext('2d').putImageData(singlePageImgData, 0, 0);

            pdf.addImage(
              tempCanvas.toDataURL(),
              'JPEG',
              marginX,
              marginY,
              realPdfWidth,
              realPdfHeight
            );
          }
        }
        data.loading = false;
        let res = pdf.save(filename);
        console.log(res)
        return res;
      });
    };

    return {
      getPdf,
      ...toRefs(data)
    };
  }
};
</script>

css代码

<style scoped lang="less">
.daochu {
  position: absolute;
  top: 100px;
  left: 0px;
  color: #fff;
  cursor: pointer;
}
.loading{
  position: absolute;
  top:0;
  left:0;
  width:100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.456);
  p{
    line-height: 800px;
    text-align: center;
    color:#fff;
    font-weight: 700;
  }
}
.biographical-notes-page {
  position: relative;
  width: 100%;
  height: 100%;
  background: #000;
  overflow: auto;
  padding: 20px 0;
  box-sizing: border-box;
  color: #000;
  .biographical-notes {
    // font-family: '苹方';
    width: 1190px;
    min-height: 1682px;
    margin: 0px auto;
    background: #fff;
    padding: 20px 40px;
    box-sizing: border-box;
    .my-info {
      overflow: hidden;
      .photo-box {
        float: left;
        width: 200px;
        height: 260px;
        background: @TSB;
        img{
          width: 100%;
        }
      }
      .info-text {
        padding: 20px 40px;
        float: left;
        p {
          line-height: 36px;
        }
      }
    }
    .info-title {
      color: @TSB;
      font-size: 22px;
      margin-top: 30px;
    }
    .info-content {
      margin-top: 10px;
      span {
        font-size: 16px;
        line-height: 32px;
        display: block;
        color: #777;
      }
    }
  }
}

简单的转pdf案例,可根据实际业务场景进行扩展 

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

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

相关文章

【机器学习】sklearn特征值选取与处理

sklearn特征值选取与处理 文章目录 sklearn特征值选取与处理1. 调用数据集与数据集的划分2. 字典特征选取3. 英文文本特征值选取4. 中文特征值选取5. 中文分词文本特征抽取6. TfidfVectorizer特征抽取7. 归一化处理8. 标准化处理9. 过滤低方差特征10. 主成分分析11. 案例&#…

node实战——搭建带swagger接口文档的后端koa项目(node后端就业储备知识)

文章目录 ⭐前言⭐初始化项目⭐配置router目录自动扫描路由⭐swagger文件配置自动生成json文件⭐封装扫描目录路由加入swagger⭐配置项目入口总文件⭐运行效果⭐总结⭐结束⭐前言 大家好,我是yma16,本文分享关于node实战——搭建带swagger接口文档的后端koa项目(node后端就…

挑战吧,HarmonyOS应用开发工程师

一年一度属于工程师的专属节日1024&#xff0c;多重活动亮相啦~ 参与活动即有机会获得HUAWEI Freebuds 5i 耳机等精美礼品&#xff01; 点击“阅读原文”查看更多活动详情&#xff01;

SAD notes

ESKF 总结 prediction 更新误差先验 F F F通过3.42来算 得到 这里有点绕的一点是: 误差状态的 F F F牵涉到名义状态, 而名义状态又需要在时间上推进更新 其中, F中的名义状态的推进通过公式3.41得到, (名义状态不考虑误差, 这一点从3.41d, 3.41e可以看出, 误差状态只考虑…

“成为视频制作达人:高效为视频批量添加文字水印的技巧分享“

"作为一名视频制作达人&#xff0c;我经常需要处理大量的视频文件。有时候&#xff0c;为了提高视频的识别度和个性化&#xff0c;我会选择给视频添加文字水印。今天&#xff0c;我将分享如何使用“固乔剪辑助手”软件批量给视频添加文字水印的技巧。 首先&#xff0c;我们…

职业技术认证:《研发效能(DevOps)工程师》——开启职业发展新篇章

在互联网行业中&#xff0c;资质认证可以证明在该领域内的专业能力和知识水平。各种技术水平认证也是层出不穷&#xff0c;而考取具有公信力和权威性的认证是从业者的首选。同时&#xff0c;随着国内企业技术实力的提升和国家对于自主可控的重视程度不断提高&#xff0c;国产证…

极限号可以拿到连续函数里面吗?

可以&#xff0c;对于连续函数&#xff0c;极限号可以拿到函数的内部。 或者说&#xff0c;对于连续函数f&#xff0c;取映射f和取极限两种操作可以交换先后顺序。 要求&#xff0c;复合函数求极限&#xff0c;有两点要求&#xff1a;1.里面的极限在x–>x0存在&#xff0c;…

基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉 计算机竞赛

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖&#xff0c;适合作为竞赛课…

idea 插件 checkstyle 规则示例和说明

idea 安装插件 idea 配置插件 checkstyle.xml 示例和说明 <?xml version"1.0"?> <!DOCTYPE module PUBLIC"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN""https://checkstyle.org/dtds/configuration_1_3.dtd"><mod…

kafka3.X基本概念和使用

参考: 【kafka专栏】不用zookeeper怎么安装kafka集群-最新kafka3.0版本 一、kafka集群实例角色规划 在本专栏的之前的一篇文章《kafka3种zk的替代方案》已经为大家介绍过在kafka3.0种已经可以将zookeeper去掉。 上图中黑色代表broker&#xff08;消息代理服务&#xff09;&…

1221. 四平方和--(暴力,二分)

题目&#xff1a; 1221. 四平方和 - AcWing题库 思路1&#xff1a;暴力 暴力枚举 1.枚举顺序为从a到c&#xff0c;依次增大。 2.tn-a*a-b*b-c*c&#xff0c;求得dsqrt(t) 3.判断求出的d是否成立。d要求&#xff1a;d*dt&&d>c #include<iostream> #include&…

项目管理工具ConceptDraw PROJECT mac中文版自定义列功能

ConceptDraw PROJECT Mac是一款专业的项目管理工具&#xff0c;适用于MacOS平台。它提供了成功规划和执行项目所需的完整功能&#xff0c;包括任务和资源管理、报告和变更控制。 这款软件可以与ConceptDraw office集成&#xff0c;利用思维导图和数据可视化的强大功能来改进项目…

TCP / UDP 概念 + 实验(计网自顶向下)

Github源码 moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES: 《计算机网络&#xff0d;自顶向下方法(原书第6版)》编程作业&#xff0c;Wireshark实验文档的翻译和解答。 (github.com) 暂定打算分2步走&#xff0c;前置是中科大对应计网黑书的视频 第1步完成14个Wire…

Linux 用户必备的 Git 图形化工具

Git 是一个免费的开源分布式版本控制系统&#xff0c;用于软件开发和其他几个版本控制任务。它旨在根据速度、效率和数据完整性来处理从小到大的项目。 Linux 用户主要可以通过命令行管理 Git&#xff0c;但是&#xff0c;有几个图形用户界面 (GUI) Git 客户端可以促进在 Linux…

讯飞星火升级 3.0:整体超越 ChatGPT,2024 年将实现对标 GPT-4

距离上一个大版本仅两个月过去&#xff0c;科大讯飞在 1024 对外正式推出讯飞星火认知大模型 3.0 版本。 今年 5 月&#xff0c;讯飞星火认知大模型刚刚面世时&#xff0c;科大讯飞董事长刘庆峰曾立下 Flag&#xff1a;10 月 24 日&#xff0c;星火认知大模型的能力要全面对标…

『第三章』雨燕栖息地:Swift 开发环境

在本篇博文中,您将学到如下内容: 1. Swift 开发平台2. Swift 集成开发环境 Xcode&#xff1f;3. 原型试验场&#xff1a;Playground4. 另一种尝试&#xff1a;iPad 上的 Swift Playgrounds5. Swift 交互实验室&#xff1a;Swift REPL总结 咫尺春三月&#xff0c;寻常百姓家。为…

单源最短路径 -- Dijkstra

Dijkstra算法就适用于解决带权重的有向图上的单源最短路径问题 -- 同时算法要求图中所有边的权重非负&#xff08;这个很重要&#xff09; 针对一个带权有向图G &#xff0c; 将所有节点分为两组S和Q &#xff0c; S是已经确定的最短路径的节点集合&#xff0c;在初始时为空&…

重构之美:Java Swing中 如何对指定行文本进行CSS样式渲染,三种实现思路分享

文章目录 需求分析Document 应用彩蛋 需求分析 在Swing中&#xff0c;如果期望实现对JTextArea 或者 TextPane等文本区域实现单行渲染改怎么做&#xff1f;如上图所示 总的来说有两种实现方案 文本行数可控&#xff0c;那么构造一组JLabel集合按表单顺序添加&#xff0c;这样可…

视频相关学习笔记

YUV 和rgb一样是一种表示色彩的格式&#xff0c;Y表示亮度&#xff0c;UV表示色度&#xff08;U是蓝色投影&#xff0c;V是红色投影&#xff09;&#xff0c;只有Y就是黑白的&#xff0c;所以这个格式的视频图片可以兼容黑白电视&#xff0c;所以彩色电视使用的都是YUV 存储方…

查找算法-斐波那契查找法(Fibonacci Search)

目录 查找算法-斐波那契查找法&#xff08;Fibonacci Search&#xff09; 1、说明 2、算法分析 3、C代码 查找算法-斐波那契查找法&#xff08;Fibonacci Search&#xff09; 1、说明 斐波那契查找法又称为斐氏查找法&#xff0c;此查找法和二分法一样都是以分割范围来进…