reamkit 1.6.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/core/drawingml/chart-serializer.d.ts +2 -0
- package/dist/esm/core/drawingml/chart-serializer.js +53 -0
- package/dist/esm/excel/print-model.js +6 -3
- package/dist/esm/excel/xlsx-writer.js +81 -17
- package/dist/esm/pdf-reader/content.d.ts +39 -1
- package/dist/esm/pdf-reader/content.js +132 -4
- package/dist/esm/pdf-reader/crypto.d.ts +7 -0
- package/dist/esm/pdf-reader/crypto.js +609 -0
- package/dist/esm/pdf-reader/decrypt.d.ts +5 -0
- package/dist/esm/pdf-reader/decrypt.js +199 -0
- package/dist/esm/pdf-reader/document.d.ts +7 -0
- package/dist/esm/pdf-reader/document.js +209 -26
- package/dist/esm/pdf-reader/flow-build.d.ts +16 -1
- package/dist/esm/pdf-reader/flow-build.js +102 -3
- package/dist/esm/pdf-reader/image-decode.d.ts +15 -0
- package/dist/esm/pdf-reader/image-decode.js +442 -0
- package/dist/esm/pdf-reader/images.d.ts +16 -0
- package/dist/esm/pdf-reader/images.js +90 -0
- package/dist/esm/pdf-reader/layout.d.ts +2 -2
- package/dist/esm/pdf-reader/layout.js +48 -14
- package/dist/esm/pdf-reader/png-encode.d.ts +2 -0
- package/dist/esm/pdf-reader/png-encode.js +98 -0
- package/dist/esm/pdf-reader/predictor.d.ts +7 -0
- package/dist/esm/pdf-reader/predictor.js +61 -0
- package/dist/esm/pdf-reader/reader.js +11 -4
- package/dist/esm/pdf-reader/tagged.d.ts +2 -2
- package/dist/esm/pdf-reader/tagged.js +60 -7
- package/dist/esm/pdf-reader/text.js +48 -1
- package/dist/esm/pdf-reader/vector.d.ts +12 -0
- package/dist/esm/pdf-reader/vector.js +54 -0
- package/dist/esm/word/docx-writer.js +96 -7
- package/dist/esm/word/omml-serializer.d.ts +2 -0
- package/dist/esm/word/omml-serializer.js +48 -0
- package/package.json +1 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//#region src/core/drawingml/chart-serializer.ts
|
|
2
|
+
var C_NS = "http://schemas.openxmlformats.org/drawingml/2006/chart";
|
|
3
|
+
var A_NS = "http://schemas.openxmlformats.org/drawingml/2006/main";
|
|
4
|
+
var R_NS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
|
|
5
|
+
var GROUP_TAG = {
|
|
6
|
+
bar: "c:barChart",
|
|
7
|
+
line: "c:lineChart",
|
|
8
|
+
pie: "c:pieChart",
|
|
9
|
+
area: "c:areaChart",
|
|
10
|
+
scatter: "c:scatterChart",
|
|
11
|
+
unknown: "c:barChart"
|
|
12
|
+
};
|
|
13
|
+
var CAT_AX_ID = 111111111;
|
|
14
|
+
var VAL_AX_ID = 222222222;
|
|
15
|
+
function chartSpaceXml(chart) {
|
|
16
|
+
const isScatter = chart.type === "scatter";
|
|
17
|
+
const isPie = chart.type === "pie" || chart.doughnut === true;
|
|
18
|
+
const groupTag = chart.doughnut ? "c:doughnutChart" : GROUP_TAG[chart.type] ?? "c:barChart";
|
|
19
|
+
const inner = (chart.type === "bar" ? `<c:barDir val="${chart.barDir ?? "col"}"/>` : "") + (chart.grouping ? `<c:grouping val="${chart.grouping}"/>` : "") + "<c:varyColors val=\"0\"/>" + chart.series.map((s, i) => seriesXml(s, i, isScatter, chart.categories)).join("") + (chart.showValues ? "<c:dLbls><c:showVal val=\"1\"/></c:dLbls>" : "") + (chart.doughnut ? "<c:holeSize val=\"50\"/>" : "") + (isPie ? "" : `<c:axId val="${CAT_AX_ID}"/><c:axId val="${VAL_AX_ID}"/>`);
|
|
20
|
+
const axes = isPie ? "" : isScatter ? valAx(CAT_AX_ID, "b", VAL_AX_ID, chart.catAxisTitle) + valAx(VAL_AX_ID, "l", CAT_AX_ID, chart.valAxisTitle) : catAx(CAT_AX_ID, VAL_AX_ID, chart.catAxisTitle) + valAx(VAL_AX_ID, "l", CAT_AX_ID, chart.valAxisTitle);
|
|
21
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><c:chartSpace xmlns:c="${C_NS}" xmlns:a="${A_NS}" xmlns:r="${R_NS}"><c:chart>` + titleXml(chart.title) + `<c:autoTitleDeleted val="${chart.title ? 0 : 1}"/><c:plotArea><c:layout/><${groupTag}>${inner}</${groupTag}>${axes}</c:plotArea>` + (chart.hasLegend ? `<c:legend><c:legendPos val="${chart.legendPos ?? "r"}"/><c:overlay val="0"/></c:legend>` : "") + "<c:plotVisOnly val=\"1\"/></c:chart></c:chartSpace>";
|
|
22
|
+
}
|
|
23
|
+
function seriesXml(s, idx, isScatter, categories) {
|
|
24
|
+
const tx = s.name ? `<c:tx><c:strRef><c:f>Sheet1!$A$${idx + 1}</c:f><c:strCache><c:ptCount val="1"/><c:pt idx="0"><c:v>${esc(s.name)}</c:v></c:pt></c:strCache></c:strRef></c:tx>` : "";
|
|
25
|
+
const spPr = s.colorHex ? `<c:spPr><a:solidFill><a:srgbClr val="${s.colorHex}"/></a:solidFill></c:spPr>` : "";
|
|
26
|
+
const dPts = (s.pointColors ?? []).map((p) => `<c:dPt><c:idx val="${p.idx}"/><c:bubble3D val="0"/><c:spPr><a:solidFill><a:srgbClr val="${p.colorHex}"/></a:solidFill></c:spPr></c:dPt>`).join("");
|
|
27
|
+
const cat = isScatter ? `<c:xVal>${numRef("A", s.xValues ?? [])}</c:xVal>` : categories.length > 0 ? `<c:cat>${strRef(categories)}</c:cat>` : "";
|
|
28
|
+
const val = isScatter ? `<c:yVal>${numRef("B", s.values)}</c:yVal>` : `<c:val>${numRef("B", s.values)}</c:val>`;
|
|
29
|
+
return `<c:ser><c:idx val="${idx}"/><c:order val="${idx}"/>` + tx + spPr + dPts + cat + val + "</c:ser>";
|
|
30
|
+
}
|
|
31
|
+
function strRef(values) {
|
|
32
|
+
const pts = values.map((v, i) => `<c:pt idx="${i}"><c:v>${esc(v)}</c:v></c:pt>`).join("");
|
|
33
|
+
return `<c:strRef><c:f>Sheet1!\$A\$1</c:f><c:strCache><c:ptCount val="${values.length}"/>${pts}</c:strCache></c:strRef>`;
|
|
34
|
+
}
|
|
35
|
+
function numRef(col, values) {
|
|
36
|
+
const pts = values.map((v, i) => `<c:pt idx="${i}"><c:v>${v}</c:v></c:pt>`).join("");
|
|
37
|
+
return `<c:numRef><c:f>Sheet1!$${col}$1</c:f><c:numCache><c:formatCode>General</c:formatCode><c:ptCount val="${values.length}"/>${pts}</c:numCache></c:numRef>`;
|
|
38
|
+
}
|
|
39
|
+
function titleXml(title) {
|
|
40
|
+
if (!title) return "";
|
|
41
|
+
return `<c:title><c:tx><c:rich><a:bodyPr/><a:lstStyle/><a:p><a:r><a:t>${esc(title)}</a:t></a:r></a:p></c:rich></c:tx><c:overlay val="0"/></c:title>`;
|
|
42
|
+
}
|
|
43
|
+
function catAx(id, crossId, title) {
|
|
44
|
+
return `<c:catAx><c:axId val="${id}"/><c:scaling><c:orientation val="minMax"/></c:scaling><c:delete val="0"/><c:axPos val="b"/>${titleXml(title)}<c:crossAx val="${crossId}"/></c:catAx>`;
|
|
45
|
+
}
|
|
46
|
+
function valAx(id, pos, crossId, title) {
|
|
47
|
+
return `<c:valAx><c:axId val="${id}"/><c:scaling><c:orientation val="minMax"/></c:scaling><c:delete val="0"/><c:axPos val="${pos}"/>${titleXml(title)}<c:crossAx val="${crossId}"/></c:valAx>`;
|
|
48
|
+
}
|
|
49
|
+
function esc(s) {
|
|
50
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
export { chartSpaceXml };
|
|
@@ -309,9 +309,12 @@ function worksheetToBody(worksheet, sharedStrings, styles, date1904, print) {
|
|
|
309
309
|
const local = brk - colStart;
|
|
310
310
|
if (local > 0 && local < colCount) colBreaksLocal.add(local);
|
|
311
311
|
}
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
312
|
+
const fitWide = worksheet.fitToPage ? worksheet.pageSetup?.fitToWidth ?? 1 : 1;
|
|
313
|
+
const bandWidths = scaled ? columnWidths.map((w) => Math.max(1, Math.floor(w * printScale))) : columnWidths;
|
|
314
|
+
const bandTotal = bandWidths.reduce((sum, w) => sum + w, 0);
|
|
315
|
+
if (colCount > 1 && (!scaled || fitWide > 1) && (bandTotal > contentWidthTwips || colBreaksLocal.size > 0)) {
|
|
316
|
+
const bands = computeColumnBands(bandWidths, contentWidthTwips, colBreaksLocal);
|
|
317
|
+
if (bands.length > 1) return bandedTables(rows, bandWidths, bands, tableProperties);
|
|
315
318
|
}
|
|
316
319
|
const frozen = worksheet.pane && (worksheet.pane.frozenRows > 0 || worksheet.pane.frozenCols > 0) ? {
|
|
317
320
|
rows: worksheet.pane.frozenRows,
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
import { FEATURES } from "../core/ir/features.js";
|
|
2
2
|
import { buildOpcPackage } from "../core/opc/opc-writer.js";
|
|
3
3
|
import "../core/opc/index.js";
|
|
4
|
+
import { chartSpaceXml } from "../core/drawingml/chart-serializer.js";
|
|
4
5
|
//#region src/excel/xlsx-writer.ts
|
|
5
6
|
var encoder = new TextEncoder();
|
|
7
|
+
var EMU_PER_PT = 12700;
|
|
6
8
|
var REL_OFFICE_DOCUMENT = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
|
|
7
9
|
var REL_WORKSHEET = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet";
|
|
8
10
|
var REL_SHARED_STRINGS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
|
|
9
11
|
var REL_STYLES = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";
|
|
10
12
|
var REL_TABLE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/table";
|
|
13
|
+
var REL_DRAWING = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";
|
|
14
|
+
var REL_CHART = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart";
|
|
15
|
+
var CT_DRAWING = "application/vnd.openxmlformats-officedocument.drawing+xml";
|
|
16
|
+
var CT_CHART = "application/vnd.openxmlformats-officedocument.drawingml.chart+xml";
|
|
17
|
+
var XDR_NS = "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing";
|
|
18
|
+
var A_NS = "http://schemas.openxmlformats.org/drawingml/2006/main";
|
|
19
|
+
var C_NS = "http://schemas.openxmlformats.org/drawingml/2006/chart";
|
|
11
20
|
var CT_WORKBOOK = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml";
|
|
12
21
|
var CT_WORKSHEET = "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml";
|
|
13
22
|
var CT_SHARED_STRINGS = "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml";
|
|
@@ -19,16 +28,20 @@ function writeXlsx(sheet) {
|
|
|
19
28
|
const losses = [];
|
|
20
29
|
const worksheetParts = [];
|
|
21
30
|
const tableParts = [];
|
|
31
|
+
const drawingParts = [];
|
|
22
32
|
const worksheetRels = [];
|
|
33
|
+
const drawingRels = [];
|
|
23
34
|
const sheetEntries = [];
|
|
24
35
|
const workbookRels = [];
|
|
25
36
|
let tableCounter = 0;
|
|
37
|
+
let drawingCounter = 0;
|
|
38
|
+
let chartCounter = 0;
|
|
26
39
|
sheet.sheets.forEach((s, i) => {
|
|
27
40
|
const idx = i + 1;
|
|
28
41
|
const rid = `rId${idx}`;
|
|
29
42
|
const wsPath = `xl/worksheets/sheet${idx}.xml`;
|
|
43
|
+
const wsRels = [];
|
|
30
44
|
const tableRelIds = [];
|
|
31
|
-
const wsTableRels = [];
|
|
32
45
|
for (const t of s.grid.tables ?? []) {
|
|
33
46
|
const tid = ++tableCounter;
|
|
34
47
|
const tRid = `rIdTbl${tid}`;
|
|
@@ -38,15 +51,23 @@ function writeXlsx(sheet) {
|
|
|
38
51
|
data: encoder.encode(tableXml(t, tid)),
|
|
39
52
|
contentType: CT_TABLE
|
|
40
53
|
});
|
|
41
|
-
|
|
54
|
+
wsRels.push(rel(tRid, REL_TABLE, `../tables/table${tid}.xml`));
|
|
42
55
|
}
|
|
43
|
-
|
|
56
|
+
const drawingRelId = emitSheetCharts(s, sheet, idx, {
|
|
57
|
+
drawingParts,
|
|
58
|
+
drawingRels,
|
|
59
|
+
wsRels,
|
|
60
|
+
nextDrawing: () => ++drawingCounter,
|
|
61
|
+
nextChart: () => ++chartCounter,
|
|
62
|
+
losses
|
|
63
|
+
});
|
|
64
|
+
if (wsRels.length > 0) worksheetRels.push({
|
|
44
65
|
sourcePart: wsPath,
|
|
45
|
-
relationships:
|
|
66
|
+
relationships: wsRels
|
|
46
67
|
});
|
|
47
68
|
worksheetParts.push({
|
|
48
69
|
path: wsPath,
|
|
49
|
-
data: encoder.encode(worksheetXml(s.grid, tableRelIds)),
|
|
70
|
+
data: encoder.encode(worksheetXml(s.grid, tableRelIds, drawingRelId)),
|
|
50
71
|
contentType: CT_WORKSHEET
|
|
51
72
|
});
|
|
52
73
|
workbookRels.push(rel(rid, REL_WORKSHEET, `worksheets/sheet${idx}.xml`));
|
|
@@ -55,7 +76,6 @@ function writeXlsx(sheet) {
|
|
|
55
76
|
sheetId: idx,
|
|
56
77
|
rid
|
|
57
78
|
});
|
|
58
|
-
recordSheetLosses(s, losses);
|
|
59
79
|
});
|
|
60
80
|
const sstRid = `rId${sheet.sheets.length + 1}`;
|
|
61
81
|
const stylesRid = `rId${sheet.sheets.length + 2}`;
|
|
@@ -71,6 +91,7 @@ function writeXlsx(sheet) {
|
|
|
71
91
|
},
|
|
72
92
|
...worksheetParts,
|
|
73
93
|
...tableParts,
|
|
94
|
+
...drawingParts,
|
|
74
95
|
{
|
|
75
96
|
path: "xl/sharedStrings.xml",
|
|
76
97
|
data: encoder.encode(sharedStringsXml(sheet.sharedStrings)),
|
|
@@ -83,10 +104,14 @@ function writeXlsx(sheet) {
|
|
|
83
104
|
}
|
|
84
105
|
],
|
|
85
106
|
rootRelationships: [rel("rId1", REL_OFFICE_DOCUMENT, "xl/workbook.xml")],
|
|
86
|
-
partRelationships: [
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
107
|
+
partRelationships: [
|
|
108
|
+
{
|
|
109
|
+
sourcePart: "xl/workbook.xml",
|
|
110
|
+
relationships: workbookRels
|
|
111
|
+
},
|
|
112
|
+
...worksheetRels,
|
|
113
|
+
...drawingRels
|
|
114
|
+
]
|
|
90
115
|
}),
|
|
91
116
|
losses
|
|
92
117
|
};
|
|
@@ -100,19 +125,58 @@ function rel(id, type, target) {
|
|
|
100
125
|
targetMode: "Internal"
|
|
101
126
|
};
|
|
102
127
|
}
|
|
103
|
-
function
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
128
|
+
function emitSheetCharts(s, doc, idx, ctx) {
|
|
129
|
+
const refs = s.charts ?? [];
|
|
130
|
+
if (refs.length === 0 || !doc.chartData) return void 0;
|
|
131
|
+
const did = ctx.nextDrawing();
|
|
132
|
+
const drawingPath = `xl/drawings/drawing${did}.xml`;
|
|
133
|
+
const anchors = [];
|
|
134
|
+
const dRels = [];
|
|
135
|
+
refs.forEach((ref, ci) => {
|
|
136
|
+
const chart = doc.chartData?.get(ref.chartPartPath);
|
|
137
|
+
if (!chart) {
|
|
138
|
+
ctx.losses.push({
|
|
139
|
+
severity: "dropped",
|
|
140
|
+
feature: FEATURES.charts,
|
|
141
|
+
detail: `sheet "${s.name}": a chart frame had no resolved data and was dropped`
|
|
142
|
+
});
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const cid = ctx.nextChart();
|
|
146
|
+
ctx.drawingParts.push({
|
|
147
|
+
path: `xl/charts/chart${cid}.xml`,
|
|
148
|
+
data: encoder.encode(chartSpaceXml(chart)),
|
|
149
|
+
contentType: CT_CHART
|
|
150
|
+
});
|
|
151
|
+
const cRel = `rIdChart${ci + 1}`;
|
|
152
|
+
dRels.push(rel(cRel, REL_CHART, `../charts/chart${cid}.xml`));
|
|
153
|
+
anchors.push(chartAnchorXml(ref, cRel, ci));
|
|
154
|
+
});
|
|
155
|
+
if (anchors.length === 0) return void 0;
|
|
156
|
+
ctx.drawingParts.push({
|
|
157
|
+
path: drawingPath,
|
|
158
|
+
data: encoder.encode(`${XML_DECL}<xdr:wsDr xmlns:xdr="${XDR_NS}" xmlns:a="${A_NS}">${anchors.join("")}</xdr:wsDr>`),
|
|
159
|
+
contentType: CT_DRAWING
|
|
108
160
|
});
|
|
161
|
+
ctx.drawingRels.push({
|
|
162
|
+
sourcePart: drawingPath,
|
|
163
|
+
relationships: dRels
|
|
164
|
+
});
|
|
165
|
+
const dRid = `rIdDraw${idx}`;
|
|
166
|
+
ctx.wsRels.push(rel(dRid, REL_DRAWING, `../drawings/drawing${did}.xml`));
|
|
167
|
+
return dRid;
|
|
168
|
+
}
|
|
169
|
+
function chartAnchorXml(ref, chartRelId, index) {
|
|
170
|
+
const cx = Math.round(ref.widthPt * EMU_PER_PT);
|
|
171
|
+
const cy = Math.round(ref.heightPt * EMU_PER_PT);
|
|
172
|
+
return `<xdr:oneCellAnchor><xdr:from><xdr:col>0</xdr:col><xdr:colOff>0</xdr:colOff><xdr:row>${index * 16}</xdr:row><xdr:rowOff>0</xdr:rowOff></xdr:from><xdr:ext cx="${cx}" cy="${cy}"/><xdr:graphicFrame macro=""><xdr:nvGraphicFramePr><xdr:cNvPr id="${index + 2}" name="Chart ${index + 1}"/><xdr:cNvGraphicFramePr/></xdr:nvGraphicFramePr><xdr:xfrm><a:off x="0" y="0"/><a:ext cx="${cx}" cy="${cy}"/></xdr:xfrm><a:graphic><a:graphicData uri="${C_NS}"><c:chart xmlns:c="${C_NS}" xmlns:r="${R_NS}" r:id="${chartRelId}"/></a:graphicData></a:graphic></xdr:graphicFrame><xdr:clientData/></xdr:oneCellAnchor>`;
|
|
109
173
|
}
|
|
110
174
|
function workbookXml(sheets, definedNames, date1904) {
|
|
111
175
|
const sheetTags = sheets.map((s) => `<sheet name="${escapeAttr(s.name)}" sheetId="${s.sheetId}" r:id="${s.rid}"/>`).join("");
|
|
112
176
|
const definedNamesXml = definedNames.length > 0 ? `<definedNames>${definedNames.map((d) => `<definedName name="${escapeAttr(d.name)}"${d.localSheetId !== void 0 ? ` localSheetId="${d.localSheetId}"` : ""}>${escapeText(d.value)}</definedName>`).join("")}</definedNames>` : "";
|
|
113
177
|
return XML_DECL + `<workbook xmlns="${MAIN_NS}" xmlns:r="${R_NS}">` + (date1904 ? "<workbookPr date1904=\"1\"/>" : "") + `<sheets>${sheetTags}</sheets>` + definedNamesXml + "</workbook>";
|
|
114
178
|
}
|
|
115
|
-
function worksheetXml(grid, tableRelIds = []) {
|
|
179
|
+
function worksheetXml(grid, tableRelIds = [], drawingRelId) {
|
|
116
180
|
const dimension = grid.maxRow >= 0 && grid.maxColumn >= 0 ? `<dimension ref="A1:${cellRef(grid.maxRow, grid.maxColumn)}"/>` : "<dimension ref=\"A1\"/>";
|
|
117
181
|
const colsXml = grid.columns.length > 0 ? `<cols>${grid.columns.map((c) => `<col min="${c.min}" max="${c.max}" width="${c.widthChars}" customWidth="1"/>`).join("")}</cols>` : "";
|
|
118
182
|
const heightByRow = /* @__PURE__ */ new Map();
|
|
@@ -136,7 +200,7 @@ function worksheetXml(grid, tableRelIds = []) {
|
|
|
136
200
|
return `<row r="${r + 1}"${heightAttrs}>${cells.map(cellXml).join("")}</row>`;
|
|
137
201
|
}).join("");
|
|
138
202
|
const mergesXml = grid.merges.length > 0 ? `<mergeCells count="${grid.merges.length}">${grid.merges.map((m) => `<mergeCell ref="${cellRef(m.startRow, m.startColumn)}:${cellRef(m.endRow, m.endColumn)}"/>`).join("")}</mergeCells>` : "";
|
|
139
|
-
return XML_DECL + `<worksheet xmlns="${MAIN_NS}" xmlns:r="${R_NS}">` + (grid.fitToPage ? "<sheetPr><pageSetUpPr fitToPage=\"1\"/></sheetPr>" : "") + dimension + sheetViewsXml(grid.pane) + colsXml + `<sheetData>${rowsXml}</sheetData>` + mergesXml + conditionalFormattingXml(grid.conditionalFormats) + printOptionsXml(grid.printOptions) + pageMarginsXml(grid.pageMargins) + pageSetupXml(grid.pageSetup) + breaksXml("rowBreaks", grid.rowBreaks) + breaksXml("colBreaks", grid.colBreaks) + (tableRelIds.length > 0 ? `<tableParts count="${tableRelIds.length}">${tableRelIds.map((id) => `<tablePart r:id="${id}"/>`).join("")}</tableParts>` : "") + sparklineExtXml(grid.sparklines) + "</worksheet>";
|
|
203
|
+
return XML_DECL + `<worksheet xmlns="${MAIN_NS}" xmlns:r="${R_NS}">` + (grid.fitToPage ? "<sheetPr><pageSetUpPr fitToPage=\"1\"/></sheetPr>" : "") + dimension + sheetViewsXml(grid.pane) + colsXml + `<sheetData>${rowsXml}</sheetData>` + mergesXml + conditionalFormattingXml(grid.conditionalFormats) + printOptionsXml(grid.printOptions) + pageMarginsXml(grid.pageMargins) + pageSetupXml(grid.pageSetup) + breaksXml("rowBreaks", grid.rowBreaks) + breaksXml("colBreaks", grid.colBreaks) + (drawingRelId ? `<drawing r:id="${drawingRelId}"/>` : "") + (tableRelIds.length > 0 ? `<tableParts count="${tableRelIds.length}">${tableRelIds.map((id) => `<tablePart r:id="${id}"/>`).join("")}</tableParts>` : "") + sparklineExtXml(grid.sparklines) + "</worksheet>";
|
|
140
204
|
}
|
|
141
205
|
function sheetViewsXml(pane) {
|
|
142
206
|
if (!pane || pane.frozenRows <= 0 && pane.frozenCols <= 0) return "";
|
|
@@ -10,5 +10,43 @@ export interface TextRun {
|
|
|
10
10
|
readonly fontSizePt: number;
|
|
11
11
|
readonly fontKey: string;
|
|
12
12
|
readonly mcid?: number;
|
|
13
|
+
readonly href?: string;
|
|
13
14
|
}
|
|
14
|
-
export
|
|
15
|
+
export interface ImagePlacement {
|
|
16
|
+
readonly name: string;
|
|
17
|
+
readonly ctm: Matrix;
|
|
18
|
+
readonly mcid?: number;
|
|
19
|
+
}
|
|
20
|
+
export type PathSeg = {
|
|
21
|
+
readonly op: 'move';
|
|
22
|
+
readonly x: number;
|
|
23
|
+
readonly y: number;
|
|
24
|
+
} | {
|
|
25
|
+
readonly op: 'line';
|
|
26
|
+
readonly x: number;
|
|
27
|
+
readonly y: number;
|
|
28
|
+
} | {
|
|
29
|
+
readonly op: 'cubic';
|
|
30
|
+
readonly x1: number;
|
|
31
|
+
readonly y1: number;
|
|
32
|
+
readonly x2: number;
|
|
33
|
+
readonly y2: number;
|
|
34
|
+
readonly x: number;
|
|
35
|
+
readonly y: number;
|
|
36
|
+
} | {
|
|
37
|
+
readonly op: 'close';
|
|
38
|
+
};
|
|
39
|
+
export interface VectorPlacement {
|
|
40
|
+
readonly segs: ReadonlyArray<PathSeg>;
|
|
41
|
+
readonly fillHex: string;
|
|
42
|
+
readonly mcid?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface InterpretResult {
|
|
45
|
+
readonly texts: Array<TextRun>;
|
|
46
|
+
readonly images: Array<ImagePlacement>;
|
|
47
|
+
readonly vectors: Array<VectorPlacement>;
|
|
48
|
+
}
|
|
49
|
+
export type Matrix = readonly [number, number, number, number, number, number];
|
|
50
|
+
export declare const IDENTITY: Matrix;
|
|
51
|
+
export declare function multiply(a: Matrix, b: Matrix): Matrix;
|
|
52
|
+
export declare function interpretContent(bytes: Uint8Array, fonts: ReadonlyMap<string, ContentFont>, initialCtm?: Matrix): InterpretResult;
|
|
@@ -44,18 +44,72 @@ function initialState() {
|
|
|
44
44
|
wordSpacing: 0,
|
|
45
45
|
hScale: 1,
|
|
46
46
|
leading: 0,
|
|
47
|
-
rise: 0
|
|
47
|
+
rise: 0,
|
|
48
|
+
fillColor: "000000"
|
|
48
49
|
};
|
|
49
50
|
}
|
|
50
|
-
function interpretContent(bytes, fonts) {
|
|
51
|
+
function interpretContent(bytes, fonts, initialCtm = IDENTITY) {
|
|
51
52
|
const runs = [];
|
|
53
|
+
const images = [];
|
|
54
|
+
const vectors = [];
|
|
52
55
|
const lexer = new Lexer(bytes);
|
|
53
56
|
const stack = [];
|
|
54
57
|
let state = initialState();
|
|
58
|
+
state.ctm = initialCtm;
|
|
55
59
|
let tm = IDENTITY;
|
|
56
60
|
let tlm = IDENTITY;
|
|
61
|
+
let path = [];
|
|
57
62
|
let operands = [];
|
|
58
63
|
const mcStack = [];
|
|
64
|
+
const toPage = (x, y) => [x * state.ctm[0] + y * state.ctm[2] + state.ctm[4], x * state.ctm[1] + y * state.ctm[3] + state.ctm[5]];
|
|
65
|
+
const moveTo = (x, y) => {
|
|
66
|
+
const [px, py] = toPage(x, y);
|
|
67
|
+
path.push({
|
|
68
|
+
op: "move",
|
|
69
|
+
x: px,
|
|
70
|
+
y: py
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
const lineTo = (x, y) => {
|
|
74
|
+
const [px, py] = toPage(x, y);
|
|
75
|
+
path.push({
|
|
76
|
+
op: "line",
|
|
77
|
+
x: px,
|
|
78
|
+
y: py
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
const curveTo = (a, b, c, d, e, f) => {
|
|
82
|
+
const [x1, y1] = toPage(a, b);
|
|
83
|
+
const [x2, y2] = toPage(c, d);
|
|
84
|
+
const [x, y] = toPage(e, f);
|
|
85
|
+
path.push({
|
|
86
|
+
op: "cubic",
|
|
87
|
+
x1,
|
|
88
|
+
y1,
|
|
89
|
+
x2,
|
|
90
|
+
y2,
|
|
91
|
+
x,
|
|
92
|
+
y
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
const rectTo = (x, y, w, h) => {
|
|
96
|
+
moveTo(x, y);
|
|
97
|
+
lineTo(x + w, y);
|
|
98
|
+
lineTo(x + w, y + h);
|
|
99
|
+
lineTo(x, y + h);
|
|
100
|
+
path.push({ op: "close" });
|
|
101
|
+
};
|
|
102
|
+
const fillPath = () => {
|
|
103
|
+
if (path.length >= 2) {
|
|
104
|
+
const mcid = mcStack.length > 0 ? mcStack[mcStack.length - 1] : void 0;
|
|
105
|
+
vectors.push({
|
|
106
|
+
segs: path,
|
|
107
|
+
fillHex: state.fillColor,
|
|
108
|
+
...mcid !== void 0 ? { mcid } : {}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
path = [];
|
|
112
|
+
};
|
|
59
113
|
const num = (i) => {
|
|
60
114
|
const v = operands[i];
|
|
61
115
|
return typeof v === "number" ? v : 0;
|
|
@@ -179,6 +233,61 @@ function interpretContent(bytes, fonts) {
|
|
|
179
233
|
case "EMC":
|
|
180
234
|
mcStack.pop();
|
|
181
235
|
break;
|
|
236
|
+
case "Do": {
|
|
237
|
+
const nm = operands[0];
|
|
238
|
+
if (nm instanceof PdfName) {
|
|
239
|
+
const mcid = mcStack.length > 0 ? mcStack[mcStack.length - 1] : void 0;
|
|
240
|
+
images.push({
|
|
241
|
+
name: nm.value,
|
|
242
|
+
ctm: state.ctm,
|
|
243
|
+
...mcid !== void 0 ? { mcid } : {}
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
case "rg":
|
|
249
|
+
state.fillColor = rgbHex(num(0), num(1), num(2));
|
|
250
|
+
break;
|
|
251
|
+
case "g":
|
|
252
|
+
state.fillColor = grayHex(num(0));
|
|
253
|
+
break;
|
|
254
|
+
case "k":
|
|
255
|
+
state.fillColor = cmykHex(num(0), num(1), num(2), num(3));
|
|
256
|
+
break;
|
|
257
|
+
case "m":
|
|
258
|
+
moveTo(num(0), num(1));
|
|
259
|
+
break;
|
|
260
|
+
case "l":
|
|
261
|
+
lineTo(num(0), num(1));
|
|
262
|
+
break;
|
|
263
|
+
case "c":
|
|
264
|
+
curveTo(num(0), num(1), num(2), num(3), num(4), num(5));
|
|
265
|
+
break;
|
|
266
|
+
case "re":
|
|
267
|
+
rectTo(num(0), num(1), num(2), num(3));
|
|
268
|
+
break;
|
|
269
|
+
case "h":
|
|
270
|
+
path.push({ op: "close" });
|
|
271
|
+
break;
|
|
272
|
+
case "f":
|
|
273
|
+
case "F":
|
|
274
|
+
case "f*":
|
|
275
|
+
case "B":
|
|
276
|
+
case "B*":
|
|
277
|
+
fillPath();
|
|
278
|
+
break;
|
|
279
|
+
case "b":
|
|
280
|
+
case "b*":
|
|
281
|
+
path.push({ op: "close" });
|
|
282
|
+
fillPath();
|
|
283
|
+
break;
|
|
284
|
+
case "n":
|
|
285
|
+
case "S":
|
|
286
|
+
case "s":
|
|
287
|
+
case "W":
|
|
288
|
+
case "W*":
|
|
289
|
+
path = [];
|
|
290
|
+
break;
|
|
182
291
|
default: break;
|
|
183
292
|
}
|
|
184
293
|
};
|
|
@@ -215,7 +324,26 @@ function interpretContent(bytes, fonts) {
|
|
|
215
324
|
break;
|
|
216
325
|
}
|
|
217
326
|
}
|
|
218
|
-
return
|
|
327
|
+
return {
|
|
328
|
+
texts: runs,
|
|
329
|
+
images,
|
|
330
|
+
vectors
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
function clamp255(v) {
|
|
334
|
+
return Math.max(0, Math.min(255, Math.round(v * 255)));
|
|
335
|
+
}
|
|
336
|
+
function hex2(v) {
|
|
337
|
+
return clamp255(v).toString(16).padStart(2, "0");
|
|
338
|
+
}
|
|
339
|
+
function rgbHex(r, g, b) {
|
|
340
|
+
return (hex2(r) + hex2(g) + hex2(b)).toUpperCase();
|
|
341
|
+
}
|
|
342
|
+
function grayHex(v) {
|
|
343
|
+
return rgbHex(v, v, v);
|
|
344
|
+
}
|
|
345
|
+
function cmykHex(c, m, y, k) {
|
|
346
|
+
return rgbHex((1 - c) * (1 - k), (1 - m) * (1 - k), (1 - y) * (1 - k));
|
|
219
347
|
}
|
|
220
348
|
function matrixFromOperands(operands) {
|
|
221
349
|
const n = (i) => typeof operands[i] === "number" ? operands[i] : 0;
|
|
@@ -289,4 +417,4 @@ function skipInlineImage(lexer) {
|
|
|
289
417
|
lexer.pos = ei < 0 ? lexer.length : ei + 2;
|
|
290
418
|
}
|
|
291
419
|
//#endregion
|
|
292
|
-
export { interpretContent };
|
|
420
|
+
export { interpretContent, multiply };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function rc4(key: Uint8Array, data: Uint8Array): Uint8Array;
|
|
2
|
+
export declare function md5(input: Uint8Array): Uint8Array;
|
|
3
|
+
export declare function sha256(input: Uint8Array): Uint8Array;
|
|
4
|
+
export declare function sha512(input: Uint8Array): Uint8Array;
|
|
5
|
+
export declare function sha384(input: Uint8Array): Uint8Array;
|
|
6
|
+
export declare function aesCbcDecrypt(key: Uint8Array, iv: Uint8Array, data: Uint8Array, stripPad: boolean): Uint8Array;
|
|
7
|
+
export declare function aesCbcEncrypt(key: Uint8Array, iv: Uint8Array, data: Uint8Array): Uint8Array;
|