Преглед на файлове

输出自动换行处理

TonyKang преди 4 години
родител
ревизия
6f07ad41b6
променени са 3 файла, в които са добавени 87 реда и са изтрити 0 реда
  1. 37 0
      web/building_saas/report/js/jpc_output.js
  2. 27 0
      web/building_saas/report/js/rpt_jspdf.js
  3. 23 0
      web/building_saas/report/js/rpt_print.js

+ 37 - 0
web/building_saas/report/js/jpc_output.js

@@ -252,6 +252,26 @@ let JpcCanvasOutput = {
             }
             ctx.restore();
         }
+        function _splitValues(cell, control, orgValues, ctx2D) {
+            //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
+            if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
+                let vals = [];
+                let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+                for (let val of orgValues) {
+                    let actW = ctx2D.measureText(val).width;
+                    if (actW > validAreaTxtWidth) {
+                        vals = vals.concat(private_splitString(val, validAreaTxtWidth, ctx2D));
+                    } else {
+                        vals.push(val);
+                    }
+                }
+                if (vals.length > orgValues.length) {
+                    for (let idx = 0; idx < vals.length; idx++) {
+                        orgValues[idx] = vals[idx];
+                    }
+                }
+            }
+        }
         function private_drawCellText(cell, fonts, controls) {
             if (cell[JV.PROP_VALUE] !== null && cell[JV.PROP_VALUE] !== undefined) {
                 let values = ("" + cell[JV.PROP_VALUE]).split('|');
@@ -277,6 +297,23 @@ let JpcCanvasOutput = {
                         values = [""];
                     }
                 }
+
+                if (font) {
+                    let dftFontHeight = parseFloat(font[JV.FONT_PROPS[1]]);
+                    let dftOthers = "";
+                    let dftFontBold = font[JV.FONT_PROPS[3]];
+                    if (dftFontBold && dftFontBold === 'T') {
+                        dftOthers = "bold " + dftOthers ;
+                    }
+                    let dftFontItalic = font[JV.FONT_PROPS[4]];
+                    if (dftFontItalic && dftFontItalic === 'T') {
+                        dftOthers = dftOthers + "italic ";
+                    }
+                    dftFontHeight = me.scaleFactor * dftFontHeight;
+                    ctx.font = dftOthers + dftFontHeight + "px " + font[JV.PROP_NAME];
+                }
+                _splitValues(cell, control, values, ctx);
+
                 let height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
                 let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + me.offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + me.offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + me.offsetY];
                 for (let i = 0; i < values.length; i++) {

+ 27 - 0
web/building_saas/report/js/rpt_jspdf.js

@@ -126,6 +126,27 @@ let JpcJsPDFHelper = {
             }
         }
 
+        function _splitValues(cell, control, orgValues, doc) {
+            //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
+            if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
+                let vals = [];
+                let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+                for (let val of orgValues) {
+                    let actW = doc.getTextWidth(val);
+                    if (actW > validAreaTxtWidth) {
+                        vals = vals.concat(private_splitString(val, validAreaTxtWidth, doc));
+                    } else {
+                        vals.push(val);
+                    }
+                }
+                if (vals.length > orgValues.length) {
+                    for (let idx = 0; idx < vals.length; idx++) {
+                        orgValues[idx] = vals[idx];
+                    }
+                }
+            }
+        }
+
         function private_drawCellText(doc, ctx, cell, fonts, controls) {
             if (cell[JV.PROP_VALUE] !== undefined && cell[JV.PROP_VALUE] !== null) {
                 let values = ("" + cell[JV.PROP_VALUE]).split('|');
@@ -149,6 +170,12 @@ let JpcJsPDFHelper = {
                 } else {
                     control = cell[JV.PROP_CONTROL];
                 }
+
+                if (font) {
+                    doc.setFontSize(1 * font[JV.FONT_PROPS[1]]);
+                }
+                _splitValues(cell, control, values, doc);
+
                 let height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
                 let area = [cell[JV.PROP_AREA][JV.PROP_LEFT] + offsetX, cell[JV.PROP_AREA][JV.PROP_TOP] + offsetY, cell[JV.PROP_AREA][JV.PROP_RIGHT] + offsetX, cell[JV.PROP_AREA][JV.PROP_BOTTOM] + offsetY];
                 let ah = height;

+ 23 - 0
web/building_saas/report/js/rpt_print.js

@@ -191,6 +191,27 @@ function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBo
     return rst.join("");
 }
 
+function _splitValues(cell, control, orgValues, ctx2D) {
+    //根据control的 自动折行 及 缩放优先 这俩属性 来分解cell value
+    if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_WRAP]] === 'T' && control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_SHRINK_FIRST]] !== 'T') {
+        let vals = [];
+        let validAreaTxtWidth = cell[JV.PROP_AREA][JV.PROP_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];
+        for (let val of orgValues) {
+            let actW = ctx2D.measureText(val).width;
+            if (actW > validAreaTxtWidth) {
+                vals = vals.concat(private_splitString(val, validAreaTxtWidth, ctx2D));
+            } else {
+                vals.push(val);
+            }
+        }
+        if (vals.length > orgValues.length) {
+            for (let idx = 0; idx < vals.length; idx++) {
+                orgValues[idx] = vals[idx];
+            }
+        }
+    }
+}
+
 function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV, HtoVStr) {
     let orgFontHeight = parseInt(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]);
     let fontWeight = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold":"normal";
@@ -234,6 +255,8 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
     area[JV.IDX_RIGHT] = right;
     let height = bottom - top;
     let ctx = canvas.getContext("2d");
+    ctx.font = ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold ":"") + ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"") + orgFontHeight + "px " + font[JV.PROP_NAME];
+    _splitValues(cell, control, values, ctx);
     let inner_draw_text = function (textValue) {
         let dftFontHeight = orgFontHeight;
         ctx.font = ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold ":"") + ((font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"") + dftFontHeight + "px " + font[JV.PROP_NAME];