当前位置: 首页 > news >正文

vue实现打印PDF文档

npm i jspdf@3.0.1 html2canvas@1.4.1

/utils/htmlToPDF.ts

// 页面导出为pdf格式
import html2Canvas from "html2canvas";
import jsPDF from "jspdf";const htmlToPdf = (title: any, id: any) => {html2Canvas(document.querySelector(id), {allowTaint: false,taintTest: false,logging: false,useCORS: true,dpi: window.devicePixelRatio * 3, //将分辨率提高到特定的DPI 提高四倍scale: 3, //按比例增加分辨率} as any).then((canvas) => {var pdf = new jsPDF("p", "mm", "a4"); //A4纸,纵向var ctx = canvas.getContext("2d") as any,a4w = 190,a4h = 272, //A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277imgHeight = Math.floor((a4h * canvas.width) / a4w), //按A4显示比例换算一页图像的像素高度renderedHeight = 0;while (renderedHeight < canvas.height) {var page = document.createElement("canvas") as any;page.width = canvas.width;page.height = Math.min(imgHeight, canvas.height - renderedHeight); //可能内容不足一页//用getImageData剪裁指定区域,并画到前面创建的canvas对象中page.getContext("2d").putImageData(ctx.getImageData(0,renderedHeight,canvas.width,Math.min(imgHeight, canvas.height - renderedHeight)),0,0);pdf.addImage(page.toDataURL("image/jpeg", 1.0),"JPEG",10,10,a4w,Math.min(a4h, (a4w * page.height) / page.width)); //添加图像到页面,保留10mm边距renderedHeight += imgHeight;if (renderedHeight < canvas.height) {pdf.addPage(); //如果后面还有内容,添加一个空页}// delete page;}pdf.save(title + ".pdf");});
};export default htmlToPdf;

定义打印PDF模板

<template><div class="print-container" id="PdfContainer" style="width:800px;height: 800px;">123456789<div class="btn-print"><el-button type="success" @click="onDownload()">打印PDF</el-button></div></div>
</template>
<script lang='ts'>
import { reactive, getCurrentInstance, toRefs, onMounted, nextTick, defineComponent, computed } from 'vue';
import htmlToPdf from "/@/utils/htmlToPDF";
export default defineComponent({setup(props: any, { emit }: any) {onMounted(() => {nextTick(() => {});});const { proxy } = getCurrentInstance() as any;const data = reactive({});const onDownload = () => {htmlToPdf("合同信息", "#PdfContainer");};return {...toRefs(data), onDownload,}}
})
</script>
<style scoped lang='scss'>
.print-container {position: relative;display: flex;justify-content: center;padding: 30px;margin: 0 auto;margin-top: 20px;width: 850px;background-color: #fff;&:hover {box-shadow: 2px 0px 3px 3px #ddd;}.btn-print {position: absolute;right: -100px;top: 0px;}
}
</style>

效果图

http://www.dtcms.com/a/511608.html

相关文章:

  • 使用 Python 将 PDF 转成 Excel:高效数据提取的自动化之道
  • 神经网络初次学习收获
  • clickhouse学习笔记(一)基础概念与架构
  • 做网站的业务分析wordpress 国外免费主题
  • [人工智能-大模型-34]:模型层技术 - 通俗易懂的语言阐述Transformer架构
  • 推广你公司网站wordpress静态路由
  • 2017年下半年试题三:论无服务器架构及其应用
  • 内置线程池的核心参数分析配置
  • vim及其模式的操作
  • ESP32学习笔记(基于IDF):SmartConfig一键配网
  • 黑马商城day4-微服务02
  • 哪些网站可以找到做海报的素材浙江建设厅考试成绩查询
  • Python定时爬取新闻网站头条:从零到一的自动化实践
  • 纯CSS实现多种背景图案:渐变条纹、蓝图网格、波点与棋盘效果全解析(附 Sass Mixin 封装)
  • Linux相关概念和易错知识点(48)(epoll的底层原理、epoll的工作模式、反应堆模式)
  • 植物网站设计方案如何查网站是哪家公司做的
  • Vue 2 响应式系统常见问题与解决方案(包含_demo以下划线开头命名的变量导致响应式丢失问题)
  • [人工智能-大模型-33]:模型层技术 - 大模型的神经网络架构
  • MySQL 从库延迟 10 小时——磁盘静默错误引发的惨案
  • 【go语言】gopls工具与LSP协议全面解析
  • 网站页面设计怎么做东莞软件开发培训机构
  • 《算法每日一题(1)--- 第31场蓝桥算法挑战赛》
  • 低代码开发平台有哪些:数字化深水区的核心基建与品牌全景
  • 二元 LDPC码的Tanner图表示方法
  • 基于大数据的股票推荐系统 协同过滤推荐算法 数据分析可视化 Django框架 金融数据分析(源码+文档)✅
  • diffusion model(0.4.2) 为什么$\nabla_x \log p(x)$指向概率密度更高的区域?
  • Linux小课堂: 文件归档与压缩技术之从 tar 到 gzip、bzip2 与 zip/rar 详解
  • IT科技资讯新闻类织梦网站模板定制化网站开发
  • 编程 网站建设一站式快速网站排名多少钱
  • 工厂防护鞋穿戴检测预防足部伤害 防护鞋穿戴检测 未佩戴防护鞋实时报警 基于YOLOv8的防护鞋识别算法