pdfmake 0.2.13 → 0.3.0-beta.10

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.
Files changed (136) hide show
  1. package/CHANGELOG.md +23 -41
  2. package/README.md +11 -7
  3. package/build/pdfmake.js +22291 -23202
  4. package/build/pdfmake.js.map +1 -1
  5. package/build/pdfmake.min.js +2 -2
  6. package/build/pdfmake.min.js.map +1 -1
  7. package/build/standard-fonts/Courier.js +27 -0
  8. package/build/standard-fonts/Helvetica.js +27 -0
  9. package/build/standard-fonts/Symbol.js +21 -0
  10. package/build/standard-fonts/Times.js +27 -0
  11. package/build/standard-fonts/ZapfDingbats.js +21 -0
  12. package/build/vfs_fonts.js +2 -2
  13. package/build-vfs.js +2 -2
  14. package/eslint.config.mjs +52 -0
  15. package/fonts/Roboto/Roboto-Italic.ttf +0 -0
  16. package/fonts/Roboto/Roboto-Medium.ttf +0 -0
  17. package/fonts/Roboto/Roboto-MediumItalic.ttf +0 -0
  18. package/fonts/Roboto/Roboto-Regular.ttf +0 -0
  19. package/fonts/Roboto.js +8 -0
  20. package/js/3rd-party/svg-to-pdfkit/source.js +3626 -0
  21. package/js/3rd-party/svg-to-pdfkit.js +7 -0
  22. package/js/DocMeasure.js +626 -0
  23. package/js/DocPreprocessor.js +238 -0
  24. package/js/DocumentContext.js +288 -0
  25. package/js/ElementWriter.js +342 -0
  26. package/js/LayoutBuilder.js +881 -0
  27. package/js/Line.js +105 -0
  28. package/js/OutputDocument.js +76 -0
  29. package/js/OutputDocumentServer.js +27 -0
  30. package/js/PDFDocument.js +144 -0
  31. package/js/PageElementWriter.js +140 -0
  32. package/js/PageSize.js +74 -0
  33. package/js/Printer.js +291 -0
  34. package/js/Renderer.js +375 -0
  35. package/js/SVGMeasure.js +69 -0
  36. package/js/StyleContextStack.js +164 -0
  37. package/js/TableProcessor.js +524 -0
  38. package/js/TextBreaker.js +139 -0
  39. package/js/TextDecorator.js +143 -0
  40. package/js/TextInlines.js +206 -0
  41. package/js/URLResolver.js +73 -0
  42. package/js/base.js +52 -0
  43. package/js/browser-extensions/OutputDocumentBrowser.js +118 -0
  44. package/js/browser-extensions/URLBrowserResolver.js +76 -0
  45. package/js/browser-extensions/fonts/Roboto.js +38 -0
  46. package/js/browser-extensions/index.js +53 -0
  47. package/js/browser-extensions/pdfMake.js +3 -0
  48. package/js/browser-extensions/standard-fonts/Courier.js +38 -0
  49. package/js/browser-extensions/standard-fonts/Helvetica.js +38 -0
  50. package/js/browser-extensions/standard-fonts/Symbol.js +23 -0
  51. package/js/browser-extensions/standard-fonts/Times.js +38 -0
  52. package/js/browser-extensions/standard-fonts/ZapfDingbats.js +23 -0
  53. package/js/browser-extensions/virtual-fs-cjs.js +3 -0
  54. package/js/columnCalculator.js +148 -0
  55. package/js/helpers/node.js +98 -0
  56. package/js/helpers/tools.js +40 -0
  57. package/js/helpers/variableType.js +59 -0
  58. package/js/index.js +15 -0
  59. package/js/qrEnc.js +721 -0
  60. package/js/standardPageSizes.js +56 -0
  61. package/js/tableLayouts.js +98 -0
  62. package/js/virtual-fs.js +60 -0
  63. package/package.json +34 -28
  64. package/src/3rd-party/svg-to-pdfkit.js +2 -2
  65. package/src/DocMeasure.js +707 -0
  66. package/src/DocPreprocessor.js +264 -0
  67. package/src/DocumentContext.js +324 -0
  68. package/src/ElementWriter.js +405 -0
  69. package/src/LayoutBuilder.js +997 -0
  70. package/src/Line.js +114 -0
  71. package/src/OutputDocument.js +78 -0
  72. package/src/OutputDocumentServer.js +26 -0
  73. package/src/PDFDocument.js +174 -0
  74. package/src/PageElementWriter.js +160 -0
  75. package/src/PageSize.js +53 -0
  76. package/src/Printer.js +306 -0
  77. package/src/Renderer.js +405 -0
  78. package/src/SVGMeasure.js +79 -0
  79. package/src/StyleContextStack.js +175 -0
  80. package/src/TableProcessor.js +580 -0
  81. package/src/TextBreaker.js +149 -0
  82. package/src/TextDecorator.js +161 -0
  83. package/src/TextInlines.js +223 -0
  84. package/src/URLResolver.js +77 -0
  85. package/src/base.js +61 -0
  86. package/src/browser-extensions/OutputDocumentBrowser.js +117 -0
  87. package/src/browser-extensions/URLBrowserResolver.js +45 -57
  88. package/src/browser-extensions/fonts/Roboto.js +27 -0
  89. package/src/browser-extensions/index.js +55 -0
  90. package/src/browser-extensions/pdfMake.js +1 -329
  91. package/src/browser-extensions/standard-fonts/Courier.js +27 -0
  92. package/src/browser-extensions/standard-fonts/Helvetica.js +27 -0
  93. package/src/browser-extensions/standard-fonts/Symbol.js +21 -0
  94. package/src/browser-extensions/standard-fonts/Times.js +27 -0
  95. package/src/browser-extensions/standard-fonts/ZapfDingbats.js +21 -0
  96. package/src/browser-extensions/virtual-fs-cjs.js +1 -0
  97. package/src/columnCalculator.js +35 -38
  98. package/src/helpers/node.js +110 -0
  99. package/src/helpers/tools.js +39 -0
  100. package/src/helpers/variableType.js +50 -0
  101. package/src/index.js +16 -0
  102. package/src/qrEnc.js +15 -10
  103. package/src/standardPageSizes.js +1 -3
  104. package/src/tableLayouts.js +100 -0
  105. package/src/virtual-fs.js +66 -0
  106. package/standard-fonts/Courier.js +8 -0
  107. package/standard-fonts/Helvetica.js +9 -0
  108. package/standard-fonts/Symbol.js +5 -0
  109. package/standard-fonts/Times.js +8 -0
  110. package/standard-fonts/ZapfDingbats.js +5 -0
  111. package/.idea/codeStyles/Project.xml +0 -7
  112. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  113. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  114. package/.idea/misc.xml +0 -6
  115. package/.idea/modules.xml +0 -8
  116. package/.idea/pdfmake.iml +0 -11
  117. package/.idea/vcs.xml +0 -6
  118. package/src/browser-extensions/virtual-fs.js +0 -55
  119. package/src/docMeasure.js +0 -810
  120. package/src/docPreprocessor.js +0 -255
  121. package/src/documentContext.js +0 -328
  122. package/src/elementWriter.js +0 -333
  123. package/src/fontProvider.js +0 -68
  124. package/src/helpers.js +0 -138
  125. package/src/imageMeasure.js +0 -55
  126. package/src/layoutBuilder.js +0 -989
  127. package/src/line.js +0 -91
  128. package/src/pageElementWriter.js +0 -174
  129. package/src/pdfKitEngine.js +0 -21
  130. package/src/printer.js +0 -710
  131. package/src/styleContextStack.js +0 -138
  132. package/src/svgMeasure.js +0 -70
  133. package/src/tableProcessor.js +0 -584
  134. package/src/textDecorator.js +0 -157
  135. package/src/textTools.js +0 -373
  136. package/src/traversalTracker.js +0 -47
