vue项目使用Print.js插件实现PDF文件打印

news/2024/11/24 13:41:14/

一,Print.js介绍

在这里插入图片描述

Print.js主要是为了帮助我们在应用程序中直接打印PDF文件,而不需要离开界面,也不需要使用嵌入。对于用户不需要打开或下载PDF文件的特殊情况,只需要打印即可。

例如,当用户请求打印在服务器端生成的报告时,这是有用的一种情况。这些报告以PDF文件的形式发回。打印这些文件之前无需打开这些文件。Print.js提供了一种在我们的应用程序中快速打印这些文件的方法。

PDF文件必须与您的应用程序所在的域相同。Print.js在打印文件之前使用iframe加载文件,因此,它受到同源策略的限制。这有助于防止跨站点脚本(XSS)攻击。

  • 原生js,不依赖其它库
  • 可指定打印(或不打印)区域
  • 支持css样式(内联、外联、嵌入)
  • 支持input(radio/checkbox/text)、select、textarea值获取

二,下载安装

Print.js下载地址:https://download.csdn.net/download/weixin_43025151/87606898

或者使用npm安装

 npm install print-js --save

引入到自己的项目中:

  import print from 'print-js'

三,配置项

Print.js将接受一个对象作为参数,您可以在其中配置一些选项:

在这里插入图片描述

四,实现思路与项目示例

实现思路:将目标区域的dom/css添加到空iframe中,打印该iframe。

1) pdf的打印

     <button type="button" onclick="printJS('docs/printjs.pdf')">Print PDF</button>

2)base64

  <button type="button" onclick="printJS({printable: base64, type: 'pdf', base64: true})">Print PDF with Message</button>

3)html的打印

   <form method="post" action="#" id="printJS-form">...</form><button type="button" onclick="printJS('printJS-form', 'html')">Print Form</button>

4)图片的打印

   <img src="images/print-01.jpg" />printJS('images/print-01-highres.jpg', 'image')//打印多张图片printJS({printable: ['images/print-01-highres.jpg', 'images/print-02-highres.jpg', 'images/print-03-highres.jpg'],type: 'image',header: 'Multiple Images',imageStyle: 'width:50%;margin-bottom:20px;'})

5)打印json

    someJSONdata = [{name: 'John Doe',email: 'john@doe.com',phone: '111-111-1111'},{name: 'Barry Allen',email: 'barry@flash.com',phone: '222-222-2222'},{name: 'Cool Dude',email: 'cool@dude.com',phone: '333-333-3333'}]<button type="button" onclick="printJS({printable: someJSONdata, properties: ['name', 'email', 'phone'], type: 'json'})">Print JSON Data</button>

整个vue文件:

