pdfmake 0.2.4 → 0.3.0-beta.2

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