uniapp生成pdf文件

uniapp生成pdf文件

1.需要安装两个插件
(1) html2canvas --将网页转换成图片
(2) jspdf --将图片转换为pdf
uniapp创建完后 在根目录用终端打开

1.初始化项目

 npm init

2.安装所需要的插件

  npm install html2canvas jspdf --save

3.安装之后引入到需要的页面

import html2canvas from 'html2canvas';
import jspdf from 'jspdf';

4.定义生成pdf的方法

downPdf() {
	window.scrollTo(0, 0) //首先滚动到顶部 如果要某一个元素 就滚动到元素位置
	let that = this;
	html2canvas(document.querySelector('#main'), {//对应的dom元素id(class也可以)
		allowTaint: true,//是否允许跨域图像渲染画布
		useCORS:true,//是否尝试使用 CORS 从服务器加载图像 解决图片跨域问题
	}).then(function (canvas) {
		//生成的canvas实例
		var contentWidth = canvas.width;//所选元素宽度
		var contentHeight = canvas.height;//所选元素高度
		//一页pdf显示html页面生成的canvas高度;
		var pageHeight = contentWidth / 595.28 * 841.89;
		//未生成pdf的html页面高度
		var leftHeight = contentHeight;
		//pdf页面偏移
		var position = 0;
		//a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
		var imgWidth = 555.28;
		var imgHeight = 555.28 / contentWidth * contentHeight;
		var pageData = canvas.toDataURL('image/jpeg', 1.0);//转成jpg格式
		var pdf = new jspdf('', 'pt', 'a4');//生成pdf实例
		//有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
		//当内容未超过pdf一页显示的范围,无需分页
		if (leftHeight < pageHeight) {
			pdf.addImage(pageData, 'JPEG', 20, 0, imgWidth, imgHeight);
		} else {
			while (leftHeight > 0) {
				pdf.addImage(pageData, 'JPEG', 20, position, imgWidth, imgHeight)
				leftHeight -= pageHeight;
				position -= 841.89;
				//避免添加空白页
				if (leftHeight > 0) {
					pdf.addPage();
				}
			}
		}
		//保存
		pdf.save('文件名.pdf');
		//可以吧生成的pdf转成其他格式 如 base64
		pdf.output('datauristring')//获取到base64 的pdf
	})
}

pdf 还有其他的格式文档所知
在这里插入图片描述

生成的pdf如果想要传给后端 就转换为base64的格式
在这里插入图片描述

点个关注支持一下我吧
在这里插入图片描述

### 实现 UniApp 页面打印 PDF 文件UniApp 中实现 PDF 打印功能可以通过多种方式完成。以下是几种常见方法: #### 方法一:使用 `vue-print-nb` 插件 通过命令行工具安装插件并配置项目环境。 ```bash npm install vue-print-nb --save ``` 接着,在项目的入口文件 `main.js` 添加如下代码引入组件[^1]: ```javascript import VuePrintNb from 'vue-print-nb' Vue.use(VuePrintNb); ``` 最后,在需要使用的页面上定义好要打印的内容区域,并绑定事件触发打印操作即可。 #### 方法二:调用原生插件接口 对于 Android 和 iOS 平台,可以利用第三方提供的 Native Plugin 来处理具体的打印逻辑。例如下面这段 JavaScript 代码展示了如何加载名为 "YanYu-PrintPDF" 的本地插件来执行实际的打印任务[^2]: ```javascript const printPdf = uni.requireNativePlugin('YanYu-PrintPDF'); var filePath = "/storage/emulated/0/test.pdf"; // pdf文件所在路径 printPdf.managerPrint(filePath); ``` 这种方法的优点在于可以直接访问设备底层的能力,从而获得更好的兼容性和性能表现;缺点则是依赖于特定平台的支持情况以及可能存在的权限问题。 #### 方法三:基于 HTML 转换为 PDF 后再打印 如果应用内部已经存在一些动态生成的数据表格或者其他形式的信息展示,则可以选择先把这些内容转换成静态图片或者矢量图形的形式保存下来,然后再进一步转存为 PDF 文档供后续打印输出之用。这里给出一段简单的例子说明这一过程是如何工作的[^3]: 首先确保已安装必要的库: ```bash npm i html2canvas jspdf ``` 然后编写相应的函数用于抓取 DOM 元素图像并将它们组合到一个新的 PDF 对象里去: ```javascript import html2canvas from 'html2canvas'; import { jsPDF } from 'jspdf'; function generatePdf() { const elementToPrint = document.getElementById('content-to-print'); html2canvas(elementToPrint).then(canvas => { let imgData = canvas.toDataURL('image/png'); let doc = new jsPDF(); doc.addImage(imgData, 'PNG', 10, 10); // Save the PDF doc.save("output.pdf"); }); } ``` 以上三种方案各有优劣之处,具体选择哪一种取决于应用场景和个人偏好等因素考虑。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值