VUE框架中实现HTML页面(局部)内容转PDF下载

这篇具有很好参考价值的文章主要介绍了VUE框架中实现HTML页面(局部)内容转PDF下载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有一朋友想把网页内容变成PDF下载下来。问我有没有好办法。

这还真巧了,咱公司也有这个需求,就是网页生成合同,然后可以直接打印合同内容。最早吧,就是可以直接打印就好了。

当时为解决完美打印的问题,挺费劲的,当时第三方插件还有BUG(当然把解决放给发给作者了,作者早已经修复了),正经反复折腾了好一阵子。

就留了篇帖子《VUE实现HTML页面局部内容的打印(print.js),出现多打印一个空白页的问题》记录一下当时踩的坑,也希望能帮到更有需要的人。

后来校区门店想要可以选择,要么直接打印,要么保存PDF,以备日后存档和打印。

这次比较顺利,至少没怎么采坑,直接就搞定了。借着这次机会,也简单整理下,希望可以帮助有需要的人吧。

 

简单步骤如下:

一、先下载JS文件(文末附源码),保存到项目目录中

二、下载两个类库

cnpm install --save html2canvas
cnpm install jspdf --save

三、引入下载的htmlToPdf.js文件,在_main.js文件中导入

import htmlToPdf from '../libs/js/htmlToPdf.js';
Vue.use(htmlToPdf);

四、直接使用 this.getPdf() 调用函数即可

// nodeName:节点名称(要打印的内容)
// fileName:要生成的pdf文件名,不包含(.pdf)扩展名
// scale:PDF文字的清晰度
// style:自定义样式,根据需要,可以传入样式对要打印的对象进行一定的设定
let fileName = '合同' + EUtils.dateFormat(new Date(), 'yyyymmddhhiiss');// 生成pdf文件名,格式:合同年月日时分秒
this.getPdf('#auditionOrder', fileName);// nodeName, fileName, scale, style 此方法一共四个参数,一般前两个参数基本就满足绝大部分需求了

看上去够简单了吧?对于这次问题的解决,相对的,前期确实比较顺利,但是生成的PDF文件的内容样式调整确实还需要耗费精力去精雕细琢。

当然,这就没有技术难度了,就是一个经验和耐心的活了,不在这里描述了。

 

附htmlToPdf.js源码

/**
 * 通用html转PDF文件
 * 
 * 需要先下载两个插件,才可以正常使用
 * cnpm install --save html2canvas
 * cnpm install jspdf --save
 * 
 * 在需要使用的地方,直接调用this.getPdf(nodeName, fileName, scale, style);
 * nodeName,页面中需要转成PDF文件的内容部分定义id属性,id属性值
 * fileName,要生成的pdf文件名,不包含(pdf)扩展名
 * scale,PDF文字的清晰度
 * style,自定义样式,根据需要,可以传入样式对要打印的对象进行一定的设定
 * 例如:this.getPdf('#nodeId' 'PDF文件名');
 */
/* eslint-disable */
import html2Canvas from 'html2canvas';
import JsPDF from 'jspdf';

export default {
    install(Vue, options) {
        Vue.prototype.getPdf = function(nodeName, fileName, scale, style) {
            // 导出之前先将滚动条置顶,不然会出现数据不全的现象
            window.pageYOffset = 0;
            document.documentElement.scrollTop = 0
            document.body.scrollTop = 0

            // loading提示信息
            this.$Message.config({top:500});
            var downloadPdfMsg = this.$Message.loading({
                content : 'PDF文件生成中...',
                duration : 0,
            });
            // 要转化的数据
            var html2Pdf = nodeName ? document.querySelector(nodeName) : document.body;// 要转换的数据(没有传入指定节点,则默认转换整个页面)
            
            if (style) { // 如果传入自定义样式
                html2Pdf.style.cssText = style;
            }
 
            // 参数配置
            var opts = {
                allowTaint: true,//允许加载跨域的图片
                taintTest: true, //检测每张图片都已经加载完成
                scale: scale || 3, // 添加的scale 参数
                logging: false, //日志开关,发布的时候记得改成false
                useCORS: false
            };
            html2Canvas(html2Pdf, opts).then((canvas) => {
                var contentWidth = canvas.width;
                var contentHeight = canvas.height;
                var pageHeight = contentWidth / 592.28 * 841.89;//一页pdf显示html页面生成的canvas高度
                var leftHeight = contentHeight;
                var position = 0;
                var imgWidth = 595.28;// A4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
                var imgHeight = 592.28 / contentWidth * contentHeight;
 
                var pageData = new Image();
                //设置图片跨域访问
                pageData.setAttribute('crossOrigin', 'Anonymous');
 
                setTimeout(() => {
                    pageData = canvas.toDataURL('image/jpeg', 1.0);
                    var 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();
                            }
                        }
                    }
                    setTimeout(downloadPdfMsg, 500);// 关闭loading提示
                    PDF.save((fileName ? fileName : new Date().getTime()) + '.pdf');// 如果没有传入要生成的文件名,则默认使用当前时间戳作为文件名
                }, 1000);
            })
        }
    }
}

 文章来源地址https://www.toymoban.com/news/detail-413395.html

到了这里,关于VUE框架中实现HTML页面(局部)内容转PDF下载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • vue 项目中实现pdf预览 pdf打印 pdf下载

    在Vue项目中实现PDF预览、打印和下载可以通过以下步骤来实现: 安装pdf.js pdf.js是一个JavaScript库,可以用于在Web上渲染PDF文件。 可以使用npm安装pdf.js,命令如下: npm install pdfjs-dist --save 创建一个PDF组件 在Vue项目中,可以创建一个PDF组件,用于显示PDF文件。 可以使用pdf.js提供

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

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

    2024年02月03日
    浏览(48)
  • vue3如何实现点击不同的菜单页切换局部页面

    我们可以使用router来实现 去饿了么(element-plus)找到自己喜欢的页面然后按需导入,以下以自己的例子来实现 首先引入布局容器 然后引入菜单栏 引入这两个,先看效果 此时基本的页面准备好了 容器是有这个属性的,但默认值为false 并把菜单栏里对应的文字改为router-link 在

    2024年02月16日
    浏览(65)
  • Html转PDF,前端JS实现Html页面导出PDF(html2canvas+jspdf)

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

    2024年01月23日
    浏览(60)
  • 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日
    浏览(59)
  • 前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案二:轮询去判断服务端的index.html是否跟当前的index.html的脚本hash值一样

    当我们重新部署前端项目的时候,如果用户一直停留在页面上并未刷新使用,会存在功能使用差异性的问题,因此,当前端部署项目后,需要提醒用户有去重新加载页面。 vue、js、webpack 根据打完包之后生成的 script src 的hash值去判断 ,每次打包都会生成唯一的hash值,只要轮

    2024年01月23日
    浏览(44)
  • 1 请使用js、css、html技术实现以下页面,表格内容根据查询条件动态变化。

            注意:         1.背景颜色用ppt的取色器来获取:                 先点击ppt的形状轮廓,然后点击取色器,吸颜色,然后再点击形状轮廓的其他轮廓颜色,即可获取到对应颜色。           2.表格间的灰色线是在th和td中用border属性设置的;         3.在js中拼

    2024年02月16日
    浏览(47)
  • 在vue中实现多个文件下载&&element ui 实现弹窗

    后端返回多个URL,前端直接点击下载 1.1 window.open let url = “xxx”; window.open(url) 在新窗口打开该下载链接,只能打开一个,多个文件下载不支持 1.2 iframe方法 使用iframe方法(此方法浏览器会跳出弹窗,是否允许下载多个文件,用户体验不好) 1.3 使用a标签 使用a标签(不用点允

    2023年04月09日
    浏览(37)
  • Vue:实现输入框/选择列表内容更改,页面实时预览多个内容变化

    在各种前端页面中,比如用户信息注册的页面,往往有多个输入框和多个选项列表。 为了避免用户选错或者输入错误,可以在前端页面上实时将多个输入框的内容拼接起来,显示到页面或者弹出的窗口中,帮助用户核对、检查输入的内容是否有错,提高用户体验。 本文介绍

    2024年02月10日
    浏览(45)
  • 【PDFBox】PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档

    这篇文章,主要介绍PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档。 目录 一、PDFBox操作文本 1.1、读取所有页面文本内容 1.2、读取指定页面文本内容 1.3、写入文本内容 1.4、替换文本内容 (1)自定义PDTextStripper类 (2)创建Key

    2024年02月16日
    浏览(69)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包