Vue解决导出pdf文件图片展示不全问题

摘要:我们在开发过程中经常会碰见pdf导出不全的问题,今天我就来分享两个简单粗暴的方法,大家可以尝试一下

说个偷懒的办法,直接调用window.print() 方法就可以开启浏览器自带的打印功能。
如果还需要只截取网页部分可以在截图前将body替换掉,方法有很多可自行百度。
下面在说一种方法
首先引入两个工具,这里借用jspdf和html2canvas两个工具生成
这里是下载链接https://download.youkuaiyun.com/download/sunyv1/12424774

我们直接奔主体:

这个问题大概是由于html2canvas生成图片的时候不全导致的。我也是找了许多解决方案,下面分享两个:
1.显示被截取的元素绝不能有 overflow: hidden;,否则超出的部分就无法截取。
2.超过屏幕的部分截取异常,但是把屏幕滑到最顶端截取就正常了(我也不知道html2canvas出什么毛病)。既然是这样那就在截取之前加入以下代码,强制跳到顶端就能解决了。

window.pageYOffset = 0;
document.documentElement.scrollTop = 0
document.body.scrollTop = 0;

这段代码可以放创建canvas节点前面

比如我写的时候是放在了如下图:(因为工作环境的原因,导出pdf的整体代码就不在这里一一奉上了,可以自行百度)

### Vue 导出 PDF 内容解决方案 在 Vue 项目中导出 PDF 文件时,如果遇到内容问题,通常是因为以下几个原因造成的: #### 原因分析 1. **Canvas 处理范围有限** 当导出内容较多时,`toDataURL` 方法可能无法一次性处理所有的内容,从而导致部分数据丢失或空白页生成[^2]。 2. **ECharts 图表渲染问题** 如果页面中有 ECharts 图表,在将其转换为图像并嵌入到 PDF 中时,可能会由于分辨率设置当而导致图表显示或者模糊[^1]。 3. **字体加载问题** 使用 `pdfmake` 插件时,如果没有正确配置自定义字体(如中文支持),可能导致部分内容缺失或乱码[^3]。 --- #### 解决方案 以下是针对上述问题的具体解决方法: #### 一、分块处理大量内容导出内容超出单个 Canvas 的处理能力时,可以通过将内容拆分为多个 Canvas 进行分别处理。具体实现如下: ```javascript // 将 DOM 节点分割成多份 function splitContentToCanvases(contentElement, maxCanvasHeight) { const canvases = []; let currentY = 0; const ctx = document.createElement('canvas').getContext('2d'); contentElement.childNodes.forEach(node => { if (currentY + node.offsetHeight > maxCanvasHeight) { // 创建新的 canvas 并重置高度计数器 const newCanvas = document.createElement('canvas'); newCanvas.width = contentElement.offsetWidth; newCanvas.height = maxCanvasHeight; canvases.push(newCanvas); currentY = 0; } // 将节点绘制到当前 canvas 上 html2canvas(node).then(canvas => { const tempCtx = canvas.getContext('2d'); ctx.drawImage(tempCtx.canvas, 0, currentY); currentY += node.offsetHeight; }); }); return canvases; } ``` 通过此函数,可以将过长内容分解为多个 Canvas 对象,随后逐一添加至 PDF 文档中。 --- #### 二、优化 ECharts 图表导出质量 对于包含 ECharts 图表的情况,建议先将图表导出为高分辨率图片后再嵌入 PDF。以下是一个完整的流程示例: ```javascript async function exportChartAsImage(chartInstance) { const chartDataUrl = await chartInstance.getConnectedGraph().getDataURL({ pixelRatio: 3, // 提升分辨率 backgroundColor: '#fff' // 设置背景颜色防止灰色边缘 }); return chartDataUrl; } export async function addChartToPdf(pdfDoc, chartInstance, yPosition) { const imageDataUrl = await exportChartAsImage(chartInstance); const imgWidth = pdfDoc.page.width / 2; // 控制宽度适配 A4 页面大小 const imgHeight = (imgWidth * 720) / 1280; // 根据宽高比例计算高度 pdfDoc.addImage(imageDataUrl, 'JPEG', 50, yPosition, imgWidth, imgHeight); // 添加到指定位置 } ``` 以上代码片段展示了如何调整像素比率来提高图表清晰度,并确保其能够完整地嵌入到 PDF 中。 --- #### 三、配置自定义字体以支持复杂字符集 为了使 PDF 支持中文或其他特殊字符集,需提前导入对应的 TTF 字体文件并通过 `pdfmake` 配置好字体映射关系。例如: ```javascript import pdfMake from "pdfmake/build/pdfmake"; import pdfFonts from "pdfmake/build/vfs_fonts"; const customFonts = { simsun: { normal: 'SIMSUN.TTC', bold: 'SIMSUNB.TTF', italics: 'SIMSUMI.TTF', bolditalics: 'SIMSUNBI.TTF' } }; pdfMake.fonts = Object.assign({}, pdfFonts.pdfMake.fonts, customFonts); pdfMake.vfs = Object.assign({}, pdfFonts.pdfMake.vfs, require('./custom-fonts.json')); // 加载额外字库资源 ``` 注意:这里假设已准备好名为 `custom-fonts.json` 的 JSON 文件用于存储扩展后的虚拟文件系统数据。 --- ### 总结 综上所述,要彻底解决 Vue 项目中导出 PDF 存在内容的现象,可以从三个方面入手——合理切割大尺寸文档结构;增强图形素材的质量表现力以及完善国际化文字环境的支持程度。只要按照上述指导原则操作即可有效规避常见陷阱。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值