Bläddra i källkod

直接预览打印调整(多行)

TonyKang 7 år sedan
förälder
incheckning
a9bc768665
2 ändrade filer med 89 tillägg och 70 borttagningar
  1. 21 41
      web/building_saas/report/html/rpt_print.html
  2. 68 29
      web/building_saas/report/js/rpt_print.js

+ 21 - 41
web/building_saas/report/html/rpt_print.html

@@ -13,13 +13,22 @@
         page-break-before: auto;
         page-break-after: auto;
     }
+    @page {size: A4 portrait;}
+    body {page: page}
+    div {page: page}
 </style>
-<style type="text/css">
-    svg{
-        width: 1122px;
-        height: 1122px;
+<!--
+    .printPage {
+        page: page
     }
-</style>
+    @page {size: A4 landscape;}
+    div { page: page }
+@page {margin: auto;}
+@page horizon {size: A4 landscape;}
+@page vertical1 {size: A4 portrait;}
+    @page horizon1 {size: A4 landscape;}
+    @page vertical1 {size: A4 portrait;}
+-->
 <script type="text/javascript" src="/web/building_saas/report/js/jpc_output_value_define.js"></script>
 <body onload="loading()" onbeforeunload="closing()">
 </body>
@@ -53,49 +62,20 @@
                 orgWidth = orgHeight;
                 orgHeight = tmpInt;
             }
-//            for (let i = 0; i < pageData.items.length; i++) {
-//                let div = $('<div class="pageBreak"><canvas width="' + pageWidth + '" height="' + pageHeight + '"></canvas></div>');
-//                $("body").append(div);
-//            }
-//            $(document.body).find("div").each(function(index,element){
-//                $(element).find("canvas").each(function(cIdx,elementCanvas){
-//                    canvasArr.push(elementCanvas);
-//                });
-//            });
-//            JpcCanvasOutput.scaleFactor = scaleFactor;
-//            JpcCanvasOutput.resetFonts(pageData[JV.NODE_FONT_COLLECTION]);
-//            for (let i = 0; i < canvasArr.length; i++) {
-//                JpcCanvasOutput.offsetX = -30;
-//                JpcCanvasOutput.offsetY = -30;
-//                JpcCanvasOutput.drawToCanvas(pageData, canvasArr[i], i+1);
-//            }
-
-//            let imgDataArr = [];
-//            for (let canvas of canvasArr) {
-//                imgDataArr.push(canvas.toDataURL());
-//            }
-//            let imgIdx = 0;
-//            $(document.body).find("div").each(function(index,element){
-//                let img = document.createElement('img');
-//                img.src = imgDataArr[imgIdx];
-//                img.height = orgHeight;
-//                img.width = orgWidth;
-//                imgIdx++;
-//                element.appendChild(img);
-//                $(element).find("canvas").each(function(cIdx,elementCanvas){
-//                    elementCanvas.style.display = "none";
-//                });
-//            });
 
             let svgArr = rptPrintHelper.buildSvgArr(pageData, -30, -30);
             for (let i = 0; i < pageData.items.length; i++) {
                 let div = $('<div class="pageBreak"></div>');
-//                console.log()
-//                div.append(svgArr[i]);
                 div.append($(svgArr[i].join("")));
                 $("body").append(div);
             }
-
+            $(document.body).find("div").each(function(index,element){
+                $(element).find("svg").each(function(cIdx,elementSvg){
+                    elementSvg.setAttribute('height', pageHeight);
+                    elementSvg.setAttribute('width', pageWidth);
+                });
+            });
+//            $("body").css({"page": "page"});
             window.print();
             //document.execCommand("print");
         } else {

+ 68 - 29
web/building_saas/report/js/rpt_print.js

@@ -24,11 +24,13 @@ let rptPrintHelper = {
             controls = pagesData[JV.NODE_CONTROL_COLLECTION]
         ;
         let rst = [];
-        for (let page of pagesData.items) {
+        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));
+                svgPageArr.push(buildCellSvg(cell, fonts, styles, controls, page[JV.PROP_PAGE_MERGE_BORDER], pagesData[JV.BAND_PROP_MERGE_BAND], offsetX, offsetY, adjustY));
             }
             svgPageArr.push("</svg>");
             rst.push(svgPageArr);
@@ -41,25 +43,37 @@ function getActualBorderStyle(cell, styles, mergeBorderStyle, pageBorderArea, bo
     let rst = styles[cell[JV.PROP_STYLE]][borderStr];
     if (mergeBorderStyle) {
         if (parseFloat(cell[JV.PROP_AREA][borderStr]) === parseFloat(pageBorderArea[borderStr])) {
-            rst = mergeBorderStyle[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) {
+function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY) {
     let rst = [];
     let style = styles[cell[JV.PROP_STYLE]];
     let mergeBandStyle = null;
     if (rptMergeBorder) {
-        mergeBandStyle = styles[rptMergeBorder[JV.PROP_STYLE]];
+        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 + 0.5,
-        bottom = parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) + offsetY + 0.5,
-        x = left, y = top,
-        text_anchor = "start"
+        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);
@@ -67,37 +81,56 @@ function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBo
         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:1'/>")
+                "' 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:1'/>")
+                "' 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:1'/>")
+                "' 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:1'/>")
+                "' style='stroke:rgb(0,0,0);stroke-width:" + bottomBS[JV.PROP_LINE_WEIGHT] +"'/>")
         }
     }
-    let font = cell[JV.PROP_FONT];
-    if (typeof font === 'string') {
-        font = fonts[cell[JV.PROP_FONT]];
-    }
+    buildText(rst, cell, font, controls[cell[JV.PROP_CONTROL]], offsetX, offsetY, adjustY);
+
+    return rst.join("");
+}
+
+function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY) {
     let fontsize = Math.round(parseInt(font[JV.FONT_PROPS[JV.FONT_PROP_IDX_HEIGHT]]) * 3 / 4);
     let fontWeight = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_BOLD]] === 'T')?"bold":"normal";
-    let control = controls[cell[JV.PROP_CONTROL]];
+    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";
@@ -109,19 +142,25 @@ function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBo
             text_anchor = "middle";
             x = Math.round((left + right) / 2);
         }
-        if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "top") {
-            y = top + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
-        } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "bottom") {
-            y = bottom - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM];
-        } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "center") {
-            y = Math.round((top + bottom + fontsize) / 2 );
+    }
+    for (let i = 0; i < values.length; i++) {
+        if (control) {
+            if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "top") {
+                y = Math.round((top + i * stepHeight) + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP]);
+            } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "bottom") {
+                y = Math.round((top + (i + 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 + i * stepHeight) + (top + (i + 1) * stepHeight) + fontsize) / 2 );
+            }
+        }
+        if (font[JV.PROP_NAME] === "宋体") {
+            y--;
         }
+        destRst.push("<text style='fill:black;font-family:" + font[JV.PROP_NAME] +
+            ";font-weight:" + fontWeight +
+            ";font-size:" + fontsize + "pt' x='" +
+            x +"' y='" + y + "' text-anchor='" + text_anchor + "'>" + values[i] + "</text>");
     }
-    rst.push("<text style='fill:black;font-family:" + font[JV.PROP_NAME] +
-        ";font-weight:" + fontWeight +
-        ";font-size:" + fontsize + "pt' x='" +
-        x +"' y='" + y + "' text-anchor='" + text_anchor + "'>" + cell[JV.PROP_VALUE] + "</text>");
-    return rst.join("");
 }
 
 function getPixelSize(pagesData) {