pdfmake 0.3.2 → 0.3.4

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 (94) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE +21 -21
  3. package/README.md +75 -78
  4. package/build/fonts/Roboto/Roboto-Italic.ttf +0 -0
  5. package/build/fonts/Roboto/Roboto-Medium.ttf +0 -0
  6. package/build/fonts/Roboto/Roboto-MediumItalic.ttf +0 -0
  7. package/build/fonts/Roboto/Roboto-Regular.ttf +0 -0
  8. package/build/fonts/Roboto.js +27 -0
  9. package/build/pdfmake.js +64813 -64584
  10. package/build/pdfmake.js.map +1 -1
  11. package/build/pdfmake.min.js +2 -2
  12. package/build/pdfmake.min.js.map +1 -1
  13. package/build/standard-fonts/Courier.js +27 -27
  14. package/build/standard-fonts/Helvetica.js +27 -27
  15. package/build/standard-fonts/Symbol.js +21 -21
  16. package/build/standard-fonts/Times.js +27 -27
  17. package/build/standard-fonts/ZapfDingbats.js +21 -21
  18. package/build/vfs_fonts.js +5 -5
  19. package/build-vfs.js +44 -44
  20. package/fonts/Roboto.js +8 -8
  21. package/js/3rd-party/svg-to-pdfkit/source.js +1 -1
  22. package/js/DocMeasure.js +11 -6
  23. package/js/DocumentContext.js +8 -3
  24. package/js/ElementWriter.js +42 -16
  25. package/js/LayoutBuilder.js +144 -78
  26. package/js/Line.js +16 -16
  27. package/js/OutputDocument.js +10 -10
  28. package/js/OutputDocumentServer.js +3 -3
  29. package/js/PDFDocument.js +3 -3
  30. package/js/PageElementWriter.js +15 -9
  31. package/js/Printer.js +28 -28
  32. package/js/Renderer.js +40 -8
  33. package/js/SVGMeasure.js +10 -10
  34. package/js/StyleContextStack.js +74 -51
  35. package/js/TableProcessor.js +14 -0
  36. package/js/TextBreaker.js +17 -17
  37. package/js/TextDecorator.js +12 -3
  38. package/js/TextInlines.js +34 -33
  39. package/js/base.js +4 -4
  40. package/js/browser-extensions/OutputDocumentBrowser.js +24 -24
  41. package/js/columnCalculator.js +2 -2
  42. package/js/helpers/node.js +47 -23
  43. package/js/helpers/variableType.js +18 -18
  44. package/js/qrEnc.js +38 -38
  45. package/js/virtual-fs.js +11 -11
  46. package/package.json +12 -12
  47. package/src/3rd-party/svg-to-pdfkit/LICENSE +9 -9
  48. package/src/3rd-party/svg-to-pdfkit/source.js +2745 -2745
  49. package/src/3rd-party/svg-to-pdfkit.js +3 -3
  50. package/src/DocMeasure.js +745 -738
  51. package/src/DocPreprocessor.js +283 -283
  52. package/src/DocumentContext.js +345 -338
  53. package/src/ElementWriter.js +441 -417
  54. package/src/LayoutBuilder.js +1336 -1258
  55. package/src/Line.js +114 -114
  56. package/src/OutputDocument.js +64 -64
  57. package/src/OutputDocumentServer.js +32 -32
  58. package/src/PDFDocument.js +174 -174
  59. package/src/PageElementWriter.js +187 -179
  60. package/src/PageSize.js +53 -53
  61. package/src/Printer.js +306 -306
  62. package/src/Renderer.js +445 -409
  63. package/src/SVGMeasure.js +109 -109
  64. package/src/StyleContextStack.js +208 -179
  65. package/src/TableProcessor.js +620 -602
  66. package/src/TextBreaker.js +168 -168
  67. package/src/TextDecorator.js +175 -161
  68. package/src/TextInlines.js +224 -223
  69. package/src/URLResolver.js +43 -43
  70. package/src/base.js +70 -70
  71. package/src/browser-extensions/OutputDocumentBrowser.js +80 -80
  72. package/src/browser-extensions/fonts/Roboto.js +27 -27
  73. package/src/browser-extensions/index.js +55 -55
  74. package/src/browser-extensions/pdfMake.js +1 -1
  75. package/src/browser-extensions/standard-fonts/Courier.js +27 -27
  76. package/src/browser-extensions/standard-fonts/Helvetica.js +27 -27
  77. package/src/browser-extensions/standard-fonts/Symbol.js +21 -21
  78. package/src/browser-extensions/standard-fonts/Times.js +27 -27
  79. package/src/browser-extensions/standard-fonts/ZapfDingbats.js +21 -21
  80. package/src/browser-extensions/virtual-fs-cjs.js +1 -1
  81. package/src/columnCalculator.js +154 -154
  82. package/src/helpers/node.js +134 -110
  83. package/src/helpers/tools.js +44 -44
  84. package/src/helpers/variableType.js +50 -50
  85. package/src/index.js +16 -16
  86. package/src/qrEnc.js +796 -796
  87. package/src/standardPageSizes.js +52 -52
  88. package/src/tableLayouts.js +100 -100
  89. package/src/virtual-fs.js +66 -66
  90. package/standard-fonts/Courier.js +8 -8
  91. package/standard-fonts/Helvetica.js +8 -8
  92. package/standard-fonts/Symbol.js +5 -5
  93. package/standard-fonts/Times.js +8 -8
  94. package/standard-fonts/ZapfDingbats.js +5 -5
