Vue页面生成PDF后调起浏览器打印

一、安装依赖

首先,需要安装 html2canvas 和 jsPDF 库。

javascript 复制代码
npm install html2canvas jspdf

二、创建公共方法+引入

在utils文件夹下创建两个文件分别为pdfExport.js和printPDF.js,代码如下:

  • pdfExport.js
javascript 复制代码
import html2canvas from 'html2canvas';
import jsPDF from 'jspdf';

export const exportToPDF = async (elementId) => {
    console.log('Exporting PDF...');
    const content = document.getElementById(elementId);
    if (!content) {
        console.error(`Element with id ${elementId} not found.`);
        return;
    }

    try {
        const canvas = await html2canvas(content);
        const imgData = canvas.toDataURL('image/png');
        const pdf = new jsPDF({
            orientation: 'portrait',
            unit: 'mm',
            format: 'a4'
        });

        // 获取页面尺寸
        const pageWidth = pdf.internal.pageSize.getWidth();
        const pageHeight = pdf.internal.pageSize.getHeight();
        
        // 计算图片宽高比
        const imgWidth = pageWidth;
        const imgHeight = (canvas.height * imgWidth) / canvas.width;

        // 分页添加图片
        let position = 0;
        while (position < imgHeight) {
            pdf.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
            position += pageHeight;
            if (position < imgHeight) {
                pdf.addPage();
            }
        }

        // 将 PDF 转换为 Blob 对象
        const blob = pdf.output('blob');

        console.log('PDF Blob generated:', blob); // 打印生成的 Blob 对象信息

        return blob; // 返回生成的 Blob 对象,供后续使用
    } catch (error) {
        console.error('导出 PDF 失败:', error);
        throw error; // 抛出异常供调用者处理
    }
};
  • printPDF.js
javascript 复制代码
export const printPDF = (blob) => {
    try {
        const url = URL.createObjectURL(blob);
        console.log('PDF Blob URL:', url); // 打印生成的 Blob URL

        // 创建一个隐藏的 iframe
        const iframe = document.createElement('iframe');
        iframe.style.position = 'fixed';
        iframe.style.right = '0';
        iframe.style.bottom = '0';
        iframe.style.width = '0';
        iframe.style.height = '0';
        iframe.style.border = 'none';

        document.body.appendChild(iframe);

        // 设置 iframe 的 src 属性为 PDF 文件的 URL
        iframe.src = url;

        // 加载完成在进行打印操作,确保 PDF 加载完成
        iframe.onload = function() {
            iframe.contentWindow.focus();
            iframe.contentWindow.print();

            // 打印完成后移除 iframe 和释放 URL
            setTimeout(() => {
                // document.body.removeChild(iframe);
                URL.revokeObjectURL(url);
            }, 500)
        };
    } catch (error) {
        console.error('打印 PDF 出错:', error);
        throw error;
    }
};

创建好后在main.js中引入方法

javascript 复制代码
import { exportToPDF } from '../utils/pdfExport';
Vue.prototype.$exportToPDF = exportToPDF;

import { printPDF } from '../utils/printPDF';
Vue.prototype.$printPDF = printPDF;

三、使用

  • html
javascript 复制代码
<template>
	<div>
		<!-- 打印按钮 -->
		<span class="mr20" @click="printPageFn">打印页面</span>
		<!-- 需要打印的页面内容,可以是任意div,设置id就可以 -->
		<router-view id="contentToExport"/>
	</div>
</template>
  • Javascript
javascript 复制代码
// 打印页面
printPageFn(){
	//注意传入的id是否与页面设置的id一致
	this.$exportToPDF('contentToExport').then((blob) => {
		this.$printPDF(blob);
	});
},
相关推荐
长风清留扬39 分钟前
小程序毕业设计-音乐播放器+源码(可播放)下载即用
javascript·小程序·毕业设计·课程设计·毕设·音乐播放器
m0_748247801 小时前
Flutter Intl包使用指南:实现国际化和本地化
前端·javascript·flutter
ZJ_.1 小时前
WPSJS:让 WPS 办公与 JavaScript 完美联动
开发语言·前端·javascript·vscode·ecmascript·wps
GIS开发特训营1 小时前
Vue零基础教程|从前端框架到GIS开发系列课程(七)响应式系统介绍
前端·vue.js·前端框架·gis开发·webgis·三维gis
Cachel wood2 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
joan_852 小时前
layui表格templet图片渲染--模板字符串和字符串拼接
前端·javascript·layui
还是大剑师兰特2 小时前
什么是尾调用,使用尾调用有什么好处?
javascript·大剑师·尾调用
Watermelo6173 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
LostSpeed4 小时前
在福昕(pdf)阅读器中导航到上次阅读页面的方法
pdf
旭久4 小时前
SpringBoot的Thymeleaf做一个可自定义合并td的pdf表格
pdf·html·springboot