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.
@@ -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
- function replaceAlt(word, cNvPr, data) {
34
- var alt = cNvPr.getAttribute('descr') || '';
35
- cNvPr.setAttribute('descrVar', replaceText(word, alt, data));
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
- var e_1, _a, e_2, _b, e_3, _c, e_4, _d, e_5, _e;
42
- var evalVar = word.renderOptions.evalVar;
43
- var data = word.renderOptions.data;
44
- var table = tr.parentNode;
45
- var tcs = tr.getElementsByTagName('w:tc');
46
- var hasLoop = false;
47
- var loopArray = [];
48
- try {
49
- // 查找对应的循环
50
- for (var tcs_1 = __values(tcs), tcs_1_1 = tcs_1.next(); !tcs_1_1.done; tcs_1_1 = tcs_1.next()) {
51
- var tc = tcs_1_1.value;
52
- var ts = tc.getElementsByTagName('w:t');
53
- try {
54
- for (var ts_1 = (e_2 = void 0, __values(ts)), ts_1_1 = ts_1.next(); !ts_1_1.done; ts_1_1 = ts_1.next()) {
55
- var t = ts_1_1.value;
56
- var text = t.textContent || '';
57
- if (text.startsWith('{{#')) {
58
- var arrayNameMatch = /{{#([^\}]+)}}/;
59
- var arrayMatchResult = arrayNameMatch.exec(text);
60
- if (arrayMatchResult && arrayMatchResult.length > 0) {
61
- hasLoop = true;
62
- var arrayName = arrayMatchResult[1];
63
- var array = evalVar(arrayName, data);
64
- if (Array.isArray(array)) {
65
- loopArray = array;
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
- if (text.indexOf('{{/}}')) {
72
- // 去掉结束变量
73
- t.textContent = t.textContent.replace('{{/}}', '');
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
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
109
- finally {
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
- if (ts_2_1 && !ts_2_1.done && (_d = ts_2.return)) _d.call(ts_2);
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
- finally { if (e_4) throw e_4.error; }
114
- }
115
- try {
116
- // 替换图片里的变量
117
- for (var _f = (e_5 = void 0, __values(newTr.getElementsByTagName('pic:cNvPr'))), _g = _f.next(); !_g.done; _g = _f.next()) {
118
- var cNvPr = _g.value;
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
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
123
- finally {
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 (_g && !_g.done && (_e = _f.return)) _e.call(_f);
191
+ if (_b && !_b.done && (_g = _a.return)) _g.call(_a);
126
192
  }
127
- finally { if (e_5) throw e_5.error; }
128
- }
129
- table.insertBefore(newTr, tr);
130
- }
131
- }
132
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
133
- finally {
134
- try {
135
- if (loopArray_1_1 && !loopArray_1_1.done && (_c = loopArray_1.return)) _c.call(loopArray_1);
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
- finally { if (e_3) throw e_3.error; }
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
- var e_8, _a;
196
- var trs = [].slice.call(documentData.getElementsByTagName('w:tr'));
197
- try {
198
- for (var trs_1 = __values(trs), trs_1_1 = trs_1.next(); !trs_1_1.done; trs_1_1 = trs_1.next()) {
199
- var tr = trs_1_1.value;
200
- replaceTableRow(word, tr);
201
- }
202
- }
203
- catch (e_8_1) { e_8 = { error: e_8_1 }; }
204
- finally {
205
- try {
206
- if (trs_1_1 && !trs_1_1.done && (_a = trs_1.return)) _a.call(trs_1);
207
- }
208
- finally { if (e_8) throw e_8.error; }
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
- function replaceVar(word, documentData) {
212
- replaceTable(word, documentData);
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('/word/_rels/document.xml.rels')) {
209
- documentRels = parseRelationship.parseRelationships(this.parser.getXML('/word/_rels/document.xml.rels'), 'word');
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
- var documentData = this.getXML('word/document.xml');
466
- if (this.renderOptions.enableVar) {
467
- mergeRun.mergeRun(this, documentData);
468
- replaceVar.replaceVar(this, documentData);
469
- // 对文本进行替换
470
- var ts = documentData.getElementsByTagName('w:t');
471
- for (var i = 0; i < ts.length; i++) {
472
- replaceVar.replaceT(this, ts[i], this.renderOptions.data);
473
- }
474
- }
475
- var blob$1 = this.parser.generateZip(xml.buildXML(documentData));
476
- blob.downloadBlob(blob$1, fileName);
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
- this.init();
522
- this.currentPage = 0;
523
- renderOptions = tslib.__assign(tslib.__assign({}, this.renderOptions), renderOptionsOverride);
524
- isDebug = renderOptions.debug;
525
- isDebug && console.log('init', this);
526
- this.rootElement = root;
527
- root.innerHTML = '';
528
- documentData = this.getXML('word/document.xml');
529
- isDebug && console.log('documentData', documentData);
530
- if (renderOptions.enableVar) {
531
- mergeRun.mergeRun(this, documentData);
532
- replaceVar.replaceVar(this, documentData);
533
- // 这里不进行变量替换,方便后续进行局部替换来更新变量
534
- }
535
- document = WDocument.WDocument.fromXML(this, documentData);
536
- isDebug && console.log('document', document);
537
- documentElement = renderDocument["default"](root, this, document, renderOptions);
538
- root.classList.add(this.getClassPrefix());
539
- if (renderOptions.page && renderOptions.pageWrap) {
540
- root.classList.add(this.wrapClassName);
541
- root.style.padding = "".concat(renderOptions.pageWrapPadding || 0, "pt");
542
- root.style.background = renderOptions.pageWrapBackground || '#ECECEC';
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
  */