.net网站开发视频,山东省住房和城乡建设厅网站教育中心,html网站正在建设源码,wordpress 无法显示使用 vue-html2pdf 插件
业务背景#xff0c;老板想要一份能征服客户的pdf报表#xff0c;传统的pdf要手撕#xff0c;企业中确实有点耗费时间#xff0c;于是github上面看到开源的这个插件就…废话不多说#xff0c;直接上教程
1.使用下面命令安装 vue-html2pdf
npm i…使用 vue-html2pdf 插件
业务背景老板想要一份能征服客户的pdf报表传统的pdf要手撕企业中确实有点耗费时间于是github上面看到开源的这个插件就…废话不多说直接上教程
1.使用下面命令安装 vue-html2pdf
npm i vue-html2pdf2.在vue组件下使用
templatediv!-- 具体说明看文档 --vue-html2pdf:show-layoutfalse:float-layouttrue:enable-downloadtrue:preview-modaltrue:paginate-elements-by-height1400:filenamefileName:pdf-quality2:manual-paginationfalsepdf-formata4pdf-orientationportraitpdf-content-width800pxprogressonProgress($event)hasStartedGenerationhasStartedGeneration()renderedhasGenerated($event)refhtml2Pdfsection slotpdf-content!-- 这里写要生成PDF的元素 --section classpdf-itemspandiv classwrapperdiv classheaderdiv classmaindiv classfooter/span/sectiondiv classhtml2pdf__page-break/ //分页...有几页就再写一个pdf-item就好了/section/vue-html2pdf/div
/template
//引入vue-html2pdf
import VueHtml2pdf from vue-html2pdf;
export default {components: {//注册组件VueHtml2pdf},methods: {//声明下载为PDF的方法generateReport () {this.$refs.html2Pdf.generatePdf()}},
}另外我加了进度条看到有这个加载的属性就顺便封装了个进度条看起来更优雅一点。默认值我设置的1这个看自己调整。废话不说直接上代码Progress.vue在项目中直接引用即可
templatediv classm-progress :stylewidth:${width}px;div classm-progress-outerdiv classm-progress-innerdiv :class[u-progress-bg, {u-success-bg: progress 100}] :stylewidth: ${progress 100 ? 100:progress}%; height: ${strokeWidth}px;/div/div/divtemplate v-ifshowInfo/templatesvg classu-success v-ifprogress100 viewBox64 64 896 896 data-iconcheck-circle aria-hiddentrue focusablefalsepath dM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm193.5 301.7l-210.6 292a31.8 31.8 0 0 1-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.5 12.7z/path/svgp classu-progress-text v-else{{ progress100 ? 100:progress }}%/p/div
/template
script
export default {name: Progress,props: {width: { // 进度条总宽度type: Number,default: 600},progress: { // 当前进度type: Number,default: 1},strokeWidth: { // 进度条线的宽度type: Number,default: 8},showInfo: { // 是否显示进度数值或状态图标type: Boolean,default: true}}
}
/script
style langscss scopedscoped
.m-progress {height: 24px;margin: 0 auto;display: flex;.m-progress-outer {width: 100%;.m-progress-inner {display: inline-block;width: 100%;background: #f5f5f5;border-radius: 100px;.u-progress-bg {// background: #1890FF;background: linear-gradient(to right, rgb(16, 142, 233), rgb(135, 208, 104));border-radius: 100px;transition: all .3s cubic-bezier(.08,.82,.17,1);}.u-success-bg {background: #52C41A;}}}.u-success {width: 16px;height: 16px;fill: #52C41A;margin-left: 8px;margin-top: 4px;}.u-progress-text {font-size: 16px;line-height: 24px;margin-left: 8px;color: rgba(0,0,0,.45);}
}
/style3.属性整理一下
属性值描述本人建议show-layouttrue/false是否显示要转为 PDF 的元素调式要转出的元素的布局时 true平时 falsefloat-layouttrue/false如果道具设置为 false 道具 show-layout 将被覆盖。布局不会浮动并且布局将始终显示。我一直使用的 true因为做的时候做了两份一个是在后台显示的一个是导出为 PDF 的布局不一样enable-downloadtrue/false是否弹出转 PDF 后的预览模板为 true 时调用上面的下载方法默认弹出预览模板调试时开启完工后关闭preview-modaltrue/false是否弹出转 PDF 后的预览模板为 true 时调用上面的下载方法默认弹出预览模板调试时开启完工后关闭paginate-elements-by-height任何数字输入的数字将用于对元素进行分页数字仅以 px 为单位。官方默认 1400没动过filename任何字符串导出后的默认 PDF 文件名自定义pdf-quality0 - 2可以有小数2 是最高质量0.1 是最低质量0 将使 PDF 消失。官方虽然说是 0~2但是我调 5 也是更高清了manual-paginationtrue/false为 true 时不会自动对元素进行分页。为 false 时分页将依赖于具有“html2pdf__page-break”类的元素来知道在哪里分页也就是下面所写的我一直使用的 false看需求pdf-formata0, a1, a2, a3, a4, letter, legal, a5, a6, a7, a8, a9, a10这是 PDF 格式纸张尺寸一般都用的a4所以 a4pdf-orientationportrait, landscapePDF 方向landscape 是横向portrait 是纵向看需求pdf-content-width任何 css 尺寸例如“800px”、“65vw”、“70%”PDF 内容宽度800px 应该是 a4 最大的尺寸具体边距我使用的 padding
4.说到分页这个组件中有自动分页但是会影响你的页眉页脚如果不想自动分页的话直接在元素后面加上下面代码即可分页
div classhtml2pdf__page-break/div5.个人使用感想使用这个插件后渲染的话还可以的直接和vue能搭配更能和E-Charts搭配使用确实方便优点节约开发成本提高开发效率拿来即用。缺点不支持超链接功能有时候业务场景需要在pdf中超链接如果有这个功能的话那就很全了。当然也不是说这个组件不好使用起来还是比较丝滑的。主要是看业务场景吧。 6. 项目中遇到比较棘手的问题就是动态排版展示因为本人是后端所以跟专业前端大佬不能比就想记录一下 本身是想写死多少个平台然后使用v-if或者v-show来展示但是代码量有点冗余不说还没有排版好就想到了v-for。 div classb1 stylewidth: 100%; display: flex; flex-wrap: wrap;div v-for(platform, index) in platforms:keyindex v-ifplatform.count 0classbordered3styleflex-basis: calc(50% - 10px); margin-right: 10px; margin-bottom: 10px;div classr3p classp1{{ platform.instituteType }}处理违规数量/pspan classp2{{ platform.count }}/span/divdiv classr4img classtb:srcgetPlatformImage(platform.instituteType)altSample Image/div/div/divv-for主要没啥主要是动态样式调整起来确实费事终于能体会到前端大佬的不易觉得好玩的可以去试试