|
@@ -56,14 +56,20 @@ let rptPrintHelper = {
|
|
|
;
|
|
|
let rst = [];
|
|
|
let canvas = document.getElementById("chkCanvas");
|
|
|
+ let pixelSize = getPixelSize(pagesData);
|
|
|
+ let isHtoV = false;
|
|
|
+ if (pixelSize[0] > pixelSize[1]) {
|
|
|
+ // changeHtoV(pagesData, pixelSize);
|
|
|
+ // isHtoV = true;
|
|
|
+ }
|
|
|
for (let idx = 0; idx < pagesData.items.length; idx++) {
|
|
|
let page = pagesData.items[idx];
|
|
|
- let svgPageArr = [], pixelSize = getPixelSize(pagesData);
|
|
|
+ let svgPageArr = [];
|
|
|
svgPageArr.push("<svg width='" + pixelSize[0] + "' height='" + pixelSize[1] + "'>");
|
|
|
// 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));
|
|
|
+ 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("</svg>");
|
|
|
rst.push(svgPageArr);
|
|
@@ -72,6 +78,36 @@ 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) {
|
|
@@ -92,7 +128,7 @@ function getActualBorderStyle(cell, styles, mergeBorderStyle, pageBorderArea, bo
|
|
|
return rst;
|
|
|
}
|
|
|
|
|
|
-function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY, canvas) {
|
|
|
+function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBorder, offsetX, offsetY, adjustY, canvas, isHtoV) {
|
|
|
let rst = [];
|
|
|
let style = styles[cell[JV.PROP_STYLE]];
|
|
|
let mergeBandStyle = null;
|
|
@@ -142,12 +178,129 @@ function buildCellSvg(cell, fonts, styles, controls, pageMergeBorder, rptMergeBo
|
|
|
if (typeof control === 'string') {
|
|
|
control = controls[cell[JV.PROP_CONTROL]];
|
|
|
}
|
|
|
- buildText(rst, cell, font, control, offsetX, offsetY, adjustY, canvas);
|
|
|
+ buildText(rst, cell, font, control, offsetX, offsetY, adjustY, canvas, isHtoV);
|
|
|
|
|
|
return rst.join("");
|
|
|
}
|
|
|
|
|
|
-function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canvas) {
|
|
|
+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) {
|
|
|
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";
|
|
@@ -169,7 +322,7 @@ function buildText(destRst, cell, font, control, offsetX, offsetY, adjustY, canv
|
|
|
} else {
|
|
|
values = [value];
|
|
|
}
|
|
|
- let stepHeight = (parseInt(cell[JV.PROP_AREA][JV.PROP_BOTTOM]) - parseInt(cell[JV.PROP_AREA][JV.PROP_TOP])) / values.length;
|
|
|
+ // 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";
|