@@ -1,179 +1,187 @@
1
- import ElementWriter from './ElementWriter';
2
- import { normalizePageSize, normalizePageMargin } from './PageSize';
3
- import DocumentContext from './DocumentContext';
4
-
5
- /**
6
- * An extended ElementWriter which can handle:
7
- * - page-breaks (it adds new pages when there's not enough space left),
8
- * - repeatable fragments (like table-headers, which are repeated everytime
9
- * a page-break occurs)
10
- * - transactions (used for unbreakable-blocks when we want to make sure
11
- * whole block will be rendered on the same page)
12
- */
13
- class PageElementWriter extends ElementWriter {
14
-
15
- /**
16
- * @param {DocumentContext} context
17
- */
18
- constructor(context) {
19
- super(context);
20
- this.transactionLevel = 0;
21
- this.repeatables = [];
22
- }
23
-
24
- addLine(line, dontUpdateContextPosition, index) {
25
- return this._fitOnPage(() => super.addLine(line, dontUpdateContextPosition, index));
26
- }
27
-
28
- addImage(image, index) {
29
- return this._fitOnPage(() => super.addImage(image, index));
30
- }
31
-
32
- addCanvas(image, index) {
33
- return this._fitOnPage(() => super.addCanvas(image, index));
34
- }
35
-
36
- addSVG(image, index) {
37
- return this._fitOnPage(() => super.addSVG(image, index));
38
- }
39
-
40
- addQr(qr, index) {
41
- return this._fitOnPage(() => super.addQr(qr, index));
42
- }
43
-
44
- addAttachment(attachment, index) {
45
- return this._fitOnPage(() => super.addAttachment(attachment, index));
46
- }
47
-
48
- addVector(vector, ignoreContextX, ignoreContextY, index, forcePage) {
49
- return super.addVector(vector, ignoreContextX, ignoreContextY, index, forcePage);
50
- }
51
-
52
- beginClip(width, height) {
53
- return super.beginClip(width, height);
54
- }
55
-
56
- endClip() {
57
- return super.endClip();
58
- }
59
-
60
- addFragment(fragment, useBlockXOffset, useBlockYOffset, dontUpdateContextPosition) {
61
- return this._fitOnPage(() => super.addFragment(fragment, useBlockXOffset, useBlockYOffset, dontUpdateContextPosition));
62
- }
63
-
64
- moveToNextPage(pageOrientation) {
65
- let nextPage = this.context().moveToNextPage(pageOrientation);
66
-
67
- // moveToNextPage is called multiple times for table, because is called for each column
68
- // and repeatables are inserted only in the first time. If columns are used, is needed
69
- // call for table in first column and then for table in the second column (is other repeatables).
70
- this.repeatables.forEach(function (rep) {
71
- if (rep.insertedOnPages[this.context().page] === undefined) {
72
- rep.insertedOnPages[this.context().page] = true;
73
- this.addFragment(rep, true);
74
- } else {
75
- this.context().moveDown(rep.height);
76
- }
77
- }, this);
78
-
79
- this.emit('pageChanged', {
80
- prevPage: nextPage.prevPage,
81
- prevY: nextPage.prevY,
82
- y: this.context().y
83
- });
84
- }
85
-
86
- addPage(pageSize, pageOrientation, pageMargin, customProperties = {}) {
87
- let prevPage = this.page;
88
- let prevY = this.y;
89
-
90
- this.context().addPage(normalizePageSize(pageSize, pageOrientation), normalizePageMargin(pageMargin), customProperties);
91
-
92
- this.emit('pageChanged', {
93
- prevPage: prevPage,
94
- prevY: prevY,
95
- y: this.context().y
96
- });
97
- }
98
-
99
- beginUnbreakableBlock(width, height) {
100
- if (this.transactionLevel++ === 0) {
101
- this.originalX = this.context().x;
102
- this.pushContext(width, height);
103
- }
104
- }
105
-
106
- commitUnbreakableBlock(forcedX, forcedY) {
107
- if (--this.transactionLevel === 0) {
108
- let unbreakableContext = this.context();
109
- this.popContext();
110
-
111
- let nbPages = unbreakableContext.pages.length;
112
- if (nbPages > 0) {
113
- // no support for multi-page unbreakableBlocks
114
- let fragment = unbreakableContext.pages[0];
115
- fragment.xOffset = forcedX;
116
- fragment.yOffset = forcedY;
117
-
118
- //TODO: vectors can influence height in some situations
119
- if (nbPages > 1) {
120
- // on out-of-context blocs (headers, footers, background) height should be the whole DocumentContext height
121
- if (forcedX !== undefined || forcedY !== undefined) {
122
- fragment.height = unbreakableContext.getCurrentPage().pageSize.height - unbreakableContext.pageMargins.top - unbreakableContext.pageMargins.bottom;
123
- } else {
124
- fragment.height = this.context().getCurrentPage().pageSize.height - this.context().pageMargins.top - this.context().pageMargins.bottom;
125
- for (let i = 0, l = this.repeatables.length; i < l; i++) {
126
- fragment.height -= this.repeatables[i].height;
127
- }
128
- }
129
- } else {
130
- fragment.height = unbreakableContext.y;
131
- }
132
-
133
- if (forcedX !== undefined || forcedY !== undefined) {
134
- super.addFragment(fragment, true, true, true);
135
- } else {
136
- this.addFragment(fragment);
137
- }
138
- }
139
- }
140
- }
141
-
142
- currentBlockToRepeatable() {
143
- let unbreakableContext = this.context();
144
- let rep = { items: [] };
145
-
146
- unbreakableContext.pages[0].items.forEach(item => {
147
- rep.items.push(item);
148
- });
149
-
150
- rep.xOffset = this.originalX;
151
-
152
- //TODO: vectors can influence height in some situations
153
- rep.height = unbreakableContext.y;
154
-
155
- rep.insertedOnPages = [];
156
-
157
- return rep;
158
- }
159
-
160
- pushToRepeatables(rep) {
161
- this.repeatables.push(rep);
162
- }
163
-
164
- popFromRepeatables() {
165
- this.repeatables.pop();
166
- }
167
-
168
- _fitOnPage(addFct) {
169
- let position = addFct();
170
- if (!position) {
171
- this.moveToNextPage();
172
- position = addFct();
173
- }
174
- return position;
175
- }
176
-
177
- }
178
-
179
- export default PageElementWriter;
1
+ import ElementWriter from './ElementWriter';
2
+ import { normalizePageSize, normalizePageMargin } from './PageSize';
3
+ import DocumentContext from './DocumentContext';
4
+
5
+ /**
6
+ * An extended ElementWriter which can handle:
7
+ * - page-breaks (it adds new pages when there's not enough space left),
8
+ * - repeatable fragments (like table-headers, which are repeated everytime
9
+ * a page-break occurs)
10
+ * - transactions (used for unbreakable-blocks when we want to make sure
11
+ * whole block will be rendered on the same page)
12
+ */
13
+ class PageElementWriter extends ElementWriter {
14
+
15
+ /**
16
+ * @param {DocumentContext} context
17
+ */
18
+ constructor(context) {
19
+ super(context);
20
+ this.transactionLevel = 0;
21
+ this.repeatables = [];
22
+ }
23
+
24
+ addLine(line, dontUpdateContextPosition, index) {
25
+ return this._fitOnPage(() => super.addLine(line, dontUpdateContextPosition, index));
26
+ }
27
+
28
+ addImage(image, index) {
29
+ return this._fitOnPage(() => super.addImage(image, index));
30
+ }
31
+
32
+ addCanvas(image, index) {
33
+ return this._fitOnPage(() => super.addCanvas(image, index));
34
+ }
35
+
36
+ addSVG(image, index) {
37
+ return this._fitOnPage(() => super.addSVG(image, index));
38
+ }
39
+
40
+ addQr(qr, index) {
41
+ return this._fitOnPage(() => super.addQr(qr, index));
42
+ }
43
+
44
+ addAttachment(attachment, index) {
45
+ return this._fitOnPage(() => super.addAttachment(attachment, index));
46
+ }
47
+
48
+ addVector(vector, ignoreContextX, ignoreContextY, index, forcePage) {
49
+ return super.addVector(vector, ignoreContextX, ignoreContextY, index, forcePage);
50
+ }
51
+
52
+ beginClip(width, height) {
53
+ return super.beginClip(width, height);
54
+ }
55
+
56
+ endClip() {
57
+ return super.endClip();
58
+ }
59
+
60
+ beginVerticalAlignment(verticalAlignment) {
61
+ return super.beginVerticalAlignment(verticalAlignment);
62
+ }
63
+
64
+ endVerticalAlignment(verticalAlignment) {
65
+ return super.endVerticalAlignment(verticalAlignment);
66
+ }
67
+
68
+ addFragment(fragment, useBlockXOffset, useBlockYOffset, dontUpdateContextPosition) {
69
+ return this._fitOnPage(() => super.addFragment(fragment, useBlockXOffset, useBlockYOffset, dontUpdateContextPosition));
70
+ }
71
+
72
+ moveToNextPage(pageOrientation) {
73
+ let nextPage = this.context().moveToNextPage(pageOrientation);
74
+
75
+ // moveToNextPage is called multiple times for table, because is called for each column
76
+ // and repeatables are inserted only in the first time. If columns are used, is needed
77
+ // call for table in first column and then for table in the second column (is other repeatables).
78
+ this.repeatables.forEach(function (rep) {
79
+ if (rep.insertedOnPages[this.context().page] === undefined) {
80
+ rep.insertedOnPages[this.context().page] = true;
81
+ this.addFragment(rep, true);
82
+ } else {
83
+ this.context().moveDown(rep.height);
84
+ }
85
+ }, this);
86
+
87
+ this.emit('pageChanged', {
88
+ prevPage: nextPage.prevPage,
89
+ prevY: nextPage.prevY,
90
+ y: this.context().y
91
+ });
92
+ }
93
+
94
+ addPage(pageSize, pageOrientation, pageMargin, customProperties = {}) {
95
+ let prevPage = this.page;
96
+ let prevY = this.y;
97
+
98
+ this.context().addPage(normalizePageSize(pageSize, pageOrientation), normalizePageMargin(pageMargin), customProperties);
99
+
100
+ this.emit('pageChanged', {
101
+ prevPage: prevPage,
102
+ prevY: prevY,
103
+ y: this.context().y
104
+ });
105
+ }
106
+
107
+ beginUnbreakableBlock(width, height) {
108
+ if (this.transactionLevel++ === 0) {
109
+ this.originalX = this.context().x;
110
+ this.pushContext(width, height);
111
+ }
112
+ }
113
+
114
+ commitUnbreakableBlock(forcedX, forcedY) {
115
+ if (--this.transactionLevel === 0) {
116
+ let unbreakableContext = this.context();
117
+ this.popContext();
118
+
119
+ let nbPages = unbreakableContext.pages.length;
120
+ if (nbPages > 0) {
121
+ // no support for multi-page unbreakableBlocks
122
+ let fragment = unbreakableContext.pages[0];
123
+ fragment.xOffset = forcedX;
124
+ fragment.yOffset = forcedY;
125
+
126
+ //TODO: vectors can influence height in some situations
127
+ if (nbPages > 1) {
128
+ // on out-of-context blocs (headers, footers, background) height should be the whole DocumentContext height
129
+ if (forcedX !== undefined || forcedY !== undefined) {
130
+ fragment.height = unbreakableContext.getCurrentPage().pageSize.height - unbreakableContext.pageMargins.top - unbreakableContext.pageMargins.bottom;
131
+ } else {
132
+ fragment.height = this.context().getCurrentPage().pageSize.height - this.context().pageMargins.top - this.context().pageMargins.bottom;
133
+ for (let i = 0, l = this.repeatables.length; i < l; i++) {
134
+ fragment.height -= this.repeatables[i].height;
135
+ }
136
+ }
137
+ } else {
138
+ fragment.height = unbreakableContext.y;
139
+ }
140
+
141
+ if (forcedX !== undefined || forcedY !== undefined) {
142
+ super.addFragment(fragment, true, true, true);
143
+ } else {
144
+ this.addFragment(fragment);
145
+ }
146
+ }
147
+ }
148
+ }
149
+
150
+ currentBlockToRepeatable() {
151
+ let unbreakableContext = this.context();
152
+ let rep = { items: [] };
153
+
154
+ unbreakableContext.pages[0].items.forEach(item => {
155
+ rep.items.push(item);
156
+ });
157
+
158
+ rep.xOffset = this.originalX;
159
+
160
+ //TODO: vectors can influence height in some situations
161
+ rep.height = unbreakableContext.y;
162
+
163
+ rep.insertedOnPages = [];
164
+
165
+ return rep;
166
+ }
167
+
168
+ pushToRepeatables(rep) {
169
+ this.repeatables.push(rep);
170
+ }
171
+
172
+ popFromRepeatables() {
173
+ this.repeatables.pop();
174
+ }
175
+
176
+ _fitOnPage(addFct) {
177
+ let position = addFct();
178
+ if (!position) {
179
+ this.moveToNextPage();
180
+ position = addFct();
181
+ }
182
+ return position;
183
+ }
184
+
185
+ }
186
+
187
+ export default PageElementWriter;
package/src/PageSize.js CHANGED
@@ -1,53 +1,53 @@
1
- import sizes from './standardPageSizes';
2
- import { isString, isNumber } from './helpers/variableType';
3
-
4
- export function normalizePageSize(pageSize, pageOrientation) {
5
- function isNeedSwapPageSizes(pageOrientation) {
6
- if (isString(pageOrientation)) {
7
- pageOrientation = pageOrientation.toLowerCase();
8
- return ((pageOrientation === 'portrait') && (size.width > size.height)) ||
9
- ((pageOrientation === 'landscape') && (size.width < size.height));
10
- }
11
- return false;
12
- }
13
-
14
- function pageSizeToWidthAndHeight(pageSize) {
15
- if (isString(pageSize)) {
16
- let size = sizes[pageSize.toUpperCase()];
17
- if (!size) {
18
- throw new Error(`Page size ${pageSize} not recognized`);
19
- }
20
- return { width: size[0], height: size[1] };
21
- }
22
-
23
- return pageSize;
24
- }
25
-
26
- // if pageSize.height is set to auto, set the height to infinity so there are no page breaks.
27
- if (pageSize && pageSize.height === 'auto') {
28
- pageSize.height = Infinity;
29
- }
30
-
31
- let size = pageSizeToWidthAndHeight(pageSize || 'A4');
32
- if (isNeedSwapPageSizes(pageOrientation)) { // swap page sizes
33
- size = { width: size.height, height: size.width };
34
- }
35
- size.orientation = size.width > size.height ? 'landscape' : 'portrait';
36
- return size;
37
- }
38
-
39
- export function normalizePageMargin(margin) {
40
- if (isNumber(margin)) {
41
- margin = { left: margin, right: margin, top: margin, bottom: margin };
42
- } else if (Array.isArray(margin)) {
43
- if (margin.length === 2) {
44
- margin = { left: margin[0], top: margin[1], right: margin[0], bottom: margin[1] };
45
- } else if (margin.length === 4) {
46
- margin = { left: margin[0], top: margin[1], right: margin[2], bottom: margin[3] };
47
- } else {
48
- throw new Error('Invalid pageMargins definition');
49
- }
50
- }
51
-
52
- return margin;
53
- }
1
+ import sizes from './standardPageSizes';
2
+ import { isString, isNumber } from './helpers/variableType';
3
+
4
+ export function normalizePageSize(pageSize, pageOrientation) {
5
+ function isNeedSwapPageSizes(pageOrientation) {
6
+ if (isString(pageOrientation)) {
7
+ pageOrientation = pageOrientation.toLowerCase();
8
+ return ((pageOrientation === 'portrait') && (size.width > size.height)) ||
9
+ ((pageOrientation === 'landscape') && (size.width < size.height));
10
+ }
11
+ return false;
12
+ }
13
+
14
+ function pageSizeToWidthAndHeight(pageSize) {
15
+ if (isString(pageSize)) {
16
+ let size = sizes[pageSize.toUpperCase()];
17
+ if (!size) {
18
+ throw new Error(`Page size ${pageSize} not recognized`);
19
+ }
20
+ return { width: size[0], height: size[1] };
21
+ }
22
+
23
+ return pageSize;
24
+ }
25
+
26
+ // if pageSize.height is set to auto, set the height to infinity so there are no page breaks.
27
+ if (pageSize && pageSize.height === 'auto') {
28
+ pageSize.height = Infinity;
29
+ }
30
+
31
+ let size = pageSizeToWidthAndHeight(pageSize || 'A4');
32
+ if (isNeedSwapPageSizes(pageOrientation)) { // swap page sizes
33
+ size = { width: size.height, height: size.width };
34
+ }
35
+ size.orientation = size.width > size.height ? 'landscape' : 'portrait';
36
+ return size;
37
+ }
38
+
39
+ export function normalizePageMargin(margin) {
40
+ if (isNumber(margin)) {
41
+ margin = { left: margin, right: margin, top: margin, bottom: margin };
42
+ } else if (Array.isArray(margin)) {
43
+ if (margin.length === 2) {
44
+ margin = { left: margin[0], top: margin[1], right: margin[0], bottom: margin[1] };
45
+ } else if (margin.length === 4) {
46
+ margin = { left: margin[0], top: margin[1], right: margin[2], bottom: margin[3] };
47
+ } else {
48
+ throw new Error('Invalid pageMargins definition');
49
+ }
50
+ }
51
+
52
+ return margin;
53
+ }