当前位置:   article > 正文

pdfmake初体验

pdfmake

        最近产品迭代了一个需求,之前项目中有个pdf文件下载的功能要根据ui的设计,来实现pdf文件样式。

        这个需求后端老哥折腾了几天之后,样式最终也没有得到ui,产品,测试的满意。由于之前项目中的pdf下载基本上都是后端老哥来用模板完成,一时之间也没有想着用前端来实现。

        起初想着用htmlToCanvas+pdfJs来实现,但是pdf的样式和页面的样式不一致,并且靠截图生成的pdf一些分页截断的问题处理起来也比较麻烦。后面找了一圈,发现了pdfmake这个好东西,文档链接贴出来:pdfmake

        pdfmake就是根据配置一个json格式的pdf描述对象,然后通过里面的createPdf api来完成pdf的制作,但是默认的pdfmake不支持中文。

        使用步骤:

        1.使用vue-cli初始化一个项目;

        2.安装依赖 :

npm install pdfmake

        3.进入node_modules,并找到pdfmake目录,并在此目录下创建examples目录,再在examples目录里面创建fonts的子目录:

                        

        4.进入我的电脑,C:\Windows\Fonts 找到想要的中文字体,,复制粘贴到fonts文件夹下;

        5.打开node_modules的pdfmake文件夹的终端,运行

node build-vfs.js "./examples/fonts"

         6.在build文件夹下会生成vfs_fonts.js文件,这就是你刚刚复制进去的字体文件;

        7.如何在页面使用:

  1. <template>
  2. <div @click="downLoadPdf" class="hello">
  3. 下载pdf
  4. </div>
  5. </template>
  6. <script>
  7. import {defineComponent} from "vue";
  8. // 在项目里引入pdfmake
  9. import pdfMake from "pdfmake/build/pdfmake";
  10. import pdfFonts from "pdfmake/build/vfs_fonts";
  11. pdfMake.vfs = pdfFonts.pdfMake.vfs;
  12. pdfMake.vfs = pdfFonts.pdfMake.vfs;
  13. // 定义字体
  14. pdfMake.fonts = {
  15. // webfont是字体名,可以自定义,下面需要用这个名字配置字体
  16. webfont: {
  17. // simhei.ttf 这个文件已经在 我们生成的 vfs_font.js 文件中,且已经引入,所以可以直接使用
  18. //这里的字符串字体名称实际上映射的是node_modules里examples/fonts里对应的文件名
  19. normal: "simhei.ttf",
  20. bold: "simhei.ttf",
  21. italics: "simhei.ttf",
  22. bolditalics: "simhei.ttf",
  23. },
  24. // 可以定义多个字体
  25. anotherFontName: {
  26. },
  27. };
  28. // 下面我们来定义 pdfmake需要用的 pdf文件描述对象
  29. // 这个描述对象 具体的字段可以参考官方文档
  30. // 下面我们来定义 pdfmake需要用的 pdf文件描述对象
  31. // 这个描述对象 具体的字段可以参考官方文档
  32. var docDefinition = {
  33. pageMargins: [ 40, 60, 40, 60 ],
  34. content: [
  35. {text: 'csdn《pdfmake小尝》', headlineLevel: 1,},
  36. ],
  37. images: {
  38. snow: 'https://picsum.photos/seed/picsum/200/300',
  39. strawberries: {
  40. url: 'https://picsum.photos/id/1080/367/267',
  41. headers: {
  42. myheader: '123',
  43. myotherheader: 'abc',
  44. }
  45. }
  46. },
  47. background: function(currentPage, pageSize) {
  48. if(currentPage===1){
  49. return {
  50. image:'snow',
  51. width: pageSize.width,
  52. height: pageSize.height
  53. }
  54. }
  55. },
  56. pageSize: 'A4',
  57. defaultStyle: {
  58. // 设置我们定义的字体为默认字体
  59. font: "webfont",
  60. },
  61. footer: function(currentPage, pageCount) { if(currentPage===1){return null}return currentPage.toString() + ' of ' + pageCount; },
  62. header: function(currentPage, pageCount, pageSize) {
  63. // you can apply any logic and return any valid pdfmake element
  64. if(currentPage===1){return null}
  65. return [
  66. { text: 'simple text', alignment: (currentPage % 2) ? 'left' : 'right' },
  67. { canvas: [ { type: 'rect', x: 170, y: 32, w: pageSize.width - 170, h: 40 } ] }
  68. ]
  69. },
  70. };
  71. export default defineComponent(
  72. {
  73. name: 'HelloWorld',
  74. props: {
  75. msg: String
  76. },
  77. setup(){
  78. function downLoadPdf(){
  79. console.log('xiazai')
  80. pdfMake.createPdf(docDefinition).download("文件名", () => {
  81. console.log("complete");
  82. });
  83. }
  84. return {
  85. downLoadPdf
  86. }
  87. }
  88. }
  89. )
  90. </script>

        8.效果:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/880327
推荐阅读
相关标签
  

闽ICP备14008679号