前端小工具-HTML转换PDF
前端小工具-HTML转换PDF
HTML转换图片
HTML转换PDF,主要用 html2canvas+jsPDF 对页面进行截图然后转换PDF。
实践时间和兼容性,html2canvas 存在历史遗留问题,微信环境会假死,iOS13.4,13.7 等版本也假死的情况,低版本html2canvas对新浏览器支持也够。后来个人项目直接废弃了。
html2canvas 太强大,同时也遗留很多兼容问题,主要用到的是html转换图片,通过 dom-to-image 替换一下
1. 安装依赖
npm install jspdf npm install html2canvas @1.3.4
npm install dom-to-image
html2canvas 版本有点问题,部分截图不全,点击无效的情况,小心使用。
2. HTML转换图片
给滚动BOX内层添加 id ,如果没有内层,那需要嵌套一个,如果直接给滚动层添加id,那截图只有可视区域。注意!
给滚动BOX内层添加 id ,如果没有内层,那需要嵌套一个,如果直接给滚动层添加id,那截图只有可视区域。注意!
使用dom-to-image转换成图片
let element = document.getElementById('element-to-print'); domtoimage.toBlob(element).then(blob => { option.FormDataImg = blob; });
使用html2canvas转换成图片
let element = document.getElementById('element-to-print'); html2canvas(element).then(canvas => { canvas.toBlob(blob => { const blobUrl = window.URL.createObjectURL(blob); }, 'image/jpeg'); });
如果要保存图片到服务器上面,要看接口是否支持blob了,如果支持直接传递就可以了,
一般情况支持类型都是File,所以,还需要对blob进行file文件转换
handleFileUpload = blob => { return new Promise((resolve, reject) => { try { const file = new window.File([blob], parseInt(Math.random() * 100000, 10) + 'updata.jpg', { type: 'image/jpeg', lastModified: Date.now(), }); const params = new FormData(); params.append('file', file); axios.post(Paths.fileUpload, params).then(res => { if (res.data.code === 0) { resolve(res.data.data); } else { reject(); } }); } catch (error) { reject(error); } }); };
File对象不太了解的话,得自己查阅文件了。
FormData文件流必须的,其中params.append('file', file),就是接口指定的文件参数,具体指定看服务端要求。
3. 图片转换PDF
let element = document.getElementById('element-to-print'); html2canvas(element).then(canvas => { handlePdfFile(canvas) }); handlePdfFile = canvas => { const contentWidth = canvas.width; const contentHeight = canvas.height; const pageData = canvas.toDataURL('image/jpeg', 1.0); const pdfX = ((contentWidth + 10) / 2) * 0.75; const pdfY = ((contentHeight + 100) / 2) * 0.75; // 100为底部留白 const imgX = pdfX; const imgY = (contentHeight / 2) * 0.75; //内容图片这里不需要留白的距离 const PDF = new jsPDF('', 'pt', [pdfX, pdfY]); PDF.addImage(pageData, 'jpeg', 0, 0, imgX, imgY); // PDF.save('download.pdf'); const pdfFile = PDF.output('blob'); console.log(pdfFile); };
PDF.save('download.pdf');就可以直接保存文档了,部分移动端无效的情况,微信环境下需要使用微信api,浏览器转换下自己用方法下载,PDF.output('dataurl);直接导出文件路径。
PDF.output('blob');同上blob文件,也可以转换URL使用,或者转化文件对象保存服务环境。
jsPDF还有多种生成技巧,具体可以参考官方例子和文档:https://github.com/parallax/jsPDF
html2canvas官方例子文档比较完善,具体可以参考官方例子和文档:http://html2canvas.hertzen.com/documentation
Word、PDF、Excel、log日志文档预览,更多文件转换技巧请查看:https://www.cnblogs.com/bore/p/13072477.html
时间是一个好东西,记录的是爱你的证据
没有终点,没有彼岸,坚持就好,愿岁月如初