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

使用ftp修改网站图片seo外包公司专家

使用ftp修改网站图片,seo外包公司专家,手机优化助手,贵州人才网最新招聘建筑类目前市面上常用的前端导出PDF库组合一般为: 1. html2canvas js-pdf 2. html2canvaspdf-lib 3. domtoimagepdf-lib 因本人项目中导出pdf需求为导出30页及以上的多页pdf,考虑性能问题,选择了 html2canvaspdf-lib 及domtoimagepdf-lib两种方…

目前市面上常用的前端导出PDF库组合一般为:

1. html2canvas + js-pdf

2. html2canvas+pdf-lib

3. domtoimage+pdf-lib

因本人项目中导出pdf需求为导出30页及以上的多页pdf,考虑性能问题,选择了 html2canvas+pdf-lib 及domtoimage+pdf-lib两种方式尝试实现

html2canvas+pdf-lib(个人推荐,因为适配ios Safari浏览器)

     本人是先尝试使用的domtoimage+pdf-lib方案,但实测中发现H5在ios Safari浏览器端倒不出来故有个html2canvas+pdf-lib方案,经实战测试该方案能够适配ios Safari浏览器导出!!!

代码如下:

首先引入必要插件:

yarn add pdf-lib
yarn add html2canvas
yarn add file-saver 

file-saver 插件很重要,使用a.click方案导出的pdf在Safari中不是直接下载,而是打开一个类似预览页的页面查看pdf,需用户分享导出,比较麻烦。

