Просмотр исходного кода

BUG#1954 从预览/打印/PDF/Excel 都调整

TonyKang 6 лет назад
Родитель
Сommit
dc811c7dfd

+ 3 - 3
config/config.js

@@ -28,7 +28,7 @@ module.exports = {
             useMongoClient: true
         }
     },
-    pp:{  server: "172.18.111.231",
+    pp:{  server: "112.74.42.187",
         port: "27017",
         options:{
             user:'smartcost',
@@ -39,8 +39,8 @@ module.exports = {
             connectTimeoutMS: 50000,
             useMongoClient: true
         }},
-    ab:{  server: "112.74.42.187",
-        port: "27017",
+    prod_s:{  server: "112.74.42.187",
+        port: "28066",
         options:{
             user:'smartcost',
             pass:'SmartCost3850888',

+ 59 - 38
modules/reports/util/rpt_pdf_util.js

@@ -5,11 +5,12 @@
  * Created by zhang on 2017/8/14.
  */
 
-let pdf = require('pdfkit');
-let fs = require('fs');
-let jpcCmnHelper = require('../rpt_component/helper/jpc_helper_common');
-let DPI = jpcCmnHelper.getScreenDPI()[0];
-let JV = require('../rpt_component/jpc_value_define');
+const pdf = require('pdfkit');
+const PDF_SCALE = 0.75;
+const fs = require('fs');
+const jpcCmnHelper = require('../rpt_component/helper/jpc_helper_common');
+const DPI = jpcCmnHelper.getScreenDPI()[0] * PDF_SCALE;
+const JV = require('../rpt_component/jpc_value_define');
 const uuidV1 = require('uuid/v1');
 
 let fontUtil = require('./rpt_font_util');
@@ -84,7 +85,7 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
 
     function private_drawCell(cell, fonts, styles, controls, mergedBand) {
         doc.save();
-        //doc.translate(0.5,0.5);
+        // doc.translate(0.5,0.5); //跟H5的canvas不同,不需要这样切换
         let style = styles[cell[JV.PROP_STYLE]];
         if (style) {
             let isNeedMergeBand = private_chkIfInMergedBand(mergedBand, cell);
@@ -106,10 +107,12 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
                 destStyle = styles[mergedBand[JV.PROP_STYLE][JV.PROP_ID]];
             }
         }
-        doc.moveTo(cell[JV.PROP_AREA][startP[0]] + offsetX, cell[JV.PROP_AREA][startP[1]] + offsetY);
+        // doc.moveTo(cell[JV.PROP_AREA][startP[0]] + offsetX, cell[JV.PROP_AREA][startP[1]] + offsetY);
+        doc.moveTo( (cell[JV.PROP_AREA][startP[0]] + offsetX) * PDF_SCALE, (cell[JV.PROP_AREA][startP[1]] + offsetY) * PDF_SCALE);
         if (destStyle[styleBorderDest] && parseFloat(destStyle[styleBorderDest][JV.PROP_LINE_WEIGHT]) !== 0) {
             doc.lineWidth(1.0 * destStyle[styleBorderDest][JV.PROP_LINE_WEIGHT]);
-            doc.lineTo(cell[JV.PROP_AREA][destP[0]] + offsetX, cell[JV.PROP_AREA][destP[1]] + offsetY);
+            // doc.lineTo(cell[JV.PROP_AREA][destP[0]] + offsetX, cell[JV.PROP_AREA][destP[1]] + offsetY);
+            doc.lineTo((cell[JV.PROP_AREA][destP[0]] + offsetX) * PDF_SCALE, (cell[JV.PROP_AREA][destP[1]] + offsetY) * PDF_SCALE);
             doc.strokeColor(destStyle[styleBorderDest][JV.PROP_COLOR]);
         }
         doc.stroke();
@@ -162,34 +165,39 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
             }
         };
         inner_setupControl(area, dftFontHeight, output);
-        let w = area[JV.IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - area[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
+        let validAreaTxtWidth = area[JV.IDX_RIGHT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] - area[JV.IDX_LEFT] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT];
+        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 (parseInt(font.FontAngle) !== 0) {
-            w = area[JV.IDX_BOTTOM] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM] - area[JV.IDX_TOP] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
+            validAreaTxtWidth = area[JV.IDX_BOTTOM] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM] - area[JV.IDX_TOP] - JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP];
+            validTxtLines = Math.floor((area[JV.IDX_RIGHT] - area[JV.IDX_LEFT]) / (dftFontHeight + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT] + 4));
         }
 
