网站前端如何实现HTML转PDF下载的两种方式

Js:使用 html2canvas+jsPDF将html页面变成pdf文件(纯前端) html转pdf 阅读详情

将HTML页面转化为PDF下载是前端经常会遇到的需求,下面就列举两种方式进行实现。以下两种方式默认都是在Vue项目环境下,其他框架项目自行灵活运用。

方式一:使用html2canvas和jspdf插件实现

该方式是通过html2canvas将HTML页面转换成图片,然后再通过jspdf将图片的base64生成为pdf文件。实现步骤如下:

1,下载插件模块

npm install html2canvas jspdf --save

2,定义功能实现方法

在项目工具方法存放文件夹utils中创建htmlToPdf.js文件,代码如下:

// 导出页面为PDF格式
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
export default{
  install (Vue, options) {
    Vue.prototype.getPdf = function () {
      var title = this.htmlTitle
      html2Canvas(document.querySelector('#pdfDom'), {
        allowTaint: true
      }).then(function (canvas) {
        let contentWidth = canvas.width
        let contentHeight = canvas.height
        let pageHeight = contentWidth / 592.28 * 841.89
        let leftHeight = contentHeight
        let position = 0
        let imgWidth = 595.28
        let imgHeight = 592.28 / contentWidth * contentHeight
        let pageData = canvas.toDataURL('image/jpeg', 1.0)
        let PDF = new JsPDF('', 'pt', 'a4')
        if (leftHeight < pageHeight) {
          PDF.addImage(pageData, 'JPEG', 0, 0, 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(title + '.pdf')
      }
      )
    }
  }
}

3, 全局引入实现方法

在项目主文件main.js中引入定义好的实现方法,并注册。

import htmlToPdf from '@/components/utils/htmlToPdf'
// 使用Vue.use()方法就会调用工具方法中的install方法
Vue.use(htmlToPdf)

4, 在相关要导出的页面中,点击时调用绑定在Vue原型上的getPdf方法,传入id即可

//html
 <div id="pdfDom">
   <!-- 要下载的HTML页面,页面是由后台返回 -->
  <div v-html="pageData"></div>
</div>
<el-button type="primary" size="small" @click="getPdf('#pdfDom')">点击下载</el-button>

//js
export default {
  data () {
      return {
      htmlTitle: '页面导出PDF文件名'
      }
  }
 }

方式二:读取后台返回文件流,利用HTML5中a标签的download属性实现下载

该方法需要先请求后台,后台会返回一个文件流,然后解析文件流,再通过HTML5中<a>标签的download属性实现下载功能。步骤如下:

1,发送请求,获取到后台返回的文件流及文件信息

  • 前端发送请求获取下载文件信息:
// 引入下载方法
import {download} from 'utils'
export default{
  methods: {
    async downloadFile () {
      let res = await axios.get(
        url: 'xxxx/xxxx',
        method: 'GET',
        // 设置返回数据类型,这里一定要设置,否则下载下来的pdf会是空白,也可以是`arraybuffer`
        responseType: 'blob',
        params: {
          id: 'xxxxxx'
        }
      )
      // 获取在response headers中返回的下载文件类型
      let type = JSON.parse(res.headers)['content-type']
      
      /*获取在response headers中返回的下载文件名
        因为返回文件名是通过encodeURIComponent()函数进行了编码,因此需要通过decodeURIComponent()函数解码
      */
      let fileName = decodeURIComponent(JSON.parse(res.headers)['file-name'])
      // 调用封装好的下载函数
      download(res, type, fileName)
    }
  }
}

  • 后台返回的文件流格式:

     

    文件流.png

2, 封装下载方法 - 解析文件流,创建a标签并设置下载相关属性。

// utils.js
export const download = (res, type, filename) => {
  // 创建blob对象,解析流数据
  const blob = new Blob([res], {
    // 如何后端没返回下载文件类型,则需要手动设置:type: 'application/pdf;chartset=UTF-8' 表示下载文档为pdf,如果是word则设置为msword,excel为excel
    type: type
  })
  const a = document.createElement('a')
  // 兼容webkix浏览器,处理webkit浏览器中href自动添加blob前缀,默认在浏览器打开而不是下载
  const URL = window.URL || window.webkitURL
  // 根据解析后的blob对象创建URL 对象
  const herf = URL.createObjectURL(blob)
  // 下载链接
  a.href = herf
  // 下载文件名,如果后端没有返回,可以自己写a.download = '文件.pdf'
  a.download = filename
  document.body.appendChild(a)
  a.click()
  document.body.removeChild(a)
  // 在内存中移除URL 对象
  window.URL.revokeObjectURL(herf)
}

3,点击下载按钮,调用下载方法

 <div id="pdfDom">
    <!-- 要下载的页面 -->
    <div v-html="pageData"></div>
</div>
<el-button type="primary" size="small" @click="downloadFile">点击下载</el-button>

总结

以上两种实现方式各有优劣,方式一是纯前端实现,需要引入第三方插件,可能会导致项目体积增加。方式二虽然更加简洁,但a标签的download属性为HTML5新增属性,可能存在兼容性问题。如果有需要,可以根据自己情况来选择。

getPDF.pdf ajax_web_applications.pdf 立即下载

相关推荐

别再写爬虫了!用Trae平台5分钟搞定一个能聊天的网页数据抓取Agent

本文介绍了如何利用Trae平台快速构建无需编程的网页数据抓取智能体,实现对话式数据采集。通过自然语言指令,用户可在5分钟内完成从数据抓取到分析的全流程,显著降低技术门槛和维护成本。文章详细解析了Trae智能体的核心能力,包括自然语言理解、智能页面解析、数据清洗和可视化配置,并提供了多个实战案例,展示其在竞品监控和舆情分析中的高效应用。

weixin_29038303的博客 717

Html转PDF,前端JS实现Html页面导出PDF(html2canvas+jspdf)

当我们在不想改变后端代码的同时想是纯html页面导出PDF,那么(html2canvas+jspdf)就是无疑最好的选择,导出时它不占用我们服务器的资源,而是由用户本地自行执行js文件下载PDF,不占用我们系统的带宽,所以这无非是最好的选择方式

qq_45830276的博客 2万+

最新测算源码PHP算命源码-风水八字-八字起名-塔罗牌占卜

未来,随着技术的发展和用户需求的变化,我们可以继续对系统进行升级和优化,以满足更多用户的需求和期望。数据库设计:创建一个名为bazi的数据库表,包含以下字段:id(自增ID)、name(姓名)、sex(性别)、birth_date(出生日期)、birth_time(出生时间)、bazi(八字结果)。数据库设计:创建一个包含塔罗牌信息的数据库表,如tarot_cards,包含字段:id(塔罗牌ID)、name(塔罗牌名称)、meaning(塔罗牌含义)等。根据操作系统的不同,PHP的安装方法会有所不同。

shanbeizi的博客 2418

前端实现HTML转PDF下载的两种方式

前端实现HTML转PDF下载的两种方式一、使用html2canvas和jspdf插件实现---导出pdf格式1.下载插件模块2.assets下js中创建htmlToPdf.js文件3.全局引入实现方法4.代码如下二、使用html2canvas---导出jpg格式1.下载插件模块2.代码如下 一、使用html2canvas和jspdf插件实现—导出pdf格式 1.下载插件模块 npm install html2canvas jspdf --save 2.assets下js中创建htmlToPdf.js文件

MISS_zhang_0110的博客 2978

逆变器技术解析:DDSRF双解耦在正负序分离中的关键作用

本文深入解析了DDSRF双解耦技术在逆变器正负序分离中的关键作用。通过建立正反旋转坐标系并利用交叉反馈解耦网络,DDSRF能快速、精准地分离电网电压中的正负序分量,从而显著提升锁相环在电网不平衡条件下的精度与系统稳定性,是现代高性能并网逆变器的核心算法之一。

m3n5b7v8c9x的博客 410

Windows平台MuJoCo仿真环境配置与Qt集成实战

本文详细介绍了在Windows平台上配置MuJoCo物理仿真环境并与Qt框架集成的完整实战流程。内容涵盖从环境准备、库文件配置、项目创建到核心代码编写的每一步,重点解决了Windows下常见的编译链接错误和路径问题,帮助开发者在Windows系统中高效搭建机器人仿真与可视化控制开发环境。

weixin_29221753的博客 172

前端实现html转pdf

前端实现html转pdf

qq_45530512的博客 780

搭建ROS小车真的难吗?

搭建ROS小车真的难吗?不难 1.引言 本着为大家谋福利的心态,根据自己以往的开发经验,打算写一个从零开始制作一个可以实现地图构建和导航的ROS小车。目前某宝上面有很多现成产品,但是我个人认为,一个好的移动机器人开发工程师,应该对机器人的整个流程都能具备维护的能力,然后再深入研究其中一个方向即可。看到网上很少有整个系列的开发教程,看到同学们大多东拼西凑,浪费了不少时间。我就想着利用空余时间,将我本人的开发过程输出给大家。有基础理论、有实际工程代码、有丰富的学习资料,尽最大努力帮大家进入移动机器人的大门。 国

「小白学移动机器人」一个专注分享移动机器人相关知识的公众号! 1万+

在HTML或React中实现PDF文件预览,想要不允许下载等如何设置呢?

在HTML或React中实现PDF文件预览且要隐藏下载等按钮,得使用pdf.js框架方案,诸如iframe等HTML标签方式都不行。

hongweilin2021的博客 9476

Python 爬虫实战:抓取应届生求职网校招岗位信息,助力学子就业

应届生求职网作为国内知名的招聘平台,汇聚了大量企业的校招岗位信息。了解这些岗位信息,对于应届毕业生制定求职策略、企业制定招聘计划以及相关就业市场分析等都具有重要意义。因此,本文将深入探讨如何运用 Python 爬虫技术从应届生求职网平台抓取校招岗位信息,为应届毕业生提供有益的就业信息支持。本文深入探究了利用 Python 爬虫技术从应届生求职网平台抓取校招岗位信息的全流程。从前期的环境搭建、模拟登录,到核心的数据抓取、存储,再到后续的数据分析与可视化,都详细展开讲解并提供代码支持。

u014481728的博客 1301

如何使用 ESP32 CAM 进行自动车牌识别 (ANPR)

用于提取 JSON 值并在 OLED 上显示文本的函数。有一个可用的函数,即 extractJsonStringValue 来提取字符串值。它是独立函数,但您仍然可以使用一些 JSON 库来执行相同的功能。

jkh920184196的博客 1304

2019前端书籍推荐,前端PDF书籍,前端书籍下载

 因前端知识面太大,每人、每个公司的技术体系各不相同,本文并不推荐哪些前端书籍更值得阅读,只是描述下简单信息,以分享的方式把这些书籍共享出来,大家可自行选择。         因书籍过多,本文会陆续更新,有需要什么书籍的朋友可评论留言,下次更新会附上该书籍下载地址。   目录 HTML5相关书籍  CSS相关书籍 jQuery相关书籍  JavaScrip相关书籍 ES6,Vue H...

群来群往的博客 7603

NR PUCCH(二)PUCCH format 2/3/4

继续看PUCCH2/3/4:PUCCH format 0和1所携带的信息bits少,UCI bits2bits,信息bit需要经过编码等过程下面分别来看。

ModemProtocol的博客 538

如何在浏览器中轻松实现HTML转PDF:html2pdf.js完整指南

你是否曾经遇到过这样的困扰:精心设计的网页内容,用户却无法方便地保存为PDF文档?或者需要在客户端生成报表却苦于没有合适的工具?今天,我将为你介绍一个神奇的解决方案——html2pdf.js,让你在前端轻松实现HTML到PDF的无缝转换! ## 为什么选择html2pdf.js? 想象一下,你的用户正在浏览一个重要的产品页面,他们想要把内容保存下来,但传统的打印功能无法完美保留页面样式。htm

gitblog_01147的博客 378

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

html 转 pdf 乱码,前端如何将HTML 生成PDF并避免中文乱码的解决方法

前端生成PDF 如果是非 UTF-8 字符再生成PDF 的过程中容易乱码,且布局容易错乱,是因为前端很多呈现结果都是基于字体来绘制的,而前端又无法通过浏览器访问客户机的本地资源,因为权限的控制,所以容易导致字体缺失从而导致乱码,因此任何一个前端工具在生成PDF 时候,如果是非英文字体,需要进行字体配置后,告诉生成引擎,当渲染该类元素时可以去找这类字体,从而避免错别字。字体配置所有ActiveRep...

weixin_35664484的博客 2529

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

如何将HTML文件转换为PDF文件?完整指南与实用工具推荐

将HTML文件转换为PDF,既可以通过编程方式集成到业务系统中,也可以用在线工具快速处理。对于开发者而言,Spire.PDF提供了强大的功能和灵活的定制能力,适合企业级和自动化需求。对于普通用户或临时任务,让你几秒钟内就能完成转换,无需安装任何软件。无论哪种方式,选择合适的工具,配合一些细节优化,都能让你的PDF文件既美观又实用。下次需要保存网页或HTML文件时,不妨试试这两种方法,体验高效的转换过程。

2501_93070778的博客 1722

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JS 如何将 HTML 页面导出为 PDF

好久没在优快云写博客了,因为都放在了个人网站了哈 我这里有个需求,就是前端添加个按钮,提供HTML页面导出为PDF的功能。我谷歌了好久(难道是我谷歌的方式不对 (ˉ▽ˉ;)…),找到的答案大都推荐 jsPDF + html2canvas 的方式。参考了这两个开源项目的文档,自己写,失败,导出的pdf是空的。 参考 stackoverflow 代码,同样失败,同样只导出空白的pdf,他们咋成功了?

pwc1996的博客 7万+

用 Flask 从 0 到 1 实现一个本地版 WPS:PDF 合并拆分、Office 转 PDF、在线创建文档

本文介绍了一个基于Flask框架开发的本地轻量办公工具"Office Studio 文档工作台",主要提供文档创建和PDF处理功能。该工具支持在线新建Word、Excel和PDF文档,并集成了18种PDF处理功能,包括合并拆分、格式转换、水印添加等。技术栈采用Python生态库(如pypdf、python-docx等)实现后端处理,前端使用原生HTML/CSS/JavaScript。项目采用单体架构设计,通过API接口实现前后端交互,特别优化了PDF批量处理和页面编辑的用户体验。所有功能均可本地运行,无需依

a1250467048的博客 1801

基于前端技术生成PDF方案

需求背景 业务系统需要预览报告(如产品周报,体检报告等)并生成pdf格式供用户下载,或者定期发送给指定用户 报告格式相对固定,由文本,图片和图表组成,基本与前端页面保持一致 解决方案 需求分为两步:报告预览和报告生成。 报告预览在前端进行展示,可使用前端技术,如React/Vue等技术栈对其进行还原,数据从服务端获取。 报告生成需要对第一步生成的HTML进行PDF的转换生成,HTML2PDF...

weixin_34187822的博客 1255

【pdf.js】pdf文件转canvas,在h5页面直接浏览PDF文件

官网:http://mozilla.github.io/pdf.js/

Owen的博客 9296

PDF.js 前端开发使用指南

1. 安装 PDF.js安装PDF.js有两种方法:方法1:通过npm安装这样就会在你的项目中安装PDF.js。方法2:手动下载也可以从官方网站手动下载PDF.js。下载后,将pdf.js和pdf.worker.js文件放到你的项目中。2. 使用 PDF.js使用PDF.js需要做以下几步:步骤1:创建一个空的div在你的HTML文件中创建一个空的div元素,用于显示PDF文档。例如:

西装暴徒_12138的博客 1万+

js实现文件下载有很多种方式,本文主要介绍7种。

一、a标签下载 <body> <button onclick="downloadEvt('http://192.168.66.183:13666/download?name=HAP.pdf')">a标签下载</button> <script> function downloadEvt(url, fileName = '未知文件') { const el = document.createElement('a'); ...

ljy123w的博客 3万+

前端使用pdf.js预览pdf文件

现在的浏览器基本都支持直接把pdf文件拖到浏览器就可以打开了,不用安装额外的插件。但是不同的浏览器显示的页面不一样。如果我们想在网页上统一预览pdf怎样实现呢? Mozilla开源了一个插件pdf.js,无需任何本地支持就可以在浏览器上显示pdf文档。唯一的要求就是浏览器必须支持HTML5。使用方法: 下载https://github.com/mozilla/pdf.js/archive/gh...

dxyzhbb的博客 2214

CSS3HTML5从入门到精通中文PDF教程:前端开发者的必备宝典

CSS3HTML5从入门到精通中文PDF教程:前端开发者的必备宝典 【下载地址】CSS3HTML5从入门到精通中文PDF教程 《CSS3+HTML5+从入门到精通》是一本全面的中文学习教程,涵盖CSS3和HTML5的所有基本概念和高级特性。从基础的HTML和CSS语法入手,逐步深入讲解布局、动画、响应式设计及HTML5 ...

gitblog_06757的博客 898

uniapp 流文件pdf_JavaScript实战002:前端各种文件下载功能的实现

在前端项目开发的时候,系统支持文件下载是前端开发中常用到的功能之一,当用户访问我们的网站时发现有自己需要的资源时可以将资源下载下来。文件下载主要有两种形式,一种是通过文件地址下载,该文件可以存放在前端或者后端。另一种则是通过文件流下载,前端通过发送请求给后端并获取后端文件流进行下载。a标签下载download属性:是HTML5中的a标签的新特性,用来规定被下载的超链接目标。在a标签中如果没有申明d...

weixin_36051064的博客 1838

Vue-HTML2PDF:将HTML转换为PDF的Vue组件库

Vue-HTML2PDF:将HTML转换为PDF的Vue组件库 一、项目介绍 vue-html2pdf是一款基于Vue.js框架的实用组件,它能够帮助开发者轻松地将网页中的HTML内容转化为可下载或打印的PDF文件。此项目的核心功能是利用html2canvas和jspdf两个强大的前端库来实现HTML到PDF的转化过程。 关键特点: 兼容性: 支持主流浏览器环境。 易用性: 提供了简洁直观的AP...

gitblog_00062的博客 1471
上一篇: JavaScript中将iso8859-1的字符转换成中文
下一篇: 在vue中阻止click事件冒泡,防止触发冒泡另一个事件
哈哈hyc
博客等级 码龄8年 131粉丝 87原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值