async downloadPDF() {// 创建一个新的 PDF 文档const pdfDoc = await PDFDocument.create();// 处理需转pdf的dom的id数组const pdfDoms = await this.handlePDFPageDom();this.allNum = pdfDoms.length;for (let i = 0; i < pdfDoms.length; i++) {this.loadText = `文件生成中${i + 1}/${this.allNum}`;const doc = document.querySelector("#" + pdfDoms[i]);const canvas = await html2canvas(doc, {scale: 2, // 提高清晰度,控制内存useCORS: true,});const imgDataUrl = canvas.toDataURL("image/jpeg", 0.95); // 压缩图像const imgBytes = await fetch(imgDataUrl).then((res) =>res.arrayBuffer());const img = await pdfDoc.embedJpg(imgBytes);// const { width, height } = img.scaleToFit(595.28, 841.89);const A4_WIDTH = 595.28; // A4 宽度const A4_HEIGHT = 841.89; // A4 高度const scale = Math.min(A4_WIDTH / img.width, A4_HEIGHT / img.height);const scaledWidth = img.width * scale;const scaledHeight = img.height * scale;const xOffset = (A4_WIDTH - scaledWidth) / 2;const yOffset = (A4_HEIGHT - scaledHeight) / 2;const page = pdfDoc.addPage([595.28, 841.89]);page.drawImage(img, {x: xOffset,y: yOffset,width: scaledWidth,height: scaledHeight,});canvas.remove();await new Promise((resolve) => setTimeout(resolve, 100)); // 防止卡死}const pdfBytes = await pdfDoc.save();const blob = new Blob([pdfBytes], {type: "application/octet-stream",});FileSaver.saveAs(blob, `导出的PDF.pdf`);uni.hideLoading();this.loadText = "文件生成成功!";},

domtoimage+pdf-lib

async downloadPDF() {this.loadText = "文件生成中...";// 创建一个新的 PDF 文档const pdfDoc = await PDFDocument.create();// 处理需转pdf的dom idconst pdfDoms = await this.handlePDFPageDom();let pdfPage = [];let base64Arr = [];for (let i = 0; i < pdfDoms.length; i++) {const element = document.getElementById(pdfDoms[i]);const url = await domtoimage.toPng(element, {quality: 0.95,skipFonts: true,});base64Arr.push({ base64: url });}await base64Arr.map((item, index) => {pdfDoc.addPage([595.28, 841.89]);pdfPage.push(this.handleReportView(item.base64, index, pdfDoc));});await Promise.all(pdfPage).then(async (res) => {// 将 PDF 文档保存为 Uint8Arrayconst pdfBytes = await pdfDoc.save();// 生成下载链接并自动下载 PDFconst blob = new Blob([pdfBytes], { type: "application/pdf" });const link = document.createElement("a");link.href = URL.createObjectURL(blob);link.download = `${this.studentName}.pdf`;link.click();URL.revokeObjectURL(link.href);uni.hideLoading();this.loadText = "文件生成成功!";setTimeout(() => {window.parent.postMessage({cmd: "success",});}, 1000);}).catch((err) => {// PDF = null;console.log("生成失败", err);});},
async handleReportView(imgBase64, index, pdfDoc) {const A4_WIDTH = 595.28; // A4 宽度const A4_HEIGHT = 841.89; // A4 高度// 获取所有页面const pages = pdfDoc.getPages();// 修改第index页(索引从0开始)const pageNow = pages[index];return await new Promise(async (resolve, reject) => {const pageData = imgBase64;// setTimeout(() => {let img = new Image();img.crossOrigin = "Anonymous";img.onload = async () => {const imgBytes = await fetch(pageData).then((res) =>res.arrayBuffer());// 嵌入 PNG 图片const pngImage = await pdfDoc.embedPng(imgBytes);const { width: imgWidth, height: imgHeight } = img;// 计算缩放比例,确保图片适应 A4 页面并保持宽高比const scale = Math.min(A4_WIDTH / imgWidth, A4_HEIGHT / imgHeight);const scaledWidth = imgWidth * scale;const scaledHeight = imgHeight * scale;img.width = scaledWidth;img.height = scaledHeight;// 计算图片的偏移量,使其居中显示在页面上const xOffset = (A4_WIDTH - scaledWidth) / 2;const yOffset = (A4_HEIGHT - scaledHeight) / 2;// 将内容设置到第几页await pageNow.drawImage(pngImage, {x: xOffset,y: yOffset,width: scaledWidth,height: scaledHeight,});resolve();};img.onerror = () => {alert("资源加载失败");resolve();};img.src = pageData;// }, 500);}).catch((err) => {return Promise.resolve();});},

http://www.dtcms.com/wzjs/389335.html

相关文章:

  • 清远手机网站建设免费网页空间到哪申请
  • 设置网站的黑名单怎么做疫情最新资讯
  • 优异网站网络销售推广公司
  • 挂马网站 名单站长之家工具查询
  • 做引流去那些网站好网站产品怎么优化
  • java网站开发实例视频教程兰州网站优化
  • 网络运营商包括哪些关键词优化排名软件s
  • 做网站用php还是javaseo入门课程
  • 东莞做网站dgjcwl网络营销方案怎么写
  • wordpress开启子目录多站点模式泰安百度公司代理商
  • 龙信建设集团网站运营是做什么的
  • 商城系统appseo网络推广优势
  • 一级a做爰视频安全网站免费收录平台
  • 手机视频制作软件最火北京seo设计公司
  • 自己网站做优化的有权利卖么免费推客推广平台
  • 怎样创建音乐网站中国搜索引擎排名2021
  • 自己给公司做网站想做游戏推广怎么找游戏公司
  • 有人知道网站怎么做吗国外网站建设
  • 做一个公司展示型网站多少钱企业建站要多少钱
  • 哪些公司网站推广能赚钱百度纯净版首页入口
  • 设计师做单页的网站百度关键词广告怎么收费
  • 自己动手的网站学seo需要多久
  • 汕头品牌设计公司北京seo排名技术
  • 做绿色软件的网站知乎友链交换平台源码
  • 虚拟机建设网站广州seo推广培训
  • 做网站需要注意的问题德州seo优化
  • wordpress文章幻灯片代码南宁百度seo排名优化
  • 无锡网站建设哪家专业怎么开个人网站
  • WordPress快速添加图片茂名seo快速排名外包
  • 做网站要租服务器semester什么意思