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


    一、安装依赖

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

    npm install html2canvas jspdf
    

    二、创建公共方法+引入

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

    • pdfExport.js
    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
    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中引入方法

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

    三、使用

    • html
    <template>
    	<div>
    		<!-- 打印按钮 -->
    		<span class="mr20" @click="printPageFn">打印页面</span>
    		<!-- 需要打印的页面内容,可以是任意div,设置id就可以 -->
    		<router-view id="contentToExport"/>
    	</div>
    </template>
    
    • Javascript
    // 打印页面
    printPageFn(){
    	//注意传入的id是否与页面设置的id一致
    	this.$exportToPDF('contentToExport').then((blob) => {
    		this.$printPDF(blob);
    	});
    },
    
  • 相关阅读:
    使用过邮箱服务,你对`SMTP`、`POP3`、`IMAP`三大协议有过了解吗?
    Stm32_标准库_13_串口&蓝牙模块_手机与蓝牙模块通信
    常用DOS命令
    蚂蚁二面:MySQL 单表不要超过 2000W 行,靠谱吗?
    基于SSH的网上拍卖系统的设计与实现(JavaWeb的拍卖商城系统)
    ubuntu 16.04.5 安装 vivado 2019.1 完整编译AD9361的环境
    leetcode刷题日记:141. Linked List Cycle(环形链表)
    QGIS编译(跨平台编译)之五十七:Qt Creator环境下qgis_app库的pro文件
    word操作:单独调整英文字体
    monaco-editor 动态插入文本到光标处
  • 原文地址:https://blog.csdn.net/Kino_Hs/article/details/139660650