rpt_svg_util.js 4.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /**
  2. * Created by Tony on 2018/6/27.
  3. * 报表直接打印需要
  4. */
  5. let JV = require('../rpt_component/jpc_value_define');
  6. const SCREEN_DPI = [96,96];
  7. module.exports = {
  8. exportSvgStr: function (pagesData, callback) {
  9. let styles = pagesData[JV.NODE_STYLE_COLLECTION],
  10. fonts = pagesData[JV.NODE_FONT_COLLECTION],
  11. controls = pagesData[JV.NODE_CONTROL_COLLECTION]
  12. ;
  13. for (let page of pagesData.items) {
  14. let svgPageArr = [], pixelSize = getPixelSize(pagesData);
  15. svgPageArr.push("<svg width='" + pixelSize[0] + "' height='" + pixelSize[1] + "'>");
  16. for (let cell of page.cells) {
  17. svgPageArr.push(buildCellSvg(cell, fonts, styles, controls, page[JV.PROP_PAGE_MERGE_BORDER]));
  18. }
  19. svgPageArr.push("</svg>");
  20. }
  21. }
  22. }
  23. function buildCellSvg(cell, fonts, styles, controls, mergeBorder) {
  24. let rst = [];
  25. let style = styles[cell[JV.PROP_STYLE]];
  26. if (style) {
  27. if (style[JV.PROP_LEFT] && parseFloat(style[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]) > 0) {
  28. rst.push("<line x1='" + cell[JV.PROP_AREA][JV.PROP_LEFT] + "' y1='" + cell[JV.PROP_AREA][JV.PROP_TOP] +
  29. "' x2='" + cell[JV.PROP_AREA][JV.PROP_LEFT] + "' y2='" + cell[JV.PROP_AREA][JV.PROP_BOTTOM] +
  30. "' style='stroke:rgb(0,0,0);stroke-width:1'/>")
  31. }
  32. if (style[JV.PROP_RIGHT] && parseFloat(style[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]) > 0) {
  33. rst.push("<line x1='" + cell[JV.PROP_AREA][JV.PROP_RIGHT] + "' y1='" + cell[JV.PROP_AREA][JV.PROP_TOP] +
  34. "' x2='" + cell[JV.PROP_AREA][JV.PROP_RIGHT] + "' y2='" + cell[JV.PROP_AREA][JV.PROP_BOTTOM] +
  35. "' style='stroke:rgb(0,0,0);stroke-width:1'/>")
  36. }
  37. if (style[JV.PROP_TOP] && parseFloat(style[JV.PROP_TOP][JV.PROP_LINE_WEIGHT]) > 0) {
  38. rst.push("<line x1='" + cell[JV.PROP_AREA][JV.PROP_LEFT] + "' y1='" + cell[JV.PROP_AREA][JV.PROP_TOP] +
  39. "' x2='" + cell[JV.PROP_AREA][JV.PROP_RIGHT] + "' y2='" + cell[JV.PROP_AREA][JV.PROP_TOP] +
  40. "' style='stroke:rgb(0,0,0);stroke-width:1'/>")
  41. }
  42. if (style[JV.PROP_BOTTOM] && parseFloat(style[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]) > 0) {
  43. rst.push("<line x1='" + cell[JV.PROP_AREA][JV.PROP_LEFT] + "' y1='" + cell[JV.PROP_AREA][JV.PROP_BOTTOM] +
  44. "' x2='" + cell[JV.PROP_AREA][JV.PROP_RIGHT] + "' y2='" + cell[JV.PROP_AREA][JV.PROP_BOTTOM] +
  45. "' style='stroke:rgb(0,0,0);stroke-width:1'/>")
  46. }
  47. }
  48. let font = cell[JV.PROP_FONT];
  49. if (typeof font === 'string') {
  50. font = fonts[cell[JV.PROP_FONT]];
  51. }
  52. let fontsize = parseInt(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]);
  53. let left = parseInt(cell[JV.PROP_AREA][JV.PROP_LEFT]),
  54. right = parseInt(cell[JV.PROP_AREA][JV.PROP_RIGHT]),
  55. top = parseInt(cell[JV.PROP_AREA][JV.PROP_TOP]),
  56. bottom = parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]),
  57. x = left, y = top,
  58. text_anchor = "start"
  59. ;
  60. let control = controls[cell[JV.PROP_CONTROL]];
  61. if (control) {
  62. if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "left") {
  63. text_anchor = "start";
  64. x = left + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
  65. } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "right") {
  66. text_anchor = "end";
  67. x = right - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
  68. } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "center") {
  69. text_anchor = "middle";
  70. x = Math.round((left + right) / 2);
  71. }
  72. if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "top") {
  73. y = top + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
  74. } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "bottom") {
  75. y = bottom - fontsize - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM];
  76. } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "center") {
  77. y = Math.round((top + bottom + fontsize) / 2 );
  78. }
  79. }
  80. rst.push("<text style='fill:black;font-size:" + fontsize + "pt' x='" + x +"' y='" + y + "'>" + cell[JV.PROP_VALUE] + "</text>");
  81. return rst.join();
  82. }
  83. function getPixelSize(pagesData) {
  84. let rst = [793,1122];
  85. if (pagesData[JV.NODE_PAGE_INFO] && pagesData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE]) {
  86. rst[0] = Math.round(SCREEN_DPI[0] * pagesData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][0]);
  87. rst[1] = Math.round(SCREEN_DPI[1] * pagesData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1]);
  88. }
  89. return rst;
  90. }