|
@@ -60,7 +60,7 @@ let rptPrintHelper = {
|
|
|
let isHtoV = false;
|
|
|
if (pixelSize[0] > pixelSize[1]) {
|
|
|
// changeHtoV(pagesData, pixelSize);
|
|
|
- // isHtoV = true;
|
|
|
+ isHtoV = true;
|
|
|
}
|
|
|
for (let idx = 0; idx < pagesData.items.length; idx++) {
|
|
|
let page = pagesData.items[idx];
|
|
@@ -69,7 +69,7 @@ let rptPrintHelper = {
|
|
|
// let adjustY = 0.5 * ((idx + 1) % 2);
|
|
|
let adjustY = 0.5;
|
|
|
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, isHtoV));
|
|
|
+ svgPageArr.push(buildCellSvg(cell, fonts, styles, controls, page[JV.PROP_PAGE_MERGE_BORDER], pagesData[JV.BAND_PROP_MERGE_BAND], offsetX, offsetY, adjustY, canvas, isHtoV, pixelSize));
|
|
|
}
|
|
|
svgPageArr.push("</svg>");
|
|
|
rst.push(svgPageArr);
|
|
@@ -78,36 +78,6 @@ let rptPrintHelper = {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
-function changeHtoV(pagesData, pixelSize) {
|
|
|
- //坐标从横向变纵向
|
|
|
- if (pixelSize[0] > pixelSize[1]) {
|
|
|
- let tmpP = pixelSize[0];
|
|
|
- pixelSize[0] = pixelSize[1];
|
|
|
- pixelSize[1] = tmpP;
|
|
|
- }
|
|
|
- let offsetX = pixelSize[0];
|
|
|
- // let RotAngF = (90 * Math.PI / 180); //这里默认就是90度旋转
|
|
|
- let sinVal = 1; //sin 90度 = 1 不用算了
|
|
|
- let cosVal = 0; //cos 90度 = 0 不用算了
|
|
|
- for (let page of pagesData.items) {
|
|
|
- for (let cell of page.cells) {
|
|
|
- rotateCellArea(cell[JV.PROP_AREA], sinVal, cosVal, offsetX);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function rotateCellArea(area, sinVal, cosVal, offsetX) {
|
|
|
- let Nx, Ny;
|
|
|
- Nx = (area[JV.PROP_LEFT] * cosVal - area[JV.PROP_TOP] * sinVal);
|
|
|
- Ny = (area[JV.PROP_TOP] * cosVal + area[JV.PROP_LEFT] * sinVal);
|
|
|
- area[JV.PROP_LEFT] = Nx + offsetX;
|
|
|
- area[JV.PROP_TOP] = Ny;
|
|
|
- Nx = (area[JV.PROP_RIGHT] * cosVal - area[JV.PROP_BOTTOM] * sinVal);
|
|
|
- Ny = (area[JV.PROP_BOTTOM] * cosVal + area[JV.PROP_RIGHT] * sinVal);
|
|
|
- area[JV.PROP_RIGHT] = Nx + offsetX;
|
|
|
- area[JV.PROP_BOTTOM] = Ny;
|
|
|
-}
|
|
|
-
|
|
|
function getActualBorderStyle(cell, styles, mergeBorderStyle, pageBorderArea, borderStr) {
|
|
|
let rst = styles[cell[JV.PROP_STYLE]][borderStr];
|
|
|
if (mergeBorderStyle) {
|
|
@@ -128,7 +98,7 @@ function getActualBorderStyle(cell, styles, mergeBorderStyle, pageBorderArea, bo
|
|
|
return rst;
|
|
|
}
|
|
|
|
|
|
-function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY, canvas, isHtoV) {
|
|
|
+function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY, canvas, isHtoV, pixelSize) {
|
|
|
let rst = [];
|
|
|
let style = styles[cell[JV.PROP_STYLE]];
|
|
|
let mergeBandStyle = null;
|
|
@@ -144,163 +114,50 @@ function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBo
|
|
|
top = parseInt(cell[JV.PROP_AREA][JV.PROP_TOP]) + offsetY + adjustY,
|
|
|
bottom = parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) + offsetY + adjustY
|
|
|
;
|
|
|
+ let HtoVStr = "";
|
|
|
+ if (isHtoV) {
|
|
|
+ HtoVStr = ` transform="translate(`+ pixelSize[1] + `,0) rotate(90)"`;
|
|
|
+ }
|
|
|
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] +"'/>")
|
|
|
+ "' style='stroke:rgb(0,0,0);stroke-width:" + leftBS[JV.PROP_LINE_WEIGHT] + "'" + HtoVStr + "/>")
|
|
|
}
|
|
|
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] +"'/>")
|
|
|
+ "' style='stroke:rgb(0,0,0);stroke-width:" + rightBS[JV.PROP_LINE_WEIGHT] +"'" + HtoVStr + "/>")
|
|
|
}
|
|
|
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] +"'/>")
|
|
|
+ "' style='stroke:rgb(0,0,0);stroke-width:" + topBS[JV.PROP_LINE_WEIGHT] +"'" + HtoVStr + "/>")
|
|
|
}
|
|
|
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] +"'/>")
|
|
|
+ "' style='stroke:rgb(0,0,0);stroke-width:" + bottomBS[JV.PROP_LINE_WEIGHT] +"'" + HtoVStr + "/>")
|
|
|
}
|
|
|
}
|
|
|
let control = cell[JV.PROP_CONTROL];
|
|
|
if (typeof control === 'string') {
|
|
|
control = controls[cell[JV.PROP_CONTROL]];
|
|
|
}
|
|
|
- buildText(rst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV);
|
|
|
+ buildText(rst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV, HtoVStr);
|
|
|
|
|
|
return rst.join("");
|
|
|
}
|
|
|
|
|
|
-function buildTextHtoV(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV) {
|
|
|
- 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 fontUnderline = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_UNDERLINE]] === 'T')?"underline":"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);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- let area = [0,0,0,0];
|
|
|
- area[JV.IDX_TOP] = top;
|
|
|
- area[JV.IDX_BOTTOM] = bottom;
|
|
|
- area[JV.IDX_LEFT] = left;
|
|
|
- area[JV.IDX_RIGHT] = right;
|
|
|
- let height = bottom - top;
|
|
|
- let ctx = canvas.getContext("2d");
|
|
|
- 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];
|
|
|
- function inner_build_text(innerTxt, innerArea) {
|
|
|
- let innerDftFontHeight = (dftFontHeight * 3 / 4); //SVG的字体与canvas的字体大小的切换, 不用考虑取整
|
|
|
- if (control) {
|
|
|
- if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "top") {
|
|
|
- y = innerArea[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_TOP];
|
|
|
- } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "bottom") {
|
|
|
- y = innerArea[JV.IDX_BOTTOM] - JV.OUTPUT_OFFSET[JV.IDX_BOTTOM];
|
|
|
- } else if (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_VERTICAL]] === "center") {
|
|
|
- y = Math.round((innerArea[JV.IDX_TOP] + innerArea[JV.IDX_BOTTOM] + innerDftFontHeight) / 2 );
|
|
|
- }
|
|
|
- } else {
|
|
|
- y = innerArea[JV.IDX_TOP] + JV.OUTPUT_OFFSET[JV.IDX_TOP];
|
|
|
- }
|
|
|
- if (font[JV.PROP_NAME] === "宋体") {
|
|
|
- y--;
|
|
|
- }
|
|
|
- destRst.push("<text style='fill:black;font-family:" + font[JV.PROP_NAME] +
|
|
|
- ";font-weight:" + fontWeight +
|
|
|
- ";font-style:" + fontStyle +
|
|
|
- ";text-decoration:" + fontUnderline +
|
|
|
- // ";text-decoration:normal" +
|
|
|
- ";font-size:" + innerDftFontHeight + "pt' x='" +
|
|
|
- x +"' y='" + y + "' text-anchor='" + text_anchor + "' xml:space='preserve'>" + innerTxt + "</text>");
|
|
|
- }
|
|
|
- let actLines = private_splitString(textValue, (area[JV.IDX_RIGHT] - area[JV.IDX_LEFT]), ctx);
|
|
|
- if (actLines.length === 1 || (control && control.Shrink !== 'T')) {
|
|
|
- inner_build_text(textValue, area);
|
|
|
- } else {
|
|
|
- while (true) {
|
|
|
- if (dftFontHeight > 6) {
|
|
|
- let lines = Math.floor((area[JV.IDX_BOTTOM] - area[JV.IDX_TOP]) / (dftFontHeight + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.IDX_TOP] + 4));
|
|
|
- lines = (lines === 0)?1:lines;
|
|
|
- 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);
|
|
|
- if (lines >= actLines.length) {
|
|
|
- let aH = dftFontHeight + JV.OUTPUT_OFFSET[JV.IDX_BOTTOM] + JV.OUTPUT_OFFSET[JV.IDX_TOP] + 4;
|
|
|
- if ((aH * actLines.length) < (area[JV.IDX_BOTTOM] - area[JV.IDX_TOP]) && (control && control.Vertical !== 'top')) {
|
|
|
- if (control.Vertical === 'bottom') {
|
|
|
- area[JV.IDX_TOP] = area[JV.IDX_BOTTOM] - (aH * actLines.length);
|
|
|
- } else {
|
|
|
- area[JV.IDX_TOP] = (area[JV.IDX_TOP] + area[JV.IDX_BOTTOM]) / 2 - (aH * actLines.length) / 2
|
|
|
- area[JV.IDX_BOTTOM] = area[JV.IDX_TOP] + (aH * actLines.length);
|
|
|
- }
|
|
|
- }
|
|
|
- let newArea = [], baseTop = area[JV.IDX_TOP];
|
|
|
- for (let ai = 0; ai < area.length; ai++) {
|
|
|
- newArea[ai] = area[ai];
|
|
|
- }
|
|
|
- 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_build_text(actLines[lIdx], newArea);
|
|
|
- }
|
|
|
- break;
|
|
|
- } else {
|
|
|
- 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 {
|
|
|
- inner_build_text(textValue, area);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- };
|
|
|
- for (let vidx = 0; vidx < values.length; vidx++) {
|
|
|
- area[JV.IDX_TOP] = top + vidx * (height / values.length);
|
|
|
- area[JV.IDX_BOTTOM] = top + (vidx + 1) * (height / values.length);
|
|
|
- inner_draw_text(values[vidx]);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV) {
|
|
|
+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";
|
|
|
let fontStyle = (font[JV.FONT_PROPS[JV.FONT_PROP_IDX_ITALIC]] === 'T')?"italic":"normal";
|
|
@@ -368,7 +225,7 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
|
|
|
";text-decoration:" + fontUnderline +
|
|
|
// ";text-decoration:normal" +
|
|
|
";font-size:" + innerDftFontHeight + "pt' x='" +
|
|
|
- x +"' y='" + y + "' text-anchor='" + text_anchor + "' xml:space='preserve'>" + innerTxt + "</text>");
|
|
|
+ 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')) {
|