<template><div id="app"><div id="divPrint" class="mainbox print"><!-- <div style="font-size: 25px; margin-top: 80px" align="center">整改通知单</div> --><div align="center" style="margin: 0; padding: 0; width: 100%"><table><tr style="border: none"><td colspan="2">工程项目:xx</td><td style="text-align: right; padding-left: 10px;" colspan="2">编号:xx</td></tr><tr style="border: none"><td colspan="2">整改单位:xx</td><td style="text-align: right; padding-left: 10px;" colspan="2">编号:xx</td></tr><tr style="border: none"><td colspan="2">整改内容:xx</td><td style="text-align: right; padding-left: 10px;" colspan="2">编号:xx</td></tr></table></div></div><div style="margin-top: 20px; text-align: center"><button @click="print()">pdf打印</button></div></div>
</template><script>
import printJS from "print-js";
export default {name: "printing",data() {return {};},methods: {print() {printJS({printable: "divPrint", // 标签元素idtype: "html", // 打印类型header: "整改通知单", // '表单名称',targetStyles: ["*"],style: "@page {margin:0 10mm};", // 可选-打印时去掉眉页眉尾ignoreElements: ["no-print"], // 接受打印父 html 元素时应忽略的 html id 数组。properties: null,});},},
};
</script><style lang="scss">
#app {width: 100%;font-family: "Avenir", Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;.mainbox {width: 100%;margin: 0 auto;}
}
</style>

点击打印按钮后,出现PDF预览。
在这里插入图片描述

五,分析:

经过多次实战演练:
如果要打印的样式比较复杂,并且有字体图标等,建议选择第一种;
如果打印表格数据,比如element表格,还可以按需勾选进行打印,选择第二种打印方式比较好。

再分享一个强制分页打印,每页只打印固定的内容:
只需要在要分页打印的末尾加上:

<div style="page-break-after:always"></div>

即可
代码如下:

   <div id="printTable"v-for="(arr, i) in saveListArray":key="i"style="position: relative; background-color:rgb(236,230,232);margin-top:5px;":class="printWay == 3 ? 'printTableActive' : ''":style="{width: containerWidth + 'mm',height: containerHeight + 'mm',}"><el-container v-for="(item, index) in arr":key="index"><div id="printColor"v-bind:style="{width: Number(item.GoodInvoiceDetailWidth) + 'mm',height: item.GoodInvoiceDetailHeight + 'mm','line-height': item.GoodInvoiceDetailHeight + 'mm',left: Number(item.GoodInvoiceDetailCoordinateX) + Number(x) + 'mm',top: Number(item.GoodInvoiceDetailCoordinateY) + Number(y) + 'mm',color: item.GoodInvoiceDetailColour + '','font-size': item.GoodInvoiceDetailSize + 'mm','font-family': item.GoodInvoiceDetailFont + '','text-align': item.GoodInvoiceDetailPosition + '','border-top': item.GoodFramSize*0.1+0.1 + 'mm' + item.GoodFramSolidlineIf + item.borderTcolor,'border-bottom': item.GoodFramSize*0.1+0.1 + 'mm' + item.GoodFramSolidlineIf + item.borderBcolor,'border-left': item.GoodFramSize*0.1+0.1 + 'mm' + item.GoodFramSolidlineIf + item.borderLcolor,'border-right': item.GoodFramSize*0.1+0.1 + 'mm' + item.GoodFramSolidlineIf + item.borderRcolor,overflow: item.overflow,}"style=" display: inline-block;text-align:left;position: absolute;cursor: move;"><div v-if="item.GraphContent"><img :src="item.GraphContent"style="width:100%;height:100%;margin-top:4px;"></div><div v-elsestyle="margin-right:3px;margin-left:3px;">{{ item.GoodInvoiceDetailName }}</div></div></el-container><div style="page-break-after:always"></div></div>

下面展示两种图片:(一张没有加分页的,和加了分页的区别)
在这里插入图片描述

六,注意

不支持background-color背景色打印,试试用background-image代替,只在浏览器中预览打印,未实际打印过, 公司无公用打印机,低级浏览器兼容性待验证。


http://www.ppmy.cn/news/36553.html

相关文章

如何把ntfs改成苹果电脑使用及mac写入ntfs硬盘软件教程

ntfs是一种功能强大的文件系统&#xff0c;该格式的文件系统具有存储空间大&#xff0c;传输单个文件能力强&#xff0c;安全系数高等诸多优点&#xff0c;被广泛应用在移动硬盘中。但ntfs格式硬盘&#xff0c;不能在mac中被正常读写&#xff0c;那么ntfs怎么在mac使用&#xf…

leetcode 汉诺塔问题(面试题)

题目 在经典汉诺塔问题中&#xff0c;有 3 根柱子及 N 个不同大小的穿孔圆盘&#xff0c;盘子可以滑入任意一根柱子。一开始&#xff0c;所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动一个盘子;…

Matplotlib库基础图表函数及引力波的绘制实例

pyplot基本图表函数概述 pyplot饼图的绘制 plt.pie() lables指的是饼图的标签 sizes指的是对应的尺寸 explode让第二个30%突出0.1 autopct中间显示百分数的方式 shadowFalse二维饼图不带阴影 startangle90饼图的起始角度 加plt.axis(equal)可以让饼图成为一个正圆形的饼图…

Tomcat学习之源码模块

Tomcat核心模块剖析 Tomcat是一款流行的开源Servlet容器&#xff0c;它提供了一个Web应用程序的运行环境。Tomcat的核心模块可以分为以下几个方面&#xff1a; Catalina&#xff1a; Catalina是Tomcat的核心组件之一&#xff0c;它负责管理Tomcat的生命周期和处理请求。Cata…

【Python】照片居然能变素描?不会画画但是咱会代码

文章目录前言一、准备二、下载预训练模型总结前言 Photo-Sketching 一个能将照片的轮廓识别出来并将其转化为“速写”型图像的开源模块。 比如&#xff0c;这只小狗&#xff1a; 经过模型的转化&#xff0c;会变成卡通版的小狗&#xff1a; 非常秀&#xff0c;这很人工智能…

基于Python的高光谱图像分析教程

1、前言超光谱图像 (HSI) 分析因其在从农业到监控的各个领域的应用而成为人工智能 (AI) 研究的前沿领域之一。 该领域正在发表许多研究论文&#xff0c;这使它变得更加有趣&#xff01; 和“对于初学者来说&#xff0c;在 HSI 上开始模式识别和机器学习是相当麻烦的”&#xff…

pywinauto使用经验

在开发Windows应用程序时&#xff0c;我们经常需要进行测试来确保程序的质量和稳定性。手动测试是一种常见的方法&#xff0c;但是它非常耗时和繁琐&#xff0c;特别是对于大型的应用程序&#xff0c;测试工作量非常大。因此&#xff0c;我们需要自动化测试工具来帮助我们提高测…

selenium自动化测试框架搭建

免责声明:本博客提供的所有内容仅供学习、分享与交流&#xff0c;我们不保证内容的正确性。通过使用本博客内容随之而来的问题与本博客无关。当使用本博客代码时&#xff0c;代表你已接受本博客的免责声明 文章目录前言1、什么是selenium2.Selenium有以下几个特点&#xff1a;正…