@@ -1,584 +0,0 @@
1
- 'use strict';
2
-
3
- var ColumnCalculator = require('./columnCalculator');
4
- var isFunction = require('./helpers').isFunction;
5
- var isNumber = require('./helpers').isNumber;
6
- var isPositiveInteger = require('./helpers').isPositiveInteger;
7
-
8
- function TableProcessor(tableNode) {
9
- this.tableNode = tableNode;
10
- }
11
-
12
- TableProcessor.prototype.beginTable = function (writer) {
13
- var tableNode;
14
- var availableWidth;
15
- var self = this;
16
-
17
- tableNode = this.tableNode;
18
- this.offsets = tableNode._offsets;
19
- this.layout = tableNode._layout;
20
-
21
- availableWidth = writer.context().availableWidth - this.offsets.total;
22
- ColumnCalculator.buildColumnWidths(tableNode.table.widths, availableWidth, this.offsets.total, tableNode);
23
-
24
- this.tableWidth = tableNode._offsets.total + getTableInnerContentWidth();
25
- this.rowSpanData = prepareRowSpanData();
26
- this.cleanUpRepeatables = false;
27
-
28
- // headersRows and rowsWithoutPageBreak (headerRows + keepWithHeaderRows)
29
- this.headerRows = 0;
30
- this.rowsWithoutPageBreak = 0;
31
-
32
- var headerRows = tableNode.table.headerRows;
33
-
34
- if (isPositiveInteger(headerRows)) {
35
- this.headerRows = headerRows;
36
-
37
- if (this.headerRows > tableNode.table.body.length) {
38
- throw new Error(`Too few rows in the table. Property headerRows requires at least ${this.headerRows}, contains only ${tableNode.table.body.length}`);
39
- }
40
-
41
- this.rowsWithoutPageBreak = this.headerRows;
42
-
43
- const keepWithHeaderRows = tableNode.table.keepWithHeaderRows;
44
-
45
- if (isPositiveInteger(keepWithHeaderRows)) {
46
- this.rowsWithoutPageBreak += keepWithHeaderRows;
47
- }
48
- }
49
-
50
- this.dontBreakRows = tableNode.table.dontBreakRows || false;
51
-
52
- if (this.rowsWithoutPageBreak) {
53
- writer.beginUnbreakableBlock();
54
- }
55
-
56
- // update the border properties of all cells before drawing any lines
57
- prepareCellBorders(this.tableNode.table.body);
58
-
59
- this.drawHorizontalLine(0, writer);
60
-
61
- function getTableInnerContentWidth() {
62
- var width = 0;
63
-
64
- tableNode.table.widths.forEach(function (w) {
65
- width += w._calcWidth;
66
- });
67
-
68
- return width;
69
- }
70
-
71
- function prepareRowSpanData() {
72
- var rsd = [];
73
- var x = 0;
74
- var lastWidth = 0;
75
-
76
- rsd.push({ left: 0, rowSpan: 0 });
77
-
78
- for (var i = 0, l = self.tableNode.table.body[0].length; i < l; i++) {
79
- var paddings = self.layout.paddingLeft(i, self.tableNode) + self.layout.paddingRight(i, self.tableNode);
80
- var lBorder = self.layout.vLineWidth(i, self.tableNode);
81
- lastWidth = paddings + lBorder + self.tableNode.table.widths[i]._calcWidth;
82
- rsd[rsd.length - 1].width = lastWidth;
83
- x += lastWidth;
84
- rsd.push({ left: x, rowSpan: 0, width: 0 });
85
- }
86
-
87
- return rsd;
88
- }
89
-
90
- // Iterate through all cells. If the current cell is the start of a
91
- // rowSpan/colSpan, update the border property of the cells on its
92
- // bottom/right accordingly. This is needed since each iteration of the
93
- // line-drawing loops draws lines for a single cell, not for an entire
94
- // rowSpan/colSpan.
95
- function prepareCellBorders(body) {
96
- for (var rowIndex = 0; rowIndex < body.length; rowIndex++) {
97
- var row = body[rowIndex];
98
-
99
- for (var colIndex = 0; colIndex < row.length; colIndex++) {
100
- var cell = row[colIndex];
101
-
102
- if (cell.border) {
103
- var rowSpan = cell.rowSpan || 1;
104
- var colSpan = cell.colSpan || 1;
105
-
106
- for (var rowOffset = 0; rowOffset < rowSpan; rowOffset++) {
107
- // set left border
108
- if (cell.border[0] !== undefined && rowOffset > 0) {
109
- setBorder(rowIndex + rowOffset, colIndex, 0, cell.border[0]);
110
- }
111
-
112
- // set right border
113
- if (cell.border[2] !== undefined) {
114
- setBorder(rowIndex + rowOffset, colIndex + colSpan - 1, 2, cell.border[2]);
115
- }
116
- }
117
-
118
- for (var colOffset = 0; colOffset < colSpan; colOffset++) {
119
- // set top border
120
- if (cell.border[1] !== undefined && colOffset > 0) {
121
- setBorder(rowIndex, colIndex + colOffset, 1, cell.border[1]);
122
- }
123
-
124
- // set bottom border
125
- if (cell.border[3] !== undefined) {
126
- setBorder(rowIndex + rowSpan - 1, colIndex + colOffset, 3, cell.border[3]);
127
- }
128
- }
129
- }
130
- }
131
- }
132
-
133
- // helper function to set the border for a given cell
134
- function setBorder(rowIndex, colIndex, borderIndex, borderValue) {
135
- var cell = body[rowIndex][colIndex];
136
- cell.border = cell.border || {};
137
- cell.border[borderIndex] = borderValue;
138
- }
139
- }
140
- };
141
-
142
- TableProcessor.prototype.onRowBreak = function (rowIndex, writer) {
143
- var self = this;
144
- return function () {
145
- var offset = self.rowPaddingTop + (!self.headerRows ? self.topLineWidth : 0);
146
- writer.context().availableHeight -= self.reservedAtBottom;
147
- writer.context().moveDown(offset);
148
- };
149
- };
150
-
151
- TableProcessor.prototype.beginRow = function (rowIndex, writer) {
152
- this.topLineWidth = this.layout.hLineWidth(rowIndex, this.tableNode);
153
- this.rowPaddingTop = this.layout.paddingTop(rowIndex, this.tableNode);
154
- this.bottomLineWidth = this.layout.hLineWidth(rowIndex + 1, this.tableNode);
155
- this.rowPaddingBottom = this.layout.paddingBottom(rowIndex, this.tableNode);
156
-
157
- this.rowCallback = this.onRowBreak(rowIndex, writer);
158
- writer.tracker.startTracking('pageChanged', this.rowCallback);
159
- if (this.dontBreakRows) {
160
- writer.beginUnbreakableBlock();
161
- }
162
- this.rowTopY = writer.context().y;
163
- this.reservedAtBottom = this.bottomLineWidth + this.rowPaddingBottom;
164
-
165
- writer.context().availableHeight -= this.reservedAtBottom;
166
-
167
- writer.context().moveDown(this.rowPaddingTop);
168
- };
169
-
170
- TableProcessor.prototype.drawHorizontalLine = function (lineIndex, writer, overrideY) {
171
- var lineWidth = this.layout.hLineWidth(lineIndex, this.tableNode);
172
- if (lineWidth) {
173
- var style = this.layout.hLineStyle(lineIndex, this.tableNode);
174
- var dash;
175
- if (style && style.dash) {
176
- dash = style.dash;
177
- }
178
-
179
- var offset = lineWidth / 2;
180
- var currentLine = null;
181
- var body = this.tableNode.table.body;
182
- var cellAbove;
183
- var currentCell;
184
- var rowCellAbove;
185
-
186
- for (var i = 0, l = this.rowSpanData.length; i < l; i++) {
187
- var data = this.rowSpanData[i];
188
- var shouldDrawLine = !data.rowSpan;
189
- var borderColor = null;
190
-
191
- // draw only if the current cell requires a top border or the cell in the
192
- // row above requires a bottom border
193
- if (shouldDrawLine && i < l - 1) {
194
- var topBorder = false, bottomBorder = false, rowBottomBorder = false;
195
-
196
- // the cell in the row above
197
- if (lineIndex > 0) {
198
- cellAbove = body[lineIndex - 1][i];
199
- bottomBorder = cellAbove.border ? cellAbove.border[3] : this.layout.defaultBorder;
200
- if (bottomBorder && cellAbove.borderColor) {
201
- borderColor = cellAbove.borderColor[3];
202
- }
203
- }
204
-
205
- // the current cell
206
- if (lineIndex < body.length) {
207
- currentCell = body[lineIndex][i];
208
- topBorder = currentCell.border ? currentCell.border[1] : this.layout.defaultBorder;
209
- if (topBorder && borderColor == null && currentCell.borderColor) {
210
- borderColor = currentCell.borderColor[1];
211
- }
212
- }
213
-
214
- shouldDrawLine = topBorder || bottomBorder;
215
- }
216
-
217
- if (cellAbove && cellAbove._rowSpanCurrentOffset) {
218
- rowCellAbove = body[lineIndex - 1 - cellAbove._rowSpanCurrentOffset][i];
219
- rowBottomBorder = rowCellAbove && rowCellAbove.border ? rowCellAbove.border[3] : this.layout.defaultBorder;
220
- if (rowBottomBorder && rowCellAbove && rowCellAbove.borderColor) {
221
- borderColor = rowCellAbove.borderColor[3];
222
- }
223
- }
224
-
225
- if (borderColor == null) {
226
- borderColor = isFunction(this.layout.hLineColor) ? this.layout.hLineColor(lineIndex, this.tableNode, i) : this.layout.hLineColor;
227
- }
228
-
229
- if (!currentLine && shouldDrawLine) {
230
- currentLine = { left: data.left, width: 0 };
231
- }
232
-
233
- if (shouldDrawLine) {
234
- var colSpanIndex = 0;
235
- if (rowCellAbove && rowCellAbove.colSpan && rowBottomBorder) {
236
- while (rowCellAbove.colSpan > colSpanIndex) {
237
- currentLine.width += (this.rowSpanData[i + colSpanIndex++].width || 0);
238
- }
239
- i += colSpanIndex - 1;
240
- } else if (cellAbove && cellAbove.colSpan && bottomBorder) {
241
- while (cellAbove.colSpan > colSpanIndex) {
242
- currentLine.width += (this.rowSpanData[i + colSpanIndex++].width || 0);
243
- }
244
- i += colSpanIndex - 1;
245
- } else if (currentCell && currentCell.colSpan && topBorder) {
246
- while (currentCell.colSpan > colSpanIndex) {
247
- currentLine.width += (this.rowSpanData[i + colSpanIndex++].width || 0);
248
- }
249
- i += colSpanIndex - 1;
250
- } else {
251
- currentLine.width += (this.rowSpanData[i].width || 0);
252
- }
253
- }
254
-
255
- var y = (overrideY || 0) + offset;
256
-
257
-
258
- if (shouldDrawLine) {
259
- if (currentLine && currentLine.width) {
260
- writer.addVector({
261
- type: 'line',
262
- x1: currentLine.left,
263
- x2: currentLine.left + currentLine.width,
264
- y1: y,
265
- y2: y,
266
- lineWidth: lineWidth,
267
- dash: dash,
268
- lineColor: borderColor
269
- }, false, overrideY);
270
- currentLine = null;
271
- borderColor = null;
272
- cellAbove = null;
273
- currentCell = null;
274
- rowCellAbove = null;
275
- }
276
- }
277
- }
278
-
279
- writer.context().moveDown(lineWidth);
280
- }
281
- };
282
-
283
- TableProcessor.prototype.drawVerticalLine = function (x, y0, y1, vLineColIndex, writer, vLineRowIndex, beforeVLineColIndex) {
284
- var width = this.layout.vLineWidth(vLineColIndex, this.tableNode);
285
- if (width === 0) {
286
- return;
287
- }
288
- var style = this.layout.vLineStyle(vLineColIndex, this.tableNode);
289
- var dash;
290
- if (style && style.dash) {
291
- dash = style.dash;
292
- }
293
-
294
- var body = this.tableNode.table.body;
295
- var cellBefore;
296
- var currentCell;
297
- var borderColor;
298
-
299
- // the cell in the col before
300
- if (vLineColIndex > 0) {
301
- cellBefore = body[vLineRowIndex][beforeVLineColIndex];
302
- if (cellBefore && cellBefore.borderColor) {
303
- if (cellBefore.border ? cellBefore.border[2] : this.layout.defaultBorder) {
304
- borderColor = cellBefore.borderColor[2];
305
- }
306
- }
307
- }
308
-
309
- // the current cell
310
- if (borderColor == null && vLineColIndex < body.length) {
311
- currentCell = body[vLineRowIndex][vLineColIndex];
312
- if (currentCell && currentCell.borderColor) {
313
- if (currentCell.border ? currentCell.border[0] : this.layout.defaultBorder) {
314
- borderColor = currentCell.borderColor[0];
315
- }
316
- }
317
- }
318
-
319
- if (borderColor == null && cellBefore && cellBefore._rowSpanCurrentOffset) {
320
- var rowCellBeforeAbove = body[vLineRowIndex - cellBefore._rowSpanCurrentOffset][beforeVLineColIndex];
321
- if (rowCellBeforeAbove.borderColor) {
322
- if (rowCellBeforeAbove.border ? rowCellBeforeAbove.border[2] : this.layout.defaultBorder) {
323
- borderColor = rowCellBeforeAbove.borderColor[2];
324
- }
325
- }
326
- }
327
-
328
- if (borderColor == null && currentCell && currentCell._rowSpanCurrentOffset) {
329
- var rowCurrentCellAbove = body[vLineRowIndex - currentCell._rowSpanCurrentOffset][vLineColIndex];
330
- if (rowCurrentCellAbove.borderColor) {
331
- if (rowCurrentCellAbove.border ? rowCurrentCellAbove.border[2] : this.layout.defaultBorder) {
332
- borderColor = rowCurrentCellAbove.borderColor[2];
333
- }
334
- }
335
- }
336
-
337
- if (borderColor == null) {
338
- borderColor = isFunction(this.layout.vLineColor) ? this.layout.vLineColor(vLineColIndex, this.tableNode, vLineRowIndex) : this.layout.vLineColor;
339
- }
340
- writer.addVector({
341
- type: 'line',
342
- x1: x + width / 2,
343
- x2: x + width / 2,
344
- y1: y0,
345
- y2: y1,
346
- lineWidth: width,
347
- dash: dash,
348
- lineColor: borderColor
349
- }, false, true);
350
- cellBefore = null;
351
- currentCell = null;
352
- borderColor = null;
353
- };
354
-
355
- TableProcessor.prototype.endTable = function (writer) {
356
- if (this.cleanUpRepeatables) {
357
- writer.popFromRepeatables();
358
- }
359
- };
360
-
361
- TableProcessor.prototype.endRow = function (rowIndex, writer, pageBreaks) {
362
- var l, i;
363
- var self = this;
364
- writer.tracker.stopTracking('pageChanged', this.rowCallback);
365
- writer.context().moveDown(this.layout.paddingBottom(rowIndex, this.tableNode));
366
- writer.context().availableHeight += this.reservedAtBottom;
367
-
368
- var endingPage = writer.context().page;
369
- var endingY = writer.context().y;
370
-
371
- var xs = getLineXs();
372
-
373
- var ys = [];
374
-
375
- var hasBreaks = pageBreaks && pageBreaks.length > 0;
376
- var body = this.tableNode.table.body;
377
-
378
- ys.push({
379
- y0: this.rowTopY,
380
- page: hasBreaks ? pageBreaks[0].prevPage : endingPage
381
- });
382
-
383
- if (hasBreaks) {
384
- for (i = 0, l = pageBreaks.length; i < l; i++) {
385
- var pageBreak = pageBreaks[i];
386
- ys[ys.length - 1].y1 = pageBreak.prevY;
387
-
388
- ys.push({ y0: pageBreak.y, page: pageBreak.prevPage + 1 });
389
- }
390
- }
391
-
392
- ys[ys.length - 1].y1 = endingY;
393
-
394
- var skipOrphanePadding = (ys[0].y1 - ys[0].y0 === this.rowPaddingTop);
395
- for (var yi = (skipOrphanePadding ? 1 : 0), yl = ys.length; yi < yl; yi++) {
396
- var willBreak = yi < ys.length - 1;
397
- var rowBreakWithoutHeader = (yi > 0 && !this.headerRows);
398
- var hzLineOffset = rowBreakWithoutHeader ? 0 : this.topLineWidth;
399
- var y1 = ys[yi].y0;
400
- var y2 = ys[yi].y1;
401
-
402
- if (willBreak) {
403
- y2 = y2 + this.rowPaddingBottom;
404
- }
405
-
406
- if (writer.context().page != ys[yi].page) {
407
- writer.context().page = ys[yi].page;
408
-
409
- //TODO: buggy, availableHeight should be updated on every pageChanged event
410
- // TableProcessor should be pageChanged listener, instead of processRow
411
- this.reservedAtBottom = 0;
412
- }
413
-
414
- for (i = 0, l = xs.length; i < l; i++) {
415
- var leftCellBorder = false;
416
- var rightCellBorder = false;
417
- var colIndex = xs[i].index;
418
-
419
- // current cell
420
- if (colIndex < body[rowIndex].length) {
421
- var cell = body[rowIndex][colIndex];
422
- leftCellBorder = cell.border ? cell.border[0] : this.layout.defaultBorder;
423
- rightCellBorder = cell.border ? cell.border[2] : this.layout.defaultBorder;
424
- }
425
-
426
- // before cell
427
- if (colIndex > 0 && !leftCellBorder) {
428
- var cell = body[rowIndex][colIndex - 1];
429
- leftCellBorder = cell.border ? cell.border[2] : this.layout.defaultBorder;
430
- }
431
-
432
- // after cell
433
- if (colIndex + 1 < body[rowIndex].length && !rightCellBorder) {
434
- var cell = body[rowIndex][colIndex + 1];
435
- rightCellBorder = cell.border ? cell.border[0] : this.layout.defaultBorder;
436
- }
437
-
438
- if (leftCellBorder) {
439
- this.drawVerticalLine(xs[i].x, y1 - hzLineOffset, y2 + this.bottomLineWidth, xs[i].index, writer, rowIndex, xs[i - 1] ? xs[i - 1].index : null);
440
- }
441
-
442
- if (i < l - 1) {
443
- var fillColor = body[rowIndex][colIndex].fillColor;
444
- var fillOpacity = body[rowIndex][colIndex].fillOpacity;
445
- if (!fillColor) {
446
- fillColor = isFunction(this.layout.fillColor) ? this.layout.fillColor(rowIndex, this.tableNode, colIndex) : this.layout.fillColor;
447
- }
448
- if (!isNumber(fillOpacity)) {
449
- fillOpacity = isFunction(this.layout.fillOpacity) ? this.layout.fillOpacity(rowIndex, this.tableNode, colIndex) : this.layout.fillOpacity;
450
- }
451
- var overlayPattern = body[rowIndex][colIndex].overlayPattern;
452
- var overlayOpacity = body[rowIndex][colIndex].overlayOpacity;
453
- if (fillColor || overlayPattern) {
454
- var widthLeftBorder = leftCellBorder ? this.layout.vLineWidth(colIndex, this.tableNode) : 0;
455
- var widthRightBorder;
456
- if ((colIndex === 0 || colIndex + 1 == body[rowIndex].length) && !rightCellBorder) {
457
- widthRightBorder = this.layout.vLineWidth(colIndex + 1, this.tableNode);
458
- } else if (rightCellBorder) {
459
- widthRightBorder = this.layout.vLineWidth(colIndex + 1, this.tableNode) / 2;
460
- } else {
461
- widthRightBorder = 0;
462
- }
463
-
464
- var x1f = this.dontBreakRows ? xs[i].x + widthLeftBorder : xs[i].x + (widthLeftBorder / 2);
465
- var y1f = this.dontBreakRows ? y1 : y1 - (hzLineOffset / 2);
466
- var x2f = xs[i + 1].x + widthRightBorder;
467
- var y2f = this.dontBreakRows ? y2 + this.bottomLineWidth : y2 + (this.bottomLineWidth / 2);
468
- var bgWidth = x2f - x1f;
469
- var bgHeight = y2f - y1f;
470
- if (fillColor) {
471
- writer.addVector({
472
- type: 'rect',
473
- x: x1f,
474
- y: y1f,
475
- w: bgWidth,
476
- h: bgHeight,
477
- lineWidth: 0,
478
- color: fillColor,
479
- fillOpacity: fillOpacity,
480
- // mark if we are in an unbreakable block
481
- _isFillColorFromUnbreakable: !!writer.transactionLevel
482
- }, false, true, writer.context().backgroundLength[writer.context().page]);
483
- }
484
-
485
- if (overlayPattern) {
486
- writer.addVector({
487
- type: 'rect',
488
- x: x1f,
489
- y: y1f,
490
- w: bgWidth,
491
- h: bgHeight,
492
- lineWidth: 0,
493
- color: overlayPattern,
494
- fillOpacity: overlayOpacity
495
- }, false, true);
496
- }
497
- }
498
- }
499
- }
500
-
501
- if (willBreak && this.layout.hLineWhenBroken !== false) {
502
- this.drawHorizontalLine(rowIndex + 1, writer, y2);
503
- }
504
- if (rowBreakWithoutHeader && this.layout.hLineWhenBroken !== false) {
505
- this.drawHorizontalLine(rowIndex, writer, y1);
506
- }
507
- }
508
-
509
- writer.context().page = endingPage;
510
- writer.context().y = endingY;
511
-
512
- var row = this.tableNode.table.body[rowIndex];
513
- for (i = 0, l = row.length; i < l; i++) {
514
- if (row[i].rowSpan) {
515
- this.rowSpanData[i].rowSpan = row[i].rowSpan;
516
-
517
- // fix colSpans
518
- if (row[i].colSpan && row[i].colSpan > 1) {
519
- for (var j = 1; j < row[i].rowSpan; j++) {
520
- this.tableNode.table.body[rowIndex + j][i]._colSpan = row[i].colSpan;
521
- }
522
- }
523
- // fix rowSpans
524
- if (row[i].rowSpan && row[i].rowSpan > 1) {
525
- for (var j = 1; j < row[i].rowSpan; j++) {
526
- this.tableNode.table.body[rowIndex + j][i]._rowSpanCurrentOffset = j;
527
- }
528
- }
529
- }
530
-
531
- if (this.rowSpanData[i].rowSpan > 0) {
532
- this.rowSpanData[i].rowSpan--;
533
- }
534
- }
535
-
536
- this.drawHorizontalLine(rowIndex + 1, writer);
537
-
538
- if (this.headerRows && rowIndex === this.headerRows - 1) {
539
- this.headerRepeatable = writer.currentBlockToRepeatable();
540
- }
541
-
542
- if (this.dontBreakRows) {
543
- writer.tracker.auto('pageChanged',
544
- function () {
545
- if (!self.headerRows && self.layout.hLineWhenBroken !== false) {
546
- self.drawHorizontalLine(rowIndex, writer);
547
- }
548
- },
549
- function () {
550
- writer.commitUnbreakableBlock();
551
- }
552
- );
553
- }
554
-
555
- if (this.headerRepeatable && (rowIndex === (this.rowsWithoutPageBreak - 1) || rowIndex === this.tableNode.table.body.length - 1)) {
556
- writer.commitUnbreakableBlock();
557
- writer.pushToRepeatables(this.headerRepeatable);
558
- this.cleanUpRepeatables = true;
559
- this.headerRepeatable = null;
560
- }
561
-
562
- function getLineXs() {
563
- var result = [];
564
- var cols = 0;
565
-
566
- for (var i = 0, l = self.tableNode.table.body[rowIndex].length; i < l; i++) {
567
- if (!cols) {
568
- result.push({ x: self.rowSpanData[i].left, index: i });
569
-
570
- var item = self.tableNode.table.body[rowIndex][i];
571
- cols = (item._colSpan || item.colSpan || 0);
572
- }
573
- if (cols > 0) {
574
- cols--;
575
- }
576
- }
577
-
578
- result.push({ x: self.rowSpanData[self.rowSpanData.length - 1].left, index: self.rowSpanData.length - 1 });
579
-
580
- return result;
581
- }
582
- };
583
-
584
- module.exports = TableProcessor;