| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 | /** * Created by Tony on 2018/4/24. */let rptPrintHelper = {    preview: function () {        if (zTreeOprObj.currentRptPageRst) {            sessionStorage.currentPageData = JSON.stringify(zTreeOprObj.currentRptPageRst);            sessionStorage.pageSize = rptControlObj.getCurrentPageSize();            sessionStorage.orientation = rptControlObj.getCurrentOrientation();            sessionStorage.scaleFactor = 1;            window.open('/rpt_print');        } else {            sessionStorage.currentPageData = null;        }    },    previewSvgData: function() {        //    },    buildSvgArr: function (pagesData, offsetX, offsetY) {        let styles = pagesData[JV.NODE_STYLE_COLLECTION],            fonts = pagesData[JV.NODE_FONT_COLLECTION],            controls = pagesData[JV.NODE_CONTROL_COLLECTION]        ;        let rst = [];        let canvas = document.getElementById("chkCanvas");        for (let idx = 0; idx < pagesData.items.length; idx++) {            let page = pagesData.items[idx];            let svgPageArr = [], pixelSize = getPixelSize(pagesData);            svgPageArr.push("<svg width='" + pixelSize[0] + "' height='" + pixelSize[1] + "'>");            let adjustY = 0.5 * ((idx + 1) % 2);            for (let cell of page.cells) {                svgPageArr.push(buildCellSvg(cell, fonts, styles, controls, page[JV.PROP_PAGE_MERGE_BORDER], pagesData[JV.BAND_PROP_MERGE_BAND], offsetX, offsetY, adjustY, canvas));            }            svgPageArr.push("</svg>");            rst.push(svgPageArr);        }        return rst;    }};function getActualBorderStyle(cell, styles, mergeBorderStyle, pageBorderArea, borderStr) {    let rst = styles[cell[JV.PROP_STYLE]][borderStr];    if (mergeBorderStyle) {        if (parseFloat(cell[JV.PROP_AREA][borderStr]) === parseFloat(pageBorderArea[borderStr])) {            if (borderStr === JV.PROP_LEFT || borderStr === JV.PROP_RIGHT) {                if (parseFloat(cell[JV.PROP_AREA][JV.PROP_TOP]) >= parseFloat(pageBorderArea[JV.PROP_TOP]) &&                    parseFloat(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) <= parseFloat(pageBorderArea[JV.PROP_BOTTOM])) {                    rst = mergeBorderStyle[borderStr];                }            } else if (borderStr === JV.PROP_TOP || borderStr === JV.PROP_BOTTOM) {                if (parseFloat(cell[JV.PROP_AREA][JV.PROP_LEFT]) >= parseFloat(pageBorderArea[JV.PROP_LEFT]) &&                    parseFloat(cell[JV.PROP_AREA][JV.PROP_RIGHT]) <= parseFloat(pageBorderArea[JV.PROP_RIGHT])) {                    rst = mergeBorderStyle[borderStr];                }            }        }    }    return rst;}function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY, canvas) {    let rst = [];    let style = styles[cell[JV.PROP_STYLE]];    let mergeBandStyle = null;    if (rptMergeBorder) {        mergeBandStyle = styles[rptMergeBorder[JV.PROP_STYLE][JV.PROP_ID]];    }    let font = cell[JV.PROP_FONT];    if (typeof font === 'string') {        font = fonts[cell[JV.PROP_FONT]];    }    let left = parseInt(cell[JV.PROP_AREA][JV.PROP_LEFT]) + offsetX + 0.5,        right = parseInt(cell[JV.PROP_AREA][JV.PROP_RIGHT]) + offsetX + 0.5,        top = parseInt(cell[JV.PROP_AREA][JV.PROP_TOP]) + offsetY + adjustY,        bottom = parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) + offsetY + adjustY    ;    if (style) {        let leftBS = getActualBorderStyle(cell, styles, mergeBandStyle, (pageMergeBorder)?pageMergeBorder:rptMergeBorder[JV.PROP_AREA], JV.PROP_LEFT);        // if (style[JV.PROP_LEFT] && parseFloat(style[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]) > 0) {        if (leftBS && parseFloat(leftBS[JV.PROP_LINE_WEIGHT]) > 0) {            rst.push("<line x1='" + left + "' y1='" + top +                "' x2='" + left + "' y2='" + bottom +                "' style='stroke:rgb(0,0,0);stroke-width:" + leftBS[JV.PROP_LINE_WEIGHT] +"'/>")        }        let rightBS = getActualBorderStyle(cell, styles, mergeBandStyle, (pageMergeBorder)?pageMergeBorder:rptMergeBorder[JV.PROP_AREA], JV.PROP_RIGHT);        // if (style[JV.PROP_RIGHT] && parseFloat(style[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]) > 0) {        if (rightBS && parseFloat(rightBS[JV.PROP_LINE_WEIGHT]) > 0) {            rst.push("<line x1='" + right + "' y1='" + top +                "' x2='" + right + "' y2='" + bottom +                "' style='stroke:rgb(0,0,0);stroke-width:" + rightBS[JV.PROP_LINE_WEIGHT] +"'/>")        }        let topBS = getActualBorderStyle(cell, styles, mergeBandStyle, (pageMergeBorder)?pageMergeBorder:rptMergeBorder[JV.PROP_AREA], JV.PROP_TOP);        // if (style[JV.PROP_TOP] && parseFloat(style[JV.PROP_TOP][JV.PROP_LINE_WEIGHT]) > 0) {        if (topBS && parseFloat(topBS[JV.PROP_LINE_WEIGHT]) > 0) {            rst.push("<line x1='" + left + "' y1='" + top +                "' x2='" + right + "' y2='" + top +                "' style='stroke:rgb(0,0,0);stroke-width:" + topBS[JV.PROP_LINE_WEIGHT] +"'/>")        }        let bottomBS = getActualBorderStyle(cell, styles, mergeBandStyle, (pageMergeBorder)?pageMergeBorder:rptMergeBorder[JV.PROP_AREA], JV.PROP_BOTTOM);        // if (style[JV.PROP_BOTTOM] && parseFloat(style[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]) > 0) {        if (bottomBS && parseFloat(bottomBS[JV.PROP_LINE_WEIGHT]) > 0) {            rst.push("<line x1='" + left + "' y1='" + bottom +                "' x2='" + right + "' y2='" + bottom +                "' style='stroke:rgb(0,0,0);stroke-width:" + bottomBS[JV.PROP_LINE_WEIGHT] +"'/>")        }    }    buildText(rst, cell, font, controls[cell[JV.PROP_CONTROL]], offsetX, offsetY, adjustY, canvas);    return rst.join("");}function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas) {    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";    let fontStyle = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"normal";    let left = parseInt(cell[JV.PROP_AREA][JV.PROP_LEFT]) + offsetX + 0.5,        right = parseInt(cell[JV.PROP_AREA][JV.PROP_RIGHT]) + offsetX + 0.5,        top = parseInt(cell[JV.PROP_AREA][JV.PROP_TOP]) + offsetY + adjustY,        bottom = parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) + offsetY + adjustY,        x = left, y = top,        text_anchor = "start"    ;    let value = cell[JV.PROP_VALUE];    if (!(value)) {        value = "";    }    let values = null;    if (typeof value === "string") {        values = value.split("|");    } else {        values = [value];    }    let stepHeight = (parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) - parseInt(cell[JV.PROP_AREA][JV.PROP_TOP])) / values.length;    if (control) {        if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "left") {            text_anchor = "start";            x = left + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT];        } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "right") {            text_anchor = "end";            x = right - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];        } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]] === "center") {            text_anchor = "middle";            x = Math.round((left + right) / 2);        }    }    for (let vidx = 0; vidx < values.length; vidx++) {        //check whether need to adjust the font size        let ctx = canvas.getContext("2d");        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];        while ((right - left) <= ctx.measureText(values[vidx]).width) {            if (dftFontHeight > 6) {                dftFontHeight--;                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];            } else {                break;            }        }        dftFontHeight = (dftFontHeight * 3 / 4); //SVG的字体与canvas的字体大小的切换, 不用考虑取整        if (control) {            if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "top") {                y = Math.round((top + vidx * stepHeight) + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP]);            } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "bottom") {                y = Math.round((top + (vidx + 1) * stepHeight) - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM]);            } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "center") {                y = Math.round(((top + vidx * stepHeight) + (top + (vidx + 1) * stepHeight) + dftFontHeight) / 2 );            }        }        if (font[JV.PROP_NAME] === "宋体") {            y--;        }        destRst.push("<text style='fill:black;font-family:" + font[JV.PROP_NAME] +            ";font-weight:" + fontWeight +            ";font-style:" + fontStyle +            ";font-size:" + dftFontHeight + "pt' x='" +            x +"' y='" + y + "' text-anchor='" + text_anchor + "' xml:space='preserve'>" + values[vidx] + "</text>");    }}function getPixelSize(pagesData) {    let rst = [793,1122];    let SCREEN_DPI = [96,96];    if (pagesData[JV.NODE_PAGE_INFO] && pagesData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE]) {        rst[0] = Math.round(SCREEN_DPI[0] * pagesData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][0]);        rst[1] = Math.round(SCREEN_DPI[1] * pagesData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1]);    }    return rst;}
 |