问题1. wkhtmltopdf生成pdf过程中出现echart无法渲染问题,思路就是在服务端渲染echart图表,以base64形式展示到img标签上。asyncData是nuxt.js运行在服务端的生命周期。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   | <script> import * as echarts from 'echarts' import { getChartOptions1 } from '@/utils/index' const Canvas = require('canvas')
  export default {   async asyncData ({ $axios, query }) {     const options1 = getChartOptions1()     // 在服务端生成canvas节点     const canvas = new Canvas.Canvas(parseInt(986, 10), parseInt(380, 10))     echarts.setCanvasCreator(function () {       return canvas     })     // 初始化echart     const chart = echarts.init(canvas)     // 生成chart1     chart.setOption(options1)     const imgChart1 = `data:image/png;base64,${chart.getDom().toBuffer().toString('base64')}`
      return { imgChart1 }   } } </script>
   | 
 
node-canvas在服务端运行,需要根据不同操作系统配置环境,可以按照官方步骤配置
相似问题参考
使用node-canvas可能会遇到babel配置问题,可以参考
1 2 3
   | {   "presets": ["@babel/preset-env"] }
  | 
 
问题2. table表格分页之后出现多余的表头,解决方法
1 2 3
   | thead {   display: table-row-group; }
  | 
 
问题3. 对于不想tr分页被分割在两页时,可以设置
1 2 3
   | tr {   page-break-inside: avoid !important; }
  | 
 
问题4. 需要pdf在章节强制分页,可以在需要分页的地方插入一个div。
1 2 3 4 5
   | <div class="divider"></div>
  .divider {   page-break-before: always; }
   | 
 
问题5. 对于Vue、React单页应用项目可能存在无法渲染生成pdf问题,也可能是wkhtmltopdf内核版本问题,不过试了公司好几个项目都不行,最后使用了nuxt.js来进行服务端渲染。