-        function private_drawUnderline() {
+        function private_drawUnderline(underLineVal, underLineArea) {
             //A. 暂不支持角度; B. PDF输出时,坐标没有translate
             let ctx = doc;
             //1. 计算下划线的相关坐标
-            let width = ctx.widthOfString(val);
+            let width = ctx.widthOfString(underLineVal);
+            if (width > underLineArea[JV.IDX_RIGHT] - underLineArea[JV.IDX_LEFT]) {
+                width = underLineArea[JV.IDX_RIGHT] - underLineArea[JV.IDX_LEFT];
+            }
             let height = dftFontHeight;
-            let startX = area[JV.IDX_LEFT], startY = area[JV.IDX_TOP], endX = area[JV.IDX_RIGHT], endY = area[JV.IDX_BOTTOM];
+            let startX = underLineArea[JV.IDX_LEFT], startY = underLineArea[JV.IDX_TOP], endX = underLineArea[JV.IDX_RIGHT], endY = underLineArea[JV.IDX_BOTTOM];
             // let startX = 0, startY = 0, endX = width, endY = startY;
             if (control.Horizon === "left") {
-                startX = Math.round(area[JV.IDX_LEFT] + JV.OUTPUT_OFFSET[JV.IDX_LEFT]);
+                startX = Math.round(underLineArea[JV.IDX_LEFT] + JV.OUTPUT_OFFSET[JV.IDX_LEFT]);
             } else if (control.Horizon === "right") {
-                startX = Math.round(area[JV.IDX_RIGHT] - width - JV.OUTPUT_OFFSET[JV.IDX_RIGHT]);
+                startX = Math.round(underLineArea[JV.IDX_RIGHT] - width - JV.OUTPUT_OFFSET[JV.IDX_RIGHT]);
             } else {
-                startX = Math.round( area[JV.IDX_LEFT] + (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT] - width) / 2);
+                startX = Math.round( underLineArea[JV.IDX_LEFT] + (underLineArea[JV.IDX_RIGHT] - underLineArea[JV.IDX_LEFT] - width) / 2);
             }
             endX = Math.round(startX + width);
 
             if (control.Vertical === "top") {
-                startY = Math.round(area[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM] + height);
+                startY = Math.round(underLineArea[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM] + height);
             } else if (control.Vertical === "bottom") {
-                startY = Math.round(area[JV.IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM]);
+                startY = Math.round(underLineArea[JV.IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM]);
             } else {
-                startY = Math.round( area[JV.IDX_TOP] + (area[JV.IDX_BOTTOM] - area[JV.IDX_TOP] + height) / 2) + JV.OUTPUT_OFFSET[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM];
+                startY = Math.round( underLineArea[JV.IDX_TOP] + (underLineArea[JV.IDX_BOTTOM] - underLineArea[JV.IDX_TOP] + height) / 2) + JV.OUTPUT_OFFSET[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM];
             }
             endY = Math.round(startY);
             //2. 画线
@@ -198,42 +206,50 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
                 ctx.translate(0,0.5);
             }
             // ctx.beginPath();
-            ctx.moveTo(startX, startY);
+            // ctx.moveTo(startX, startY);
+            ctx.moveTo(startX * PDF_SCALE, startY * PDF_SCALE);
             ctx.lineWidth(1);
             ctx.strokeStyle = "BLACK";
-            ctx.lineTo(endX, endY);
+            // ctx.lineTo(endX, endY);
+            ctx.lineTo(endX * PDF_SCALE, endY * PDF_SCALE);
             ctx.stroke();
             // ctx.restore();
         }
 
         let rotateOptions;
-        if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
-            private_drawUnderline();
-        }
+        // if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
+        //     private_drawUnderline(val);
+        // }
         if (parseInt(font.FontAngle) !== 0) {
             if (control){
-                rotateOptions = private_setupAreaRotateOption(area,w,control.Vertical,dftFontHeight, output);
+                rotateOptions = private_setupAreaRotateOption(area,validAreaTxtWidth,control.Vertical,dftFontHeight, output);
             } else {
-                rotateOptions = private_setupAreaRotateOption(area,w,"bottom",dftFontHeight, output);
+                rotateOptions = private_setupAreaRotateOption(area,validAreaTxtWidth,"bottom",dftFontHeight, output);
             }
             doc.rotate(font.FontAngle,rotateOptions);
         }
-        if (w >= doc.widthOfString(val) || (control && control.Shrink !== 'T')) {
-            options.width = w;
-            options.height = dftFontHeight;
-            doc.text(val,output[0], output[1], options);
+        if (validAreaTxtWidth >= doc.widthOfString(val) ||
+            (control && control.Shrink !== 'T' && validTxtLines < private_splitString(val, validAreaTxtWidth, doc)) ) {
+            options.width = validAreaTxtWidth * PDF_SCALE;
+            options.height = dftFontHeight * PDF_SCALE;
+            doc.fontSize(dftFontHeight);
+            if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
+                private_drawUnderline(val, area);
+            }
+            doc.fontSize(dftFontHeight * PDF_SCALE);
+            doc.text(val,output[0] * PDF_SCALE, output[1] * PDF_SCALE, options);
             doc.font(__dirname + '/pdf_base_files/simhei_bold_italic.ttf');
         } else {
             while (true) {
                 //*/
                 let lines = 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));
                 lines = (lines === 0)?1:lines;
-                let actLines = private_splitString(val, w, doc);
+                let actLines = private_splitString(val, validAreaTxtWidth, doc);
                 if (actLines.length > lines && dftFontHeight >= 6) {
                     dftFontHeight--;
                     doc.fontSize(dftFontHeight);
-                    options.width = w;
-                    options.height = dftFontHeight;
+                    options.width = validAreaTxtWidth * PDF_SCALE;
+                    options.height = dftFontHeight * PDF_SCALE;
                     // doc.text(val,output[0], output[1], options);
                 } else {
                     let aH = dftFontHeight + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_TOP] + 4;
@@ -249,21 +265,26 @@ function export_pdf_file (pageData, paperSize, fName, callback) {
                     for (let ai = 0; ai < area.length; ai++) {
                         newArea[ai] = area[ai];
                     }
-                    options.width = w;
-                    options.height = dftFontHeight;
+                    options.width = validAreaTxtWidth * PDF_SCALE;
+                    options.height = dftFontHeight * PDF_SCALE;
                     for (let lIdx = 0; lIdx < actLines.length; lIdx++) {
                         newArea[JV.IDX_TOP] = Math.round(aH * lIdx + baseTop);
                         newArea[JV.IDX_BOTTOM] = Math.round(aH * (lIdx + 1) + baseTop);
                         inner_setupControl(newArea, dftFontHeight, output);
-                        doc.text(actLines[lIdx], output[0], output[1], options);
+                        doc.fontSize(dftFontHeight);
+                        if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
+                            private_drawUnderline(actLines[lIdx], newArea);
+                        }
+                        doc.fontSize(dftFontHeight * PDF_SCALE);
+                        doc.text(actLines[lIdx], output[0] * PDF_SCALE, output[1] * PDF_SCALE, options);
                     }
                     break;
                 }
                 /*/
                 dftFontHeight--;
                 doc.fontSize(dftFontHeight);
-                if (w >= doc.widthOfString(val) || dftFontHeight < 6) {
-                    options.width = w;
+                if (validAreaTxtWidth >= doc.widthOfString(val) || dftFontHeight < 6) {
+                    options.width = validAreaTxtWidth;
                     options.height = dftFontHeight;
                     doc.text(val,output[0], output[1], options);
                     doc.font(__dirname + '/pdf_base_files/simhei_bold_italic.ttf');

+ 9 - 8
test/unit/reports/test_rpt_test_template.js

@@ -46,9 +46,9 @@ let demoPrjId = - 1;
 // let demoRptId = 2260; //测试基本信息
 // let demoRptId = 613; //09-4 2018
 // let demoRptId = 726; //定制:清单子目表
-// let demoRptId = 756; //江西 封1
+let demoRptId = 756; //江西 封1
 // let demoRptId = 475; //计日工
-let demoRptId = 551; //表05
+// let demoRptId = 551; //表05
 let pagesize = "A4";
 
 //288: 11-2表(新)
@@ -62,7 +62,8 @@ let userId_me = "5b6a60b1c4ba33000dd417c0"; //我的
 //demoPrjId = 1626; //QA:
 // demoPrjId = 2260; //QA:
 // demoPrjId = 5029; //
-demoPrjId = 4552; //
+// demoPrjId = 5029; //项目名称过长
+demoPrjId = 5113; //
 // demoPrjId = 4107; //UAT:
 //*/
 let userId_Dft = userId_me;
@@ -89,7 +90,7 @@ test('测试 - 测试模板啦: ', function (t) {
         let rptDataUtil = new rptDataExtractor();
         rptDataUtil.initialize(rptTpl._doc);
         let filter = rptDataUtil.getDataRequestFilter();
-        console.log(filter);
+        // console.log(filter);
         //正常应该根据报表模板定义的数据类型来请求数据
         rptTplDataFacade.prepareProjectData(userId_Dft, demoPrjId, filter, function (err, msg, rawDataObj) {
             if (!err) {
@@ -109,13 +110,13 @@ test('测试 - 测试模板啦: ', function (t) {
                     let customizeCfg = {"fillZero": true};
                     let pageRst = printCom.outputAsSimpleJSONPageArray(rptTpl, tplData, 1, maxPages, defProperties, customizeCfg);
                     if (pageRst) {
-                        fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
+                        // fsUtil.writeObjToFile(pageRst, "D:/GitHome/ConstructionCost/tmp/testBuiltPageResult_测试模板.jsp");
                         // rpt_xl_util.exportExcel(pageRst, pagesize, "local_test_rpt_excel", true, null, null, function(uuidName){
                         //     console.log("excel uuid: " + uuidName);
                         // });
-                        // rpt_pdf_util.export_pdf_file(pageRst, pagesize, 'local_test_rpt_pdf', function(uuidName){
-                        //     console.log("pdf uuid: " + uuidName);
-                        // });
+                        rpt_pdf_util.export_pdf_file(pageRst, pagesize, 'local_test_rpt_pdf', function(uuidName){
+                            console.log("pdf uuid: " + uuidName);
+                        });
                     } else {
                         console.log("oh! no pages were created!");
                     }

+ 14 - 5
web/building_saas/report/js/jpc_output.js

@@ -147,10 +147,13 @@ let JpcCanvasOutput = {
                 validTxtLines = Math.floor((area[JV.IDX_RIGHT] - area[JV.IDX_LEFT]) / (dftFontHeight + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_RIGHT] + JV.OUTPUT_OFFSET[JV.OFFSET_IDX_LEFT] + 4));
             }
 
-            function private_drawUnderline() {
+            function private_drawUnderline(underLineVal) {
                 //A. 暂不支持角度; B. 坐标已经translate
                 //1. 计算下划线的相关坐标
-                let width = ctx.measureText(val).width;
+                let width = ctx.measureText(underLineVal).width;
+                if (width > area[JV.IDX_RIGHT] - area[JV.IDX_LEFT]) {
+                    width = area[JV.IDX_RIGHT] - area[JV.IDX_LEFT];
+                }
                 let height = dftFontHeight;
                 // let startX = area[JV.IDX_LEFT], startY = area[JV.IDX_TOP], endX = area[JV.IDX_RIGHT], endY = area[JV.IDX_BOTTOM];
                 let startX = 0, startY = 0, endX = width, endY = startY;
@@ -189,9 +192,9 @@ let JpcCanvasOutput = {
 
             ctx.save();
             ctx.translate(output[0], output[1]);
-            if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
-                private_drawUnderline();
-            }
+            // if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
+            //     private_drawUnderline(val);
+            // }
             if (font.FontAngle === JV.VERTICAL_ANGLE) {
                 ctx.rotate(Math.PI/2);
             } else if (font.FontAngle === JV.ANTI_VERTICAL_ANGLE) {
@@ -199,6 +202,9 @@ let JpcCanvasOutput = {
             }
             if (validAreaTxtWidth >= ctx.measureText(val).width ||
                 (control && control.Shrink !== 'T' && validTxtLines < private_splitString(val, validAreaTxtWidth, ctx)) ) {
+                if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
+                    private_drawUnderline(val);
+                }
                 ctx.fillText(val, 0, 0);
             } else {
                 while (true) {
@@ -228,6 +234,9 @@ let JpcCanvasOutput = {
                             ctx.translate(-output[0], -output[1]);
                             inner_setupControl(newArea, dftFontHeight, output);
                             ctx.translate(output[0], output[1]);
+                            if (font[JV.FONT_PROPS[5]] === 'T' && parseInt(font.FontAngle) === 0) {
+                                private_drawUnderline(actLines[lIdx]);
+                            }
                             ctx.fillText(actLines[lIdx], 0, 0);
                         }
                         break;

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

@@ -237,7 +237,8 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
                 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);
-        if (actLines.length === 1 || (control && control.Shrink !== 'T')) {
+        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);
         } else {
             while (true) {