Report.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <style lang="scss" scoped>
  2. .top{
  3. text-align: right;
  4. padding: 15px;
  5. }
  6. #print-part{
  7. width: 1240px;
  8. margin: 0 auto;
  9. .page{
  10. width: 100%;
  11. height: 1754px;
  12. background: url("../images/report-math/back.jpg")no-repeat center;
  13. background-size: cover;
  14. h1{
  15. text-align: center;
  16. }
  17. }
  18. }
  19. #singleCanvas{
  20. display: none;
  21. }
  22. </style>
  23. <template>
  24. <div class="report">
  25. <div class="top">
  26. <el-button type="primary" plain @click="download">导出PDF</el-button>
  27. </div>
  28. <div id="print-part">
  29. <div class="page">
  30. <img src="@/images/report-math/start-main.png">
  31. <p>初中数学学科</p>
  32. <p>诊断报告</p>
  33. <p>[Mathematics - Diagnostic Report]</p>
  34. </div>
  35. <div class="page">
  36. <h1>B</h1>
  37. </div>
  38. <div class="page">
  39. <h1>C</h1>
  40. </div>
  41. <div class="page">
  42. <h1>D</h1>
  43. </div>
  44. <div class="page">
  45. <h1>E</h1>
  46. </div>
  47. <div class="page">
  48. <h1>F</h1>
  49. </div>
  50. <div class="page">
  51. <h1>G</h1>
  52. </div>
  53. <div class="page">
  54. <h1>H</h1>
  55. </div>
  56. <div class="page">
  57. <h1>I</h1>
  58. </div>
  59. <div class="page">
  60. <h1>J</h1>
  61. </div>
  62. <div class="page">
  63. <h1>K</h1>
  64. </div>
  65. <div class="page">
  66. <h1>L</h1>
  67. </div>
  68. <div class="page">
  69. <h1>M</h1>
  70. </div>
  71. <div class="page">
  72. <h1>N</h1>
  73. </div>
  74. <div class="page">
  75. <h1>O</h1>
  76. </div>
  77. <div class="page">
  78. <h1>P</h1>
  79. </div>
  80. </div>
  81. <canvas id="singleCanvas" width="1240" height="1754">
  82. </canvas>
  83. </div>
  84. </template>
  85. <script>
  86. import html2Canvas from 'html2canvas'
  87. import JsPDF from 'jspdf'
  88. export default {
  89. name: 'Report',
  90. components: {
  91. },
  92. data () {
  93. return {
  94. imgWidth: 595.28,
  95. imgHeight: 841.89,
  96. PDF: new JsPDF('p', 'pt', 'a4')
  97. }
  98. },
  99. created() {
  100. },
  101. mounted(){
  102. },
  103. methods: {
  104. download(){
  105. this.PDF = new JsPDF('p', 'pt', 'a4');
  106. html2Canvas(document.getElementById('print-part'), {
  107. allowTaint: true
  108. })
  109. .then(canvas => {
  110. let ctx = canvas.getContext("2d");
  111. let singleCanvas = document.getElementById('singleCanvas');
  112. let singleCtx = singleCanvas.getContext("2d");
  113. let contentWidth = singleCanvas.width;
  114. let contentHeight = singleCanvas.height;
  115. let pageNum = canvas.height / contentHeight;
  116. for(let i = 0;i < pageNum; i++){
  117. let pageImg = ctx.getImageData(0,contentHeight * i,contentWidth,contentHeight * (i + 1));
  118. singleCtx.putImageData(pageImg,0,0);
  119. let pageData = singleCanvas.toDataURL('image/jpeg', 1.0);
  120. this.PDF.addImage(pageData, 'JPEG', 0, 0, this.imgWidth, this.imgHeight);
  121. if(i + 1 < pageNum){
  122. this.PDF.addPage();
  123. }
  124. }
  125. this.PDF.save('title' + '.pdf');
  126. });
  127. }
  128. }
  129. }
  130. </script>