office-viewer 0.1.4 → 0.2.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/README.md +0 -2
- package/esm/Word.d.ts +9 -1
- package/esm/Word.js +92 -43
- package/esm/package/PackageParser.d.ts +4 -0
- package/esm/package/XMLPackageParser.d.ts +1 -0
- package/esm/package/ZipPackageParser.d.ts +4 -0
- package/esm/package/ZipPackageParser.js +9 -0
- package/esm/render/renderParagraph.js +21 -42
- package/esm/util/fileType.d.ts +9 -0
- package/esm/util/fileType.js +66 -0
- package/esm/util/mergeRun.js +7 -1
- package/esm/util/replaceVar.d.ts +7 -1
- package/esm/util/replaceVar.js +277 -114
- package/lib/Word.d.ts +9 -1
- package/lib/Word.js +91 -42
- package/lib/package/PackageParser.d.ts +4 -0
- package/lib/package/XMLPackageParser.d.ts +2 -1
- package/lib/package/ZipPackageParser.d.ts +5 -1
- package/lib/package/ZipPackageParser.js +9 -0
- package/lib/render/renderParagraph.js +21 -42
- package/lib/util/fileType.d.ts +9 -0
- package/lib/util/fileType.js +70 -0
- package/lib/util/mergeRun.js +7 -1
- package/lib/util/replaceVar.d.ts +7 -1
- package/lib/util/replaceVar.js +276 -113
- package/package.json +4 -2
package/esm/util/replaceVar.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { __values } from 'tslib';
|
|
1
|
+
import { __awaiter, __generator, __values } from 'tslib';
|
|
2
|
+
import { Pic } from '../openxml/drawing/Pic.js';
|
|
2
3
|
import { createObject } from './createObject.js';
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -30,115 +31,192 @@ function replaceText(word, text, data) {
|
|
|
30
31
|
}
|
|
31
32
|
return text;
|
|
32
33
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
// 生成的新 id
|
|
35
|
+
var newRelId = 1;
|
|
36
|
+
/**
|
|
37
|
+
* 替换图片里的变量
|
|
38
|
+
* @param replaceImage 如果为 true,则会实际替换掉 zip 里的图片,但可能影响性能所以默认不开启,只有下载的时候才开启
|
|
39
|
+
*/
|
|
40
|
+
function replaceAlt(word, cNvPr, data, replaceImage) {
|
|
41
|
+
if (replaceImage === void 0) { replaceImage = false; }
|
|
42
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
43
|
+
var alt, imageURL, parentElement, blip, newId, imageResponse, imageData, pic, blip_1;
|
|
44
|
+
return __generator(this, function (_a) {
|
|
45
|
+
switch (_a.label) {
|
|
46
|
+
case 0:
|
|
47
|
+
if (cNvPr.getAttribute('downloaded')) {
|
|
48
|
+
// 已经替换过了
|
|
49
|
+
return [2 /*return*/];
|
|
50
|
+
}
|
|
51
|
+
alt = cNvPr.getAttribute('descr') || '';
|
|
52
|
+
imageURL = replaceText(word, alt, data);
|
|
53
|
+
cNvPr.setAttribute('descrVar', imageURL);
|
|
54
|
+
if (!(replaceImage && imageURL)) return [3 /*break*/, 4];
|
|
55
|
+
parentElement = cNvPr.parentElement.parentElement;
|
|
56
|
+
blip = parentElement.getElementsByTagName('a:blip').item(0);
|
|
57
|
+
if (!blip) return [3 /*break*/, 3];
|
|
58
|
+
newId = "rIdn".concat(newRelId);
|
|
59
|
+
blip.setAttribute('r:embed', newId);
|
|
60
|
+
return [4 /*yield*/, fetch(imageURL)];
|
|
61
|
+
case 1:
|
|
62
|
+
imageResponse = _a.sent();
|
|
63
|
+
return [4 /*yield*/, imageResponse.arrayBuffer()];
|
|
64
|
+
case 2:
|
|
65
|
+
imageData = _a.sent();
|
|
66
|
+
word.saveNewImage(newId, new Uint8Array(imageData));
|
|
67
|
+
cNvPr.setAttribute('downloaded', 'true');
|
|
68
|
+
newRelId++;
|
|
69
|
+
_a.label = 3;
|
|
70
|
+
case 3:
|
|
71
|
+
pic = Pic.fromXML(word, parentElement);
|
|
72
|
+
if (pic && pic.blipFill && pic.blipFill.blip) {
|
|
73
|
+
blip_1 = pic.blipFill.blip;
|
|
74
|
+
if (blip_1.embled) ;
|
|
75
|
+
}
|
|
76
|
+
_a.label = 4;
|
|
77
|
+
case 4: return [2 /*return*/];
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
});
|
|
36
81
|
}
|
|
37
82
|
/**
|
|
38
83
|
* 替换表格行
|
|
39
84
|
*/
|
|
40
|
-
function replaceTableRow(word, tr) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
85
|
+
function replaceTableRow(word, tr, replaceImage) {
|
|
86
|
+
if (replaceImage === void 0) { replaceImage = false; }
|
|
87
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
88
|
+
var evalVar, data, table, tcs, hasLoop, loopArray, tcs_1, tcs_1_1, tc, ts, ts_1, ts_1_1, t, text, arrayNameMatch, arrayMatchResult, arrayName, array, loopArray_1, loopArray_1_1, item, newTr, ts, rowData, ts_2, ts_2_1, t, _a, _b, cNvPr, e_1_1, e_2_1;
|
|
89
|
+
var e_3, _c, e_4, _d, e_2, _e, e_5, _f, e_1, _g;
|
|
90
|
+
return __generator(this, function (_h) {
|
|
91
|
+
switch (_h.label) {
|
|
92
|
+
case 0:
|
|
93
|
+
evalVar = word.renderOptions.evalVar;
|
|
94
|
+
data = word.renderOptions.data;
|
|
95
|
+
table = tr.parentNode;
|
|
96
|
+
tcs = tr.getElementsByTagName('w:tc');
|
|
97
|
+
hasLoop = false;
|
|
98
|
+
loopArray = [];
|
|
99
|
+
try {
|
|
100
|
+
// 查找对应的循环
|
|
101
|
+
for (tcs_1 = __values(tcs), tcs_1_1 = tcs_1.next(); !tcs_1_1.done; tcs_1_1 = tcs_1.next()) {
|
|
102
|
+
tc = tcs_1_1.value;
|
|
103
|
+
ts = tc.getElementsByTagName('w:t');
|
|
104
|
+
try {
|
|
105
|
+
for (ts_1 = (e_4 = void 0, __values(ts)), ts_1_1 = ts_1.next(); !ts_1_1.done; ts_1_1 = ts_1.next()) {
|
|
106
|
+
t = ts_1_1.value;
|
|
107
|
+
text = t.textContent || '';
|
|
108
|
+
if (text.startsWith('{{#')) {
|
|
109
|
+
arrayNameMatch = /{{#([^\}]+)}}/;
|
|
110
|
+
arrayMatchResult = arrayNameMatch.exec(text);
|
|
111
|
+
if (arrayMatchResult && arrayMatchResult.length > 0) {
|
|
112
|
+
hasLoop = true;
|
|
113
|
+
arrayName = arrayMatchResult[1];
|
|
114
|
+
array = evalVar(arrayName, data);
|
|
115
|
+
if (Array.isArray(array)) {
|
|
116
|
+
loopArray = array;
|
|
117
|
+
}
|
|
118
|
+
// 去掉这个循环变量
|
|
119
|
+
t.textContent = t.textContent.replace("{{#".concat(arrayName, "}}"), '');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (text.indexOf('{{/}}') !== -1) {
|
|
123
|
+
// 去掉结束变量
|
|
124
|
+
t.textContent = t.textContent.replace('{{/}}', '');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
129
|
+
finally {
|
|
130
|
+
try {
|
|
131
|
+
if (ts_1_1 && !ts_1_1.done && (_d = ts_1.return)) _d.call(ts_1);
|
|
132
|
+
}
|
|
133
|
+
finally { if (e_4) throw e_4.error; }
|
|
66
134
|
}
|
|
67
|
-
// 去掉这个循环变量
|
|
68
|
-
t.textContent = t.textContent.replace("{{#".concat(arrayName, "}}"), '');
|
|
69
135
|
}
|
|
70
136
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
78
|
-
finally {
|
|
79
|
-
try {
|
|
80
|
-
if (ts_1_1 && !ts_1_1.done && (_b = ts_1.return)) _b.call(ts_1);
|
|
81
|
-
}
|
|
82
|
-
finally { if (e_2) throw e_2.error; }
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
87
|
-
finally {
|
|
88
|
-
try {
|
|
89
|
-
if (tcs_1_1 && !tcs_1_1.done && (_a = tcs_1.return)) _a.call(tcs_1);
|
|
90
|
-
}
|
|
91
|
-
finally { if (e_1) throw e_1.error; }
|
|
92
|
-
}
|
|
93
|
-
if (hasLoop) {
|
|
94
|
-
try {
|
|
95
|
-
// 有循环,复制多行
|
|
96
|
-
for (var loopArray_1 = __values(loopArray), loopArray_1_1 = loopArray_1.next(); !loopArray_1_1.done; loopArray_1_1 = loopArray_1.next()) {
|
|
97
|
-
var item = loopArray_1_1.value;
|
|
98
|
-
var newTr = cloneTr(tr);
|
|
99
|
-
var ts = newTr.getElementsByTagName('w:t');
|
|
100
|
-
// 将 item 加入上下文
|
|
101
|
-
var rowData = createObject(data, item);
|
|
102
|
-
try {
|
|
103
|
-
for (var ts_2 = (e_4 = void 0, __values(ts)), ts_2_1 = ts_2.next(); !ts_2_1.done; ts_2_1 = ts_2.next()) {
|
|
104
|
-
var t = ts_2_1.value;
|
|
105
|
-
replaceT(word, t, rowData);
|
|
137
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
138
|
+
finally {
|
|
139
|
+
try {
|
|
140
|
+
if (tcs_1_1 && !tcs_1_1.done && (_c = tcs_1.return)) _c.call(tcs_1);
|
|
141
|
+
}
|
|
142
|
+
finally { if (e_3) throw e_3.error; }
|
|
106
143
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
144
|
+
if (!hasLoop) return [3 /*break*/, 16];
|
|
145
|
+
_h.label = 1;
|
|
146
|
+
case 1:
|
|
147
|
+
_h.trys.push([1, 13, 14, 15]);
|
|
148
|
+
loopArray_1 = __values(loopArray), loopArray_1_1 = loopArray_1.next();
|
|
149
|
+
_h.label = 2;
|
|
150
|
+
case 2:
|
|
151
|
+
if (!!loopArray_1_1.done) return [3 /*break*/, 12];
|
|
152
|
+
item = loopArray_1_1.value;
|
|
153
|
+
newTr = cloneTr(tr);
|
|
154
|
+
ts = newTr.getElementsByTagName('w:t');
|
|
155
|
+
rowData = createObject(data, item);
|
|
110
156
|
try {
|
|
111
|
-
|
|
157
|
+
for (ts_2 = (e_5 = void 0, __values(ts)), ts_2_1 = ts_2.next(); !ts_2_1.done; ts_2_1 = ts_2.next()) {
|
|
158
|
+
t = ts_2_1.value;
|
|
159
|
+
replaceT(word, t, rowData);
|
|
160
|
+
}
|
|
112
161
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
replaceAlt(word, cNvPr, rowData);
|
|
162
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
163
|
+
finally {
|
|
164
|
+
try {
|
|
165
|
+
if (ts_2_1 && !ts_2_1.done && (_f = ts_2.return)) _f.call(ts_2);
|
|
166
|
+
}
|
|
167
|
+
finally { if (e_5) throw e_5.error; }
|
|
120
168
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
169
|
+
_h.label = 3;
|
|
170
|
+
case 3:
|
|
171
|
+
_h.trys.push([3, 8, 9, 10]);
|
|
172
|
+
_a = (e_1 = void 0, __values(newTr.getElementsByTagName('pic:cNvPr'))), _b = _a.next();
|
|
173
|
+
_h.label = 4;
|
|
174
|
+
case 4:
|
|
175
|
+
if (!!_b.done) return [3 /*break*/, 7];
|
|
176
|
+
cNvPr = _b.value;
|
|
177
|
+
return [4 /*yield*/, replaceAlt(word, cNvPr, rowData, replaceImage)];
|
|
178
|
+
case 5:
|
|
179
|
+
_h.sent();
|
|
180
|
+
_h.label = 6;
|
|
181
|
+
case 6:
|
|
182
|
+
_b = _a.next();
|
|
183
|
+
return [3 /*break*/, 4];
|
|
184
|
+
case 7: return [3 /*break*/, 10];
|
|
185
|
+
case 8:
|
|
186
|
+
e_1_1 = _h.sent();
|
|
187
|
+
e_1 = { error: e_1_1 };
|
|
188
|
+
return [3 /*break*/, 10];
|
|
189
|
+
case 9:
|
|
124
190
|
try {
|
|
125
|
-
if (
|
|
191
|
+
if (_b && !_b.done && (_g = _a.return)) _g.call(_a);
|
|
126
192
|
}
|
|
127
|
-
finally { if (
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
193
|
+
finally { if (e_1) throw e_1.error; }
|
|
194
|
+
return [7 /*endfinally*/];
|
|
195
|
+
case 10:
|
|
196
|
+
table.insertBefore(newTr, tr);
|
|
197
|
+
_h.label = 11;
|
|
198
|
+
case 11:
|
|
199
|
+
loopArray_1_1 = loopArray_1.next();
|
|
200
|
+
return [3 /*break*/, 2];
|
|
201
|
+
case 12: return [3 /*break*/, 15];
|
|
202
|
+
case 13:
|
|
203
|
+
e_2_1 = _h.sent();
|
|
204
|
+
e_2 = { error: e_2_1 };
|
|
205
|
+
return [3 /*break*/, 15];
|
|
206
|
+
case 14:
|
|
207
|
+
try {
|
|
208
|
+
if (loopArray_1_1 && !loopArray_1_1.done && (_e = loopArray_1.return)) _e.call(loopArray_1);
|
|
209
|
+
}
|
|
210
|
+
finally { if (e_2) throw e_2.error; }
|
|
211
|
+
return [7 /*endfinally*/];
|
|
212
|
+
case 15:
|
|
213
|
+
// 删除原来的行
|
|
214
|
+
table.removeChild(tr);
|
|
215
|
+
_h.label = 16;
|
|
216
|
+
case 16: return [2 /*return*/];
|
|
136
217
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
// 删除原来的行
|
|
140
|
-
table.removeChild(tr);
|
|
141
|
-
}
|
|
218
|
+
});
|
|
219
|
+
});
|
|
142
220
|
}
|
|
143
221
|
/**
|
|
144
222
|
* 克隆行,并进行一些清理
|
|
@@ -191,25 +269,110 @@ function removeAllAttr(node) {
|
|
|
191
269
|
/**
|
|
192
270
|
* 替换表格,目前只支持行
|
|
193
271
|
*/
|
|
194
|
-
function replaceTable(word, documentData) {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
272
|
+
function replaceTable(word, documentData, replaceImage) {
|
|
273
|
+
if (replaceImage === void 0) { replaceImage = false; }
|
|
274
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
275
|
+
var trs, trs_1, trs_1_1, tr, e_8_1;
|
|
276
|
+
var e_8, _a;
|
|
277
|
+
return __generator(this, function (_b) {
|
|
278
|
+
switch (_b.label) {
|
|
279
|
+
case 0:
|
|
280
|
+
trs = [].slice.call(documentData.getElementsByTagName('w:tr'));
|
|
281
|
+
_b.label = 1;
|
|
282
|
+
case 1:
|
|
283
|
+
_b.trys.push([1, 6, 7, 8]);
|
|
284
|
+
trs_1 = __values(trs), trs_1_1 = trs_1.next();
|
|
285
|
+
_b.label = 2;
|
|
286
|
+
case 2:
|
|
287
|
+
if (!!trs_1_1.done) return [3 /*break*/, 5];
|
|
288
|
+
tr = trs_1_1.value;
|
|
289
|
+
return [4 /*yield*/, replaceTableRow(word, tr, replaceImage)];
|
|
290
|
+
case 3:
|
|
291
|
+
_b.sent();
|
|
292
|
+
_b.label = 4;
|
|
293
|
+
case 4:
|
|
294
|
+
trs_1_1 = trs_1.next();
|
|
295
|
+
return [3 /*break*/, 2];
|
|
296
|
+
case 5: return [3 /*break*/, 8];
|
|
297
|
+
case 6:
|
|
298
|
+
e_8_1 = _b.sent();
|
|
299
|
+
e_8 = { error: e_8_1 };
|
|
300
|
+
return [3 /*break*/, 8];
|
|
301
|
+
case 7:
|
|
302
|
+
try {
|
|
303
|
+
if (trs_1_1 && !trs_1_1.done && (_a = trs_1.return)) _a.call(trs_1);
|
|
304
|
+
}
|
|
305
|
+
finally { if (e_8) throw e_8.error; }
|
|
306
|
+
return [7 /*endfinally*/];
|
|
307
|
+
case 8: return [2 /*return*/];
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
});
|
|
210
311
|
}
|
|
211
|
-
|
|
212
|
-
|
|
312
|
+
/**
|
|
313
|
+
* 替换单个图片,必须是不在表格里的
|
|
314
|
+
* @param word
|
|
315
|
+
* @param documentData
|
|
316
|
+
*/
|
|
317
|
+
function replaceSingleImage(word, documentData) {
|
|
318
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
319
|
+
var _a, _b, cNvPr, e_9_1;
|
|
320
|
+
var e_9, _c;
|
|
321
|
+
return __generator(this, function (_d) {
|
|
322
|
+
switch (_d.label) {
|
|
323
|
+
case 0:
|
|
324
|
+
_d.trys.push([0, 5, 6, 7]);
|
|
325
|
+
_a = __values(documentData.getElementsByTagName('pic:cNvPr')), _b = _a.next();
|
|
326
|
+
_d.label = 1;
|
|
327
|
+
case 1:
|
|
328
|
+
if (!!_b.done) return [3 /*break*/, 4];
|
|
329
|
+
cNvPr = _b.value;
|
|
330
|
+
return [4 /*yield*/, replaceAlt(word, cNvPr, word.renderOptions.data, true)];
|
|
331
|
+
case 2:
|
|
332
|
+
_d.sent();
|
|
333
|
+
_d.label = 3;
|
|
334
|
+
case 3:
|
|
335
|
+
_b = _a.next();
|
|
336
|
+
return [3 /*break*/, 1];
|
|
337
|
+
case 4: return [3 /*break*/, 7];
|
|
338
|
+
case 5:
|
|
339
|
+
e_9_1 = _d.sent();
|
|
340
|
+
e_9 = { error: e_9_1 };
|
|
341
|
+
return [3 /*break*/, 7];
|
|
342
|
+
case 6:
|
|
343
|
+
try {
|
|
344
|
+
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
345
|
+
}
|
|
346
|
+
finally { if (e_9) throw e_9.error; }
|
|
347
|
+
return [7 /*endfinally*/];
|
|
348
|
+
case 7: return [2 /*return*/];
|
|
349
|
+
}
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* 变量替换主入口
|
|
355
|
+
* @param word
|
|
356
|
+
* @param documentData
|
|
357
|
+
* @param replaceImage 是否替换掉图片,只有下载时才替换,避免性能问题
|
|
358
|
+
*/
|
|
359
|
+
function replaceVar(word, documentData, replaceImage) {
|
|
360
|
+
if (replaceImage === void 0) { replaceImage = false; }
|
|
361
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
362
|
+
return __generator(this, function (_a) {
|
|
363
|
+
switch (_a.label) {
|
|
364
|
+
case 0: return [4 /*yield*/, replaceTable(word, documentData, replaceImage)];
|
|
365
|
+
case 1:
|
|
366
|
+
_a.sent();
|
|
367
|
+
if (!replaceImage) return [3 /*break*/, 3];
|
|
368
|
+
return [4 /*yield*/, replaceSingleImage(word, documentData)];
|
|
369
|
+
case 2:
|
|
370
|
+
_a.sent();
|
|
371
|
+
_a.label = 3;
|
|
372
|
+
case 3: return [2 /*return*/];
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
});
|
|
213
376
|
}
|
|
214
377
|
|
|
215
378
|
export { replaceT, replaceVar };
|
package/lib/Word.d.ts
CHANGED
|
@@ -209,6 +209,7 @@ export default class Word {
|
|
|
209
209
|
* 当前渲染的段,因为很多渲染需要,所以为了避免大量传参,这里直接挂在这里
|
|
210
210
|
*/
|
|
211
211
|
currentSection: Section;
|
|
212
|
+
DOCUMENT_RELS: string;
|
|
212
213
|
/**
|
|
213
214
|
* 初始化一些公共资源,比如
|
|
214
215
|
*/
|
|
@@ -263,6 +264,13 @@ export default class Word {
|
|
|
263
264
|
* 加载图片
|
|
264
265
|
*/
|
|
265
266
|
loadImage(relation: Relationship): string | null;
|
|
267
|
+
/**
|
|
268
|
+
* 保存新图片,这个方法主要用于图片变量,需要生成新的 relation
|
|
269
|
+
* @param newRelId 关系 id
|
|
270
|
+
* @param blob 文件数据
|
|
271
|
+
* @param ext 扩展名
|
|
272
|
+
*/
|
|
273
|
+
saveNewImage(newRelId: string, data: Uint8Array): void;
|
|
266
274
|
loadFont(rId: string, key: string): string | null;
|
|
267
275
|
/**
|
|
268
276
|
* 解析 html
|
|
@@ -310,7 +318,7 @@ export default class Word {
|
|
|
310
318
|
/**
|
|
311
319
|
* 下载生成的文档,会对 word/document.xml 进行处理,替换文本
|
|
312
320
|
*/
|
|
313
|
-
download(fileName?: string): void
|
|
321
|
+
download(fileName?: string): Promise<void>;
|
|
314
322
|
/**
|
|
315
323
|
* 打印功能
|
|
316
324
|
*/
|
package/lib/Word.js
CHANGED
|
@@ -27,6 +27,7 @@ var renderNotes = require('./render/renderNotes.js');
|
|
|
27
27
|
var print = require('./util/print.js');
|
|
28
28
|
var Settings = require('./openxml/Settings.js');
|
|
29
29
|
var get = require('./util/get.js');
|
|
30
|
+
var fileType = require('./util/fileType.js');
|
|
30
31
|
|
|
31
32
|
var defaultRenderOptions = {
|
|
32
33
|
classPrefix: 'docx-viewer',
|
|
@@ -82,6 +83,7 @@ var Word = /** @class */ (function () {
|
|
|
82
83
|
* 分页标记,如果为 true,那么在渲染的时候会强制分页
|
|
83
84
|
*/
|
|
84
85
|
this.breakPage = false;
|
|
86
|
+
this.DOCUMENT_RELS = '/word/_rels/document.xml.rels';
|
|
85
87
|
parser.load(docFile);
|
|
86
88
|
this.id = Word.globalId++;
|
|
87
89
|
this.parser = parser;
|
|
@@ -205,8 +207,8 @@ var Word = /** @class */ (function () {
|
|
|
205
207
|
}
|
|
206
208
|
this.relationships = rels;
|
|
207
209
|
var documentRels = {};
|
|
208
|
-
if (this.parser.fileExists(
|
|
209
|
-
documentRels = parseRelationship.parseRelationships(this.parser.getXML(
|
|
210
|
+
if (this.parser.fileExists(this.DOCUMENT_RELS)) {
|
|
211
|
+
documentRels = parseRelationship.parseRelationships(this.parser.getXML(this.DOCUMENT_RELS), 'word');
|
|
210
212
|
}
|
|
211
213
|
this.documentRels = documentRels;
|
|
212
214
|
var fontTableRels = {};
|
|
@@ -304,7 +306,7 @@ var Word = /** @class */ (function () {
|
|
|
304
306
|
}
|
|
305
307
|
var data = this.renderOptions.data;
|
|
306
308
|
if (text.indexOf('{{') !== -1) {
|
|
307
|
-
text = text.replace(/{{([^}]+)}}/g, function (all, group) {
|
|
309
|
+
text = text.replace(/{{([^{}]+)}}/g, function (all, group) {
|
|
308
310
|
var result = _this.renderOptions.evalVar(group, data);
|
|
309
311
|
if (typeof result === 'undefined') {
|
|
310
312
|
return '';
|
|
@@ -335,6 +337,37 @@ var Word = /** @class */ (function () {
|
|
|
335
337
|
}
|
|
336
338
|
return null;
|
|
337
339
|
};
|
|
340
|
+
/**
|
|
341
|
+
* 保存新图片,这个方法主要用于图片变量,需要生成新的 relation
|
|
342
|
+
* @param newRelId 关系 id
|
|
343
|
+
* @param blob 文件数据
|
|
344
|
+
* @param ext 扩展名
|
|
345
|
+
*/
|
|
346
|
+
Word.prototype.saveNewImage = function (newRelId, data) {
|
|
347
|
+
if (this.parser.fileExists(this.DOCUMENT_RELS)) {
|
|
348
|
+
var documentRels = this.parser.getXML(this.DOCUMENT_RELS);
|
|
349
|
+
// 基于一个克隆更稳妥
|
|
350
|
+
var newRelation = documentRels
|
|
351
|
+
.getElementsByTagName('Relationship')
|
|
352
|
+
.item(0)
|
|
353
|
+
.cloneNode(true);
|
|
354
|
+
newRelation.setAttributeNS(null, 'Id', newRelId);
|
|
355
|
+
newRelation.setAttributeNS(null, 'Type', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image');
|
|
356
|
+
var ext = '';
|
|
357
|
+
var fileType$1 = fileType.fileTypeFromBuffer(data);
|
|
358
|
+
if (fileType$1) {
|
|
359
|
+
ext = '.' + fileType$1.ext;
|
|
360
|
+
}
|
|
361
|
+
var imagePath = 'media/image' + newRelId + ext;
|
|
362
|
+
newRelation.setAttributeNS(null, 'Target', imagePath);
|
|
363
|
+
documentRels
|
|
364
|
+
.getElementsByTagName('Relationships')[0]
|
|
365
|
+
.appendChild(newRelation);
|
|
366
|
+
// 需要使用相对路径
|
|
367
|
+
this.parser.saveFile(this.DOCUMENT_RELS.replace(/^\//, ''), xml.buildXML(documentRels));
|
|
368
|
+
this.parser.saveFile('word/' + imagePath, data);
|
|
369
|
+
}
|
|
370
|
+
};
|
|
338
371
|
Word.prototype.loadFont = function (rId, key) {
|
|
339
372
|
var relation = this.getFontTableRels(rId);
|
|
340
373
|
if (!relation) {
|
|
@@ -462,18 +495,29 @@ var Word = /** @class */ (function () {
|
|
|
462
495
|
*/
|
|
463
496
|
Word.prototype.download = function (fileName) {
|
|
464
497
|
if (fileName === void 0) { fileName = 'document.docx'; }
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
498
|
+
return tslib.__awaiter(this, void 0, void 0, function () {
|
|
499
|
+
var documentData, ts, i, blob$1;
|
|
500
|
+
return tslib.__generator(this, function (_a) {
|
|
501
|
+
switch (_a.label) {
|
|
502
|
+
case 0:
|
|
503
|
+
documentData = this.getXML('word/document.xml');
|
|
504
|
+
if (!this.renderOptions.enableVar) return [3 /*break*/, 2];
|
|
505
|
+
mergeRun.mergeRun(this, documentData);
|
|
506
|
+
return [4 /*yield*/, replaceVar.replaceVar(this, documentData, true)];
|
|
507
|
+
case 1:
|
|
508
|
+
_a.sent();
|
|
509
|
+
ts = documentData.getElementsByTagName('w:t');
|
|
510
|
+
for (i = 0; i < ts.length; i++) {
|
|
511
|
+
replaceVar.replaceT(this, ts[i], this.renderOptions.data);
|
|
512
|
+
}
|
|
513
|
+
_a.label = 2;
|
|
514
|
+
case 2:
|
|
515
|
+
blob$1 = this.parser.generateZip(xml.buildXML(documentData));
|
|
516
|
+
blob.downloadBlob(blob$1, fileName);
|
|
517
|
+
return [2 /*return*/];
|
|
518
|
+
}
|
|
519
|
+
});
|
|
520
|
+
});
|
|
477
521
|
};
|
|
478
522
|
/**
|
|
479
523
|
* 打印功能
|
|
@@ -518,34 +562,39 @@ var Word = /** @class */ (function () {
|
|
|
518
562
|
return tslib.__awaiter(this, void 0, void 0, function () {
|
|
519
563
|
var renderOptions, isDebug, documentData, document, documentElement;
|
|
520
564
|
return tslib.__generator(this, function (_a) {
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
565
|
+
switch (_a.label) {
|
|
566
|
+
case 0:
|
|
567
|
+
this.init();
|
|
568
|
+
this.currentPage = 0;
|
|
569
|
+
renderOptions = tslib.__assign(tslib.__assign({}, this.renderOptions), renderOptionsOverride);
|
|
570
|
+
isDebug = renderOptions.debug;
|
|
571
|
+
isDebug && console.log('init', this);
|
|
572
|
+
this.rootElement = root;
|
|
573
|
+
root.innerHTML = '';
|
|
574
|
+
documentData = this.getXML('word/document.xml');
|
|
575
|
+
isDebug && console.log('documentData', documentData);
|
|
576
|
+
if (!renderOptions.enableVar) return [3 /*break*/, 2];
|
|
577
|
+
mergeRun.mergeRun(this, documentData);
|
|
578
|
+
return [4 /*yield*/, replaceVar.replaceVar(this, documentData)];
|
|
579
|
+
case 1:
|
|
580
|
+
_a.sent();
|
|
581
|
+
_a.label = 2;
|
|
582
|
+
case 2:
|
|
583
|
+
document = WDocument.WDocument.fromXML(this, documentData);
|
|
584
|
+
isDebug && console.log('document', document);
|
|
585
|
+
documentElement = renderDocument["default"](root, this, document, renderOptions);
|
|
586
|
+
root.classList.add(this.getClassPrefix());
|
|
587
|
+
if (renderOptions.page && renderOptions.pageWrap) {
|
|
588
|
+
root.classList.add(this.wrapClassName);
|
|
589
|
+
root.style.padding = "".concat(renderOptions.pageWrapPadding || 0, "pt");
|
|
590
|
+
root.style.background = renderOptions.pageWrapBackground || '#ECECEC';
|
|
591
|
+
}
|
|
592
|
+
dom.appendChild(root, renderStyle.renderStyle(this));
|
|
593
|
+
dom.appendChild(root, renderFont.renderFont(this.fontTable));
|
|
594
|
+
dom.appendChild(root, documentElement);
|
|
595
|
+
dom.appendChild(root, renderNotes.renderNotes(this));
|
|
596
|
+
return [2 /*return*/];
|
|
543
597
|
}
|
|
544
|
-
dom.appendChild(root, renderStyle.renderStyle(this));
|
|
545
|
-
dom.appendChild(root, renderFont.renderFont(this.fontTable));
|
|
546
|
-
dom.appendChild(root, documentElement);
|
|
547
|
-
dom.appendChild(root, renderNotes.renderNotes(this));
|
|
548
|
-
return [2 /*return*/];
|
|
549
598
|
});
|
|
550
599
|
});
|
|
551
600
|
};
|
|
@@ -13,6 +13,10 @@ export interface PackageParser {
|
|
|
13
13
|
* 根据类型读取文件
|
|
14
14
|
*/
|
|
15
15
|
getFileByType(filePath: string, type: 'string' | 'blob' | 'uint8array'): string | Blob | Uint8Array | null;
|
|
16
|
+
/**
|
|
17
|
+
* 写入文件,主要用于图片
|
|
18
|
+
*/
|
|
19
|
+
saveFile(filePath: string, content: Uint8Array | string): void;
|
|
16
20
|
/**
|
|
17
21
|
* 文件是否存在
|
|
18
22
|
*/
|