TonyKang %!s(int64=4) %!d(string=hai) anos
pai
achega
8beb89fb32

+ 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++) {

+ 28 - 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;
@@ -178,6 +205,7 @@ let JpcJsPDFHelper = {
                             if (values[i][j] === ' ') spaceIdxArr.push(j);
                         }
                     }
+                    // 但有了_splitValues()处理后,这个加额外空格好像没必要了,但是不加又不好(比如'年 月 日'这种文字) ------------
                     for (let j = spaceIdxArr.length - 1; j >= 0; j--) {
                         values[i] = values[i].slice(0, spaceIdxArr[j]) + ' ' + values[i].slice(spaceIdxArr[j]);
                     }

+ 25 - 1
web/building_saas/report/js/rpt_print.js

@@ -192,6 +192,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";
@@ -235,6 +256,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];
@@ -262,7 +285,8 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
                 ";font-size:" + innerDftFontHeight + "pt' x='" +
                 x +"' y='" + y + "' text-anchor='" + text_anchor + "' xml:space='preserve'" + HtoVStr + ">" + innerTxt + "</text>");
         }
-        let actLines = private_splitString(textValue, (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT]), ctx);
+        // let actLines = private_splitString(textValue, (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT]), ctx);
+        let actLines = private_splitString(textValue, (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.IDX_RIGHT]), ctx);
         let validTxtLines = Math.floor((area[JV.IDX_BOTTOM] - area[JV.IDX_TOP]) / (dftFontHeight + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + 4));
         if (actLines.length === 1  || (control && control.Shrink !== 'T' && validTxtLines < actLines)) {
             inner_build_text(textValue, area);