纯前端实现导出pdf文件(服务端不参与)

news2024/11/25 20:25:11

大致查阅了现阶段使用较多的几种方案,,大概有以下几种方式:

一、原生window.print()方法导出pdf
二、jspdf
三、jspdf + html2canvas
四、pdfmake

方案优点缺点
window.print()1、兼容性最好
2、可以将任意内容导出成 pdf 文档, 甚至是非改页面上的内容
1、调用方法时部分条件下导出pdf需要用户手动选择
 
jspdf

1. 调用方法创建 pdf 文件,对于简单的内容可直接使用,
2. 也可以将 dom 节点转换为 pdf

3、生成内容为文本可复制

1、对中文不友好,会有乱码,需要引入字体库解决乱码问题
2、本分dom内容转pdf效果较差, 丢失大量样式设置
3、如果想要导出的pdf文件中包含图片,视觉效果略微模糊
4、pdf分页不好处理

 

 jspdf + html2canvas

1、在jspdf上将生成效果不佳的部分可以转成图片,适用于对样式有要求的场景
2、将乱码部分转为了图片,解决了中文乱码问题
3、没有预览点击即可保存

1、如果内容包含echart图表或者其它图表,该内容需要转图片
2、生成的pdf实际为图片,不支持复制
3、不同浏览器生成可能会有略微差异(页面周边留白部分差异)
 4、由于整体效果为图片,导致pdf文件较大(两页2.5MB左右)

5、pdf分页不好处理

pdfmake1、分页好处理1、js对象定义文档内容,对数据结构有固定要求
 2、图表依旧需要转图片

以上方式可有利弊,使用还需根据需求及pdf文件的复杂程度去综合考虑

方案一:原生window.print()

       推荐两篇博主的文章即可了解到该方法的具体使用
        1、聊一聊浏览器打印 - window.print
        2、前端实现网页打印详解

个人测试效果如下
因为是后台管理系统,导出不想包含左侧菜单栏和顶部区域,所以只对company-detail类名div中的内容进行导出,做了一个临时导出按钮

假设该页面为想要导出的页面

点击打印如下

注:由于测试,代码中并没有去做样式处理,可以看到效果还不错,加上样式基本可以还原原来的页面,如果是项目需求更多的是文本,表格信息想导出,同时又能接受需要用户手动选择导出为pdf时,这个方案总体最好

方案二:jspdf

  • sPDF: 用于在浏览器中生成PDF文件。你可以在Vue项目中使用它,通过引入jsPDF库并编写相应的代码来生成PDF。

  • npm install jspdf
    import jsPDF from 'jspdf';
    
    // 创建一个PDF实例
    const pdf = new jsPDF();
    
    // 添加内容
    pdf.text('Hello world!', 10, 10);
    
    // 保存为PDF文件
    pdf.save('example.pdf');
    
    • html2pdf: 这个库可以将HTML内容转换为PDF。它支持更复杂的页面结构和样式。

      npm install html2pdf.js
      import html2pdf from 'html2pdf.js';
      
      // 获取要转换为PDF的DOM元素
      const element = document.getElementById('content');
      
      // 转换为PDF
      html2pdf(element);
      

      在vue中基础使用

      <template>
        <div>
          <button @click="generatePDF">Generate PDF</button>
        </div>
      </template>
      
      <script>
      import jsPDF from 'jspdf';
      
      export default {
        methods: {
          generatePDF() {
            // 创建一个PDF实例
            const pdf = new jsPDF();
      
            // 添加内容
            pdf.text('Hello world!', 10, 10);
      
             // 添加图像
             pdf.addImage('path/to/image.jpg', 'JPEG', 10, 10, 50, 50);
      
              // 添加矩形
              pdf.rect(10, 10, 50, 30);
      
              // 添加圆形
              pdf.circle(80, 25, 20);
      
              // 添加文本和链接
              pdf.textWithLink('Click me', 10, 10, { url: 'https://example.com' });
      
      
            // 保存为PDF文件
            pdf.save('example.pdf');
          },
        },
      };
      </script>

      还可以配合添加表格
      使用autoTable插件可以方便地添加表格。这个插件需要额外安装

      npm install jspdf-autotable
      
      import 'jspdf-autotable';
      
      // 添加表格
      const columns = ['Name', 'Email', 'Phone'];
      const data = [
        ['John Doe', 'john@example.com', '555-1234'],
        ['Jane Doe', 'jane@example.com', '555-5678'],
      ];
      
      pdf.autoTable(columns, data, { startY: 70 });
      

      还可以配合echart添加图表,本质是把echart图表转了图片
       

      <template>
        <div>
          <canvas ref="chartCanvas"></canvas>
          <button @click="generatePDF">Generate PDF with Chart</button>
        </div>
      </template>
      
      <script>
      import Chart from 'chart.js';
      import jsPDF from 'jspdf';
      
      export default {
        data() {
          return {
            chartData: {
              labels: ['Label 1', 'Label 2', 'Label 3'],
              datasets: [
                {
                  label: 'Sample Data',
                  data: [10, 20, 15],
                  backgroundColor: ['red', 'blue', 'green'],
                },
              ],
            },
          };
        },
        mounted() {
          // 使用Chart.js创建柱状图
          const ctx = this.$refs.chartCanvas.getContext('2d');
          new Chart(ctx, {
            type: 'bar',
            data: this.chartData,
          });
        },
        methods: {
          generatePDF() {
            // 获取图表的Base64编码
            const chartImage = this.$refs.chartCanvas.toDataURL('image/png');
      
            // 创建一个PDF实例
            const pdf = new jsPDF();
      
            // 添加图像
            pdf.addImage(chartImage, 'PNG', 10, 10, 80, 50);
      
            // 保存为PDF文件
            pdf.save('example_with_chart.pdf');
          },
        },
      };
      </script>
      

      方案三:jspdf + html2canvas
             使用大致与jspdf相似,不过多叙述
             推荐一份好文推荐:(html2canvas 和 jsPDF);
             还有一篇提到分页比较详细的文章:JSPDF + html2canvas A4分页截断

      方案四:pdfmake
             推荐文章:pdfmark生成pdf文件并下载
                              巧用pdfmake

    • pdfmake 是一个用于在浏览器中生成PDF文档的JavaScript库。它允许你使用简单的JavaScript对象来定义文档的结构和内容,而不是直接使用HTML或其他标记语言。这样可以更轻松地生成复杂的、自定义的PDF文档。

      以下是 pdfmake 的一些关键特点和概念:

    • 声明式文档定义: pdfmake 使用声明式的方式定义PDF文档的结构和内容。你通过JavaScript对象来描述文档的各个部分,如页眉、页脚、段落、表格等。

    • 支持丰富的样式: 你可以为文本、段落、表格等元素指定各种样式,包括字体、颜色、大小、对齐方式等。这使得你能够创建具有良好格式和外观的PDF文档。

    • 支持表格: pdfmake 提供了强大的表格支持,允许你创建具有复杂结构和样式的表格。你可以设置单元格的边框、背景颜色、合并单元格等。

    • 支持图片: 你可以将图片添加到PDF文档中,支持从URL加载图片或使用Base64编码的图片数据。

    • 支持页面布局: pdfmake 允许你设置页面的大小、方向和边距,以满足不同的打印和布局需求。

    • 支持中文和多语言: pdfmake 对于国际化支持相当友好,包括对各种语言和字体的支持。
       

      // 引入 pdfmake 库
      import pdfMake from 'pdfmake/build/pdfmake';
      import pdfFonts from 'pdfmake/build/vfs_fonts';
      
      // 注册字体
      pdfMake.vfs = pdfFonts.pdfMake.vfs;
      
      // 创建文档定义
      const documentDefinition = {
        content: [
          { text: 'Hello, PDFMake!', fontSize: 16, bold: true, alignment: 'center', margin: [0, 0, 0, 10] },
          {
            table: {
              body: [
                ['Name', 'Age', 'Country'],
                ['John Doe', 25, 'USA'],
                ['Jane Doe', 30, 'Canada'],
              ],
            },
          },
          { image: 'data:image/jpeg;base64,...', width: 100, height: 100 },
        ],
      };
      
      // 创建PDF文档
      const pdfDocGenerator = pdfMake.createPdf(documentDefinition);
      
      // 下载PDF文件
      pdfDocGenerator.download('example.pdf');
      

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

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

相关文章

⑦【从0制作自己的ros导航小车:上位机篇】02、ros1多机通讯与坐标变换可视化

从0制作自己的ros导航小车 前言一、ros1多机通讯二、rviz可视化小车坐标系 系列文章&#xff1a; ①【从0制作自己的ros导航小车&#xff1a;介绍及准备】 ②【从0制作自己的ros导航小车&#xff1a;下位机篇】01、工程准备_标准库移植freertos ③【从0制作自己的ros导航小车&a…

Sobel Operator

什么是图像边缘&#xff1f; 边缘是指图像中灰度或颜色强度发生显著变化的区域。 什么是Sobel operator Sobel算子是一种用于图像处理的边缘检测算子。它通过计算图像灰度值的梯度来检测图像中的边缘。 什么情况产生梯度&#xff1f; 黑与白交界处。 Sobel 算子原理 计算P…

MLP多层感知机与Pytorch实现

参考文章&#xff1a; 1.动手学深度学习——多层感知机&#xff08;原理解释代码详解&#xff09;_多层感知机 代码-CSDN博客 2.4.1. 多层感知机 — 动手学深度学习 2.0.0 documentation 3.深度理解多层感知机&#xff08;MLP&#xff09; | 米奇妙妙屋 1. 神经网络由来 神经网…

ChatGPT指导如何完整写出研究论文的摘要

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术写作中&#xff0c;学习如何为研究论文撰写简短且内容丰富的摘要非常重要。摘要可以让读者了解你的研究成果&#xff0c;快速浏览并决定是否要阅读更多内容。 但研究论文中的摘要…

Python面试宝典第23题:分发糖果

题目 n 个孩子站成一排&#xff0c;给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求&#xff0c;给这些孩子分发糖果。 &#xff08;1&#xff09;每个孩子至少分配到 1 个糖果。 &#xff08;2&#xff09;相邻两个孩子评分更高的孩子会获得更多的糖果。 请…

AI绘画SD万能模型 ControlNet Union (也称ControlNet++ 或 ControlNetPlus)!10余种控制效果一键生成!

大家好&#xff0c;我是画画的小强 Controlnet 可以说是目前最重要的一款 AI 绘画控制插件&#xff0c;可以帮我们实现轮廓、深度、动作姿势、颜色等多种控制效果。由于每种控制条件都需要调用不同的控制模型&#xff0c;加上 SD1.5 和 SDXL 的生态并不互通&#xff0c;大家肯…

【ROS 最简单教程 006/300】使用 launch 启动多个 ROS 节点

使用 launch 文件&#xff0c;可以一次性启动多个 ROS 节点 launch 文件编写的语法规则参见 &#x1f449; launch 文件编写 &#x1f49c; &#x1f49c; &#x1f49c; &#x1f49c; &#x1f49c; 简单示例如下 不使用 launch 需要启动三个命令行终端窗口&#xff0c;分别…

电商电子面单API对接方法

电商业务管理过程中&#xff0c;商家想要高效发货&#xff0c;使用电子面单是必不可少的&#xff0c;因为电子面单成本低、效率高&#xff0c;所以电商ERP、打单软件等这类应用对接电商电子面单API的需求量非常大。当应用通过电商电子面单API与电商平台、快递公司系统打通后&am…

Reranker技术

文章目录 Reranker技术0. 什么是RAG1. 什么是Reranker&#xff1f;2. Reranker在RAG技术中的应用3.使用 Reranker 的优缺点4.总结参考&#xff1a;知乎 Reranker技术 0. 什么是RAG 基础 RAG 的操作流程大致如下&#xff1a;首先&#xff0c;你需要将文本切分成小段&#xff0…

《深度RAG系列》 LLM 为什么选择了RAG

2023年是AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;元年&#xff0c;这一年见证了人工智能生成内容领域的巨大飞跃&#xff0c;特别是大模型的爆发&#xff0c;它们在自然语言处理、图像生成、音频处理等多个领域展现出了惊人的能力。 这些预训练…

UVC驱动分析(一)

UVC驱动分析 UVC驱动简介Linux video框架分层UVC驱动注册UVC驱动注册入口函数UVC设备探测初始化UVC描述符解析V4L2设备注册UVC控制参数初始化UVC video驱动注册UVC 状态初始化 UVC驱动简介 UVC全称为USB Video Class&#xff0c;即&#xff1a;USB视频类&#xff0c;是一种为U…

Vue组件库移动端预览实现原理

引言 大家如果使用过移动端组件库&#xff08;比如&#xff1a;Vant&#xff09;&#xff0c;会发现在网站右侧有一个手机端的预览效果。 而且这个手机端预览的内容和外面的组件代码演示是同步的&#xff0c;切换组件的时候&#xff0c;移动端预览的内容也会发生相应的变化。 …

基于python的百度迁徙迁入、迁出数据分析(四)

这篇文章是对上篇文章的可获取数据的时间区间的修正&#xff0c;依然通过开发者模式找寻相关数据源&#xff0c;我直接把数据url贴在这里&#xff0c;可以发现里面包含了相对明面上看不到的数据包括&#xff0c;行政区id、春运迁徙数据等&#xff1a;qianxi.cdn.bcebos.com/app…

LYT-Net——轻量级网络低光照条件图像修复模型推理部署(C++/Python)

1.环境安装 conda create -n LYT_Torch python3.9 -y conda activate LYT_Torchconda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidiapip install matplotlib scikit-learn scikit-image opencv-python yacs joblib natsort h5py tqdm tensor…

Conformal low power-7.运行Conformal Low Power 1801流程

要获取有关原生1801流程的最新信息&#xff08;例如功能、指南、常见问题解答和dofile脚本&#xff09;&#xff0c;请使用SET WEB_INTERFACE ON命令启动Web界面。 左手边列出了所有的Conformal产品。还有一个名为“Sample Dofiles”的部分&#xff0c;提供了在不同场景下运行C…

第一个Python Web程序

1、离线安装Django 由于Python是3.7版本,Django选择2.2.4版本,并且中间需要安装依赖包。全部安装包如下: 打开Anaconda Prompt,先进入Python3.7环境,然后依次安装各个包: 至此,Django离线安装成功。 2、编写第一个Django程序 2.1 创建Django项目 创建项目welcome时…

C#初级——继承

继承 继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类&#xff0c;不需要完全重新编写新的数据成员和成员函数&#xff0c;只需要设计一个新的类&#xff0c;继承了已有的类的成员即可。这个已有的类被称为的基类&#xff08;父类&#xff0…

(自适应手机端)行业协会机构网站模板

(自适应手机端)行业协会机构网站模板PbootCMS内核开发的网站模板&#xff0c;该模板适用于行业协会网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b;自适应手机端&#xff0c;同一个后台&#xff0c;数据即时同步&#…

git的配置使用

第三周 Tursday 早 git日志的安装使用 [rootweb ~]# yum -y install git.x86_64 //安装软件包 [rootweb ~]# rpm -ql git //查看git的包 ​ [rootweb ~]# mkdir /yy000 //创建新目录 [rootweb ~]# cd /yy000/ [rootweb yy000]# git init //将当前目录做为仓库…