rpt_print.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /**
  2. * Created by Tony on 2018/4/24.
  3. */
  4. let rptPrintHelper = {
  5. preview: function () {
  6. if (zTreeOprObj.currentRptPageRst) {
  7. // window.location.href = '/rpt_print';
  8. sessionStorage.currentPageData = JSON.stringify(zTreeOprObj.currentRptPageRst);
  9. sessionStorage.pageSize = rptControlObj.getCurrentPageSize();
  10. sessionStorage.orientation = rptControlObj.getCurrentOrientation();
  11. sessionStorage.scaleFactor = 1;
  12. window.open('/rpt_print');
  13. } else {
  14. sessionStorage.currentPageData = null;
  15. }
  16. },
  17. print: function () {
  18. //
  19. },
  20. buildSvgArr: function (pagesData, offsetX, offsetY) {
  21. let styles = pagesData[JV.NODE_STYLE_COLLECTION],
  22. fonts = pagesData[JV.NODE_FONT_COLLECTION],
  23. controls = pagesData[JV.NODE_CONTROL_COLLECTION]
  24. ;
  25. let rst = [];
  26. for (let page of pagesData.items) {
  27. let svgPageArr = [], pixelSize = getPixelSize(pagesData);
  28. svgPageArr.push("<svg width='" + pixelSize[0] + "' height='" + pixelSize[1] + "'>");
  29. for (let cell of page.cells) {
  30. svgPageArr.push(buildCellSvg(cell, fonts, styles, controls, page[JV.PROP_PAGE_MERGE_BORDER], pagesData[JV.BAND_PROP_MERGE_BAND], offsetX, offsetY));
  31. }
  32. svgPageArr.push("</svg>");
  33. rst.push(svgPageArr);
  34. }
  35. return rst;
  36. }
  37. };
  38. function getActualBorderStyle(cell, styles, mergeBorderStyle, pageBorderArea, borderStr) {
  39. let rst = styles[cell[JV.PROP_STYLE]][borderStr];
  40. if (mergeBorderStyle) {
  41. if (parseFloat(cell[JV.PROP_AREA][borderStr]) === parseFloat(pageBorderArea[borderStr])) {
  42. rst = mergeBorderStyle[borderStr];
  43. }
  44. }
  45. return rst;
  46. }
  47. function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY) {
  48. let rst = [];
  49. let style = styles[cell[JV.PROP_STYLE]];
  50. let mergeBandStyle = null;
  51. if (rptMergeBorder) {
  52. mergeBandStyle = styles[rptMergeBorder[JV.PROP_STYLE]];
  53. }
  54. let left = parseInt(cell[JV.PROP_AREA][JV.PROP_LEFT]) + offsetX + 0.5,
  55. right = parseInt(cell[JV.PROP_AREA][JV.PROP_RIGHT]) + offsetX + 0.5,
  56. top = parseInt(cell[JV.PROP_AREA][JV.PROP_TOP]) + offsetY + 0.5,
  57. bottom = parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) + offsetY + 0.5,
  58. x = left, y = top,
  59. text_anchor = "start"
  60. ;
  61. if (style) {
  62. let leftBS = getActualBorderStyle(cell, styles, mergeBandStyle, (pageMergeBorder)?pageMergeBorder:rptMergeBorder[JV.PROP_AREA], JV.PROP_LEFT);
  63. // if (style[JV.PROP_LEFT] && parseFloat(style[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]) > 0) {
  64. if (leftBS && parseFloat(leftBS[JV.PROP_LINE_WEIGHT]) > 0) {
  65. rst.push("<line x1='" + left + "' y1='" + top +
  66. "' x2='" + left + "' y2='" + bottom +
  67. "' style='stroke:rgb(0,0,0);stroke-width:1'/>")
  68. }
  69. let rightBS = getActualBorderStyle(cell, styles, mergeBandStyle, (pageMergeBorder)?pageMergeBorder:rptMergeBorder[JV.PROP_AREA], JV.PROP_RIGHT);
  70. // if (style[JV.PROP_RIGHT] && parseFloat(style[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]) > 0) {
  71. if (rightBS && parseFloat(rightBS[JV.PROP_LINE_WEIGHT]) > 0) {
  72. rst.push("<line x1='" + right + "' y1='" + top +
  73. "' x2='" + right + "' y2='" + bottom +
  74. "' style='stroke:rgb(0,0,0);stroke-width:1'/>")
  75. }
  76. let topBS = getActualBorderStyle(cell, styles, mergeBandStyle, (pageMergeBorder)?pageMergeBorder:rptMergeBorder[JV.PROP_AREA], JV.PROP_TOP);
  77. // if (style[JV.PROP_TOP] && parseFloat(style[JV.PROP_TOP][JV.PROP_LINE_WEIGHT]) > 0) {
  78. if (topBS && parseFloat(topBS[JV.PROP_LINE_WEIGHT]) > 0) {
  79. rst.push("<line x1='" + left + "' y1='" + top +
  80. "' x2='" + right + "' y2='" + top +
  81. "' style='stroke:rgb(0,0,0);stroke-width:1'/>")
  82. }
  83. let bottomBS = getActualBorderStyle(cell, styles, mergeBandStyle, (pageMergeBorder)?pageMergeBorder:rptMergeBorder[JV.PROP_AREA], JV.PROP_BOTTOM);
  84. // if (style[JV.PROP_BOTTOM] && parseFloat(style[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]) > 0) {
  85. if (bottomBS && parseFloat(bottomBS[JV.PROP_LINE_WEIGHT]) > 0) {
  86. rst.push("<line x1='" + left + "' y1='" + bottom +
  87. "' x2='" + right + "' y2='" + bottom +
  88. "' style='stroke:rgb(0,0,0);stroke-width:1'/>")
  89. }
  90. }
  91. let font = cell[JV.PROP_FONT];
  92. if (typeof font === 'string') {
  93. font = fonts[cell[JV.PROP_FONT]];
  94. }
  95. let fontsize = Math.round(parseInt(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]) * 3 / 4);
  96. let fontWeight = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold":"normal";
  97. let control = controls[cell[JV.PROP_CONTROL]];
  98. if (control) {
  99. if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "left") {
  100. text_anchor = "start";
  101. x = left + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
  102. } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "right") {
  103. text_anchor = "end";
  104. x = right - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
  105. } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "center") {
  106. text_anchor = "middle";
  107. x = Math.round((left + right) / 2);
  108. }
  109. if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "top") {
  110. y = top + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
  111. } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "bottom") {
  112. y = bottom - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM];
  113. } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "center") {
  114. y = Math.round((top + bottom + fontsize) / 2 );
  115. }
  116. }
  117. rst.push("<text style='fill:black;font-family:" + font[JV.PROP_NAME] +
  118. ";font-weight:" + fontWeight +
  119. ";font-size:" + fontsize + "pt' x='" +
  120. x +"' y='" + y + "' text-anchor='" + text_anchor + "'>" + cell[JV.PROP_VALUE] + "</text>");
  121. return rst.join("");
  122. }
  123. function getPixelSize(pagesData) {
  124. let rst = [793,1122];
  125. let SCREEN_DPI = [96,96];
  126. if (pagesData[JV.NODE_PAGE_INFO] && pagesData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE]) {
  127. rst[0] = Math.round(SCREEN_DPI[0] * pagesData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][0]);
  128. rst[1] = Math.round(SCREEN_DPI[1] * pagesData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1]);
  129. }
  130. return rst;
  131. }