VUE2项目前端实现pdf导出和打印(解决返回后监听失效)

一、页面导出为pdf实现

1、安装必要的库

html2canvas和jsPDF这两个库

npm install html2canvas jspdf

2、封装js插件

在utils文件夹下新建htmlToPdf.js文件

import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'
export default {
  install(Vue, options) {
    Vue.prototype.getPdf = function (title) {
      html2Canvas(document.querySelector('#pdfDom'), {
        allowTaint: true,
        taintTest: false,
        useCORS: true,
        // y:72, // 对Y轴进行裁切
        // width:1200,
        // height:5000,
        dpi: window.devicePixelRatio * 4, //将分辨率提高到特定的DPI 提高四倍
        scale: 4, //按比例增加分辨率
      }).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、挂载到VUE上

在main.js文件中引入并挂载

import htmlToPdf from './utils/htmlToPdf.js'

Vue.use(htmlToPdf)

4、使用

在需要导出为pdf的文件中

<template>
  	<div>
	  	<div id="pdfDom" class="pdf-box">
			这是打印的区域
		</div>
        <button type="primary" @click="exportPdf" >导出</button>
	</div>
</template>

<script>
export default {
  methods: {
    exportPdf() {
      this.getPdf('打印文件')
    },
}
</script>
<style>
.pdf-box {
	width: 1006px;
	height: 1430px;
	box-sizing: border-box;
}
</style>

点击导出按钮,即可打出id为pdfDom的区域

5、注意事项

为什么宽高设定为1006px和1430px?
输出为A4纸大小的pdf时,pdf和网页效果可能不同,出现内容丢失或者边距过大的问题。经过测试发现,宽高设定为1006px和1430px时可以达到1:1还原。

二、页面打印实现

1、直接使用

主要使用到window的内置方法window.print()
调用网页的打印功能进行打印

window.print()

2、进阶 打印某一块区域

通常来说,我们实都是去打印某一块区域。那么可以通过复制一份出来的方式来打印

	printPage() {
   		//pdfDom为打印区域所绑定的id
  		const subOutputRankPrint = document.getElementById('pdfDom')
      	// 创建一个新的div
      	const printDiv = document.createElement('div')
      	printDiv.innerHTML = subOutputRankPrint.innerHTML
      	printDiv.style.position = 'fixed'
      	printDiv.style.left = '0'
      	printDiv.style.top = '0'
      	printDiv.style.width = '100%'
      	printDiv.style.height = '100%'
      	printDiv.style.zIndex = '999999'
      	printDiv.style.background = '#fff'
      	printDiv.style.overflow = 'auto'
      	// 插入到网页中去
      	document.body.appendChild(printDiv)
      	window.print()
      	document.body.removeChild(printDiv)
   	},

3、注意事项

有两个需要注意的地方,
一个是 less或sass等预编译器可能会失效,在 pdfDom 请使用普通css写法

第二个需要注意的地方是打印部分的复制,部分文章给出的打印写法如下,代码行数更少,

printFn() {
 	//pdfDom为打印区域所绑定的id
	let newstr = document.getElementById("pdfDom").innerHTML;
	let oldstr = document.body.innerHTML;
	document.body.innerHTML = newstr;
	window.print();
	document.body.innerHTML = oldstr;
	return false;
}

但是此种写法会导致返回后 监听失效,即按钮等操作失效 ,所以不推荐此种写法

### 若依框架中通过代码生成器实现点击链接后打开PDF文件的功能 要在若依框架中实现点击链接后打开PDF文件的功能,可以通过以下几个方面来考虑: #### 1. **前端部分** 在若依框架的前端页面中,通常会有一个按钮或者超链接用于触发下载或查看PDF的操作。可以利用HTML中的`<a>`标签配合JavaScript方法实现。 ```html <a href="javascript:void(0);" onclick="openPdf()">点击查看PDF</a> <script> function openPdf() { window.location.href = '/api/generate/pdf'; // 后端接口地址 } </script> ``` 上述代码定义了一个超链接,当用户点击时调用`openPdf()`函数,该函数跳转到指定的API路径以获取PDF文件[^3]。 --- #### 2. **后端部分** 在后端需要提供一个接口用于生成并返回PDF文件。以下是基于Spring Boot的一个示例代码片段,展示如何使用GCExcel库生成PDF文件并将其作为响应流发送给客户端。 ```java @RestController @RequestMapping("/api/generate") public class PdfController { @GetMapping("/pdf") public void generatePdf(HttpServletResponse response) throws IOException { Workbook workbook = new Workbook(); try (InputStream templateStream = getClass().getClassLoader().getResourceAsStream("template.ssjson")) { if (templateStream != null) { workbook.open(templateStream); PdfSaveOptions pdfSaveOptions = new PdfSaveOptions(); pdfSaveOptions.getShrinkToFitSettings().setCanShrinkToFitWrappedText(true); response.setContentType("application/pdf"); response.setHeader("Content-Disposition", "inline; filename=exported_pdf.pdf"); try (OutputStream outputStream = response.getOutputStream()) { workbook.save(outputStream, pdfSaveOptions); } } else { throw new FileNotFoundException("Template file not found."); } } } } ``` 此代码实现了以下功能: - 加载由SpreadJS导出的JSON模板。 - 使用GCExcel库将工作簿保存为PDF格式。 - 设置HTTP响应头以便浏览器能够识别PDF文件并显示它而不是直接下载[^2]。 --- #### 3. **集成至若依代码生成器** 为了使这一功能更加通用化,可以在若依框架的代码生成器中增加一个新的选项——“生成PDF”。具体做法如下: ##### 修改代码生成配置 进入若依系统的代码生成模块,找到目标表(例如学生信息),然后调整其字段映射关系,确保所有必要的数据都能被正确渲染到最终的PDF文档里。 ##### 添加自定义逻辑 针对每张表单独编写一段脚本用来处理特定业务需求下的PDF输出过程。比如对于学籍管理系统来说可能还需要额外加入一些统计图表等内容。 --- #### 4. **测试验证** 最后一步就是进行全面测试,确认无论是新增记录还是更新已有条目之后都能够正常预览对应的电子版档案副本。 --- ### 注意事项 由于涉及到敏感个人信息保护等问题,在实际部署前务必做好权限校验机制防止未授权访问行为发生;另外考虑到网络延迟等因素影响用户体验效果的话,则建议采用异步加载模式先提示等待再呈现结果画面。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值