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
package/src/SVGMeasure.js CHANGED
@@ -1,109 +1,109 @@
1
- import { XmlDocument } from "xmldoc";
2
- import { isString } from './helpers/variableType';
3
-
4
- /**
5
- * Strip unit postfix, parse number, but return undefined instead of NaN for bad input
6
- *
7
- * @param {string} textVal
8
- * @returns {?number}
9
- */
10
- const stripUnits = textVal => {
11
- let n = parseFloat(textVal);
12
- if (typeof n !== 'number' || isNaN(n)) {
13
- return undefined;
14
- }
15
- return n;
16
- };
17
-
18
- /**
19
- * Make sure it's valid XML and the root tag is <svg/>, returns xmldoc DOM
20
- *
21
- * @param {string} svgString
22
- * @returns {object}
23
- */
24
- const parseSVG = (svgString) => {
25
- let doc;
26
-
27
- try {
28
- doc = new XmlDocument(svgString);
29
- } catch (err) {
30
- throw new Error('Invalid svg document (' + err + ')');
31
- }
32
-
33
- if (doc.name !== "svg") {
34
- throw new Error('Invalid svg document (expected <svg>)');
35
- }
36
-
37
- return doc;
38
- };
39
-
40
- class SVGMeasure {
41
- constructor() {
42
-
43
- }
44
-
45
- measureSVG(svg) {
46
- let width, height, viewBox;
47
-
48
- if (isString(svg)) {
49
- let doc = parseSVG(svg);
50
-
51
- width = doc.attr.width;
52
- height = doc.attr.height;
53
- viewBox = doc.attr.viewBox;
54
- } else if (typeof SVGElement !== 'undefined' && svg instanceof SVGElement && typeof getComputedStyle === 'function') {
55
- width = svg.getAttribute("width");
56
- height = svg.getAttribute("height");
57
- viewBox = svg.getAttribute("viewBox");
58
- } else {
59
- throw new Error('Invalid SVG document');
60
- }
61
-
62
- let docWidth = stripUnits(width);
63
- let docHeight = stripUnits(height);
64
-
65
- if ((docWidth === undefined || docHeight === undefined) && typeof viewBox === 'string') {
66
- let viewBoxParts = viewBox.split(/[,\s]+/);
67
- if (viewBoxParts.length !== 4) {
68
- throw new Error("Unexpected svg viewBox format, should have 4 entries but found: '" + viewBox + "'");
69
- }
70
- if (docWidth === undefined) {
71
- docWidth = stripUnits(viewBoxParts[2]);
72
- }
73
- if (docHeight === undefined) {
74
- docHeight = stripUnits(viewBoxParts[3]);
75
- }
76
- }
77
-
78
- return {
79
- width: docWidth,
80
- height: docHeight
81
- };
82
- }
83
-
84
- writeDimensions(svg, dimensions) {
85
- if (isString(svg)) {
86
- let doc = parseSVG(svg);
87
-
88
- if (typeof doc.attr.viewBox !== 'string') {
89
- doc.attr.viewBox = `0 0 ${stripUnits(doc.attr.width)} ${stripUnits(doc.attr.height)}`;
90
- }
91
-
92
- doc.attr.width = "" + dimensions.width;
93
- doc.attr.height = "" + dimensions.height;
94
-
95
- return doc.toString();
96
- }
97
-
98
- if (!svg.hasAttribute('viewBox')) {
99
- svg.setAttribute('viewBox', `0 0 ${stripUnits(svg.getAttribute('width'))} ${stripUnits(svg.getAttribute('height'))}`);
100
- }
101
-
102
- svg.setAttribute('width', "" + dimensions.width);
103
- svg.setAttribute('height', "" + dimensions.height);
104
-
105
- return svg;
106
- }
107
- }
108
-
109
- export default SVGMeasure;
1
+ import { XmlDocument } from "xmldoc";
2
+ import { isString } from './helpers/variableType';
3
+
4
+ /**
5
+ * Strip unit postfix, parse number, but return undefined instead of NaN for bad input
6
+ *
7
+ * @param {string} textVal
8
+ * @returns {?number}
9
+ */
10
+ const stripUnits = textVal => {
11
+ let n = parseFloat(textVal);
12
+ if (typeof n !== 'number' || isNaN(n)) {
13
+ return undefined;
14
+ }
15
+ return n;
16
+ };
17
+
18
+ /**
19
+ * Make sure it's valid XML and the root tag is <svg/>, returns xmldoc DOM
20
+ *
21
+ * @param {string} svgString
22
+ * @returns {object}
23
+ */
24
+ const parseSVG = (svgString) => {
25
+ let doc;
26
+
27
+ try {
28
+ doc = new XmlDocument(svgString);
29
+ } catch (err) {
30
+ throw new Error('Invalid svg document (' + err + ')');
31
+ }
32
+
33
+ if (doc.name !== "svg") {
34
+ throw new Error('Invalid svg document (expected <svg>)');
35
+ }
36
+
37
+ return doc;
38
+ };
39
+
40
+ class SVGMeasure {
41
+ constructor() {
42
+
43
+ }
44
+
45
+ measureSVG(svg) {
46
+ let width, height, viewBox;
47
+
48
+ if (isString(svg)) {
49
+ let doc = parseSVG(svg);
50
+
51
+ width = doc.attr.width;
52
+ height = doc.attr.height;
53
+ viewBox = doc.attr.viewBox;
54
+ } else if (typeof SVGElement !== 'undefined' && svg instanceof SVGElement && typeof getComputedStyle === 'function') {
55
+ width = svg.getAttribute("width");
56
+ height = svg.getAttribute("height");
57
+ viewBox = svg.getAttribute("viewBox");
58
+ } else {
59
+ throw new Error('Invalid SVG document');
60
+ }
61
+
62
+ let docWidth = stripUnits(width);
63
+ let docHeight = stripUnits(height);
64
+
65
+ if ((docWidth === undefined || docHeight === undefined) && typeof viewBox === 'string') {
66
+ let viewBoxParts = viewBox.split(/[,\s]+/);
67
+ if (viewBoxParts.length !== 4) {
68
+ throw new Error("Unexpected svg viewBox format, should have 4 entries but found: '" + viewBox + "'");
69
+ }
70
+ if (docWidth === undefined) {
71
+ docWidth = stripUnits(viewBoxParts[2]);
72
+ }
73
+ if (docHeight === undefined) {
74
+ docHeight = stripUnits(viewBoxParts[3]);
75
+ }
76
+ }
77
+
78
+ return {
79
+ width: docWidth,
80
+ height: docHeight
81
+ };
82
+ }
83
+
84
+ writeDimensions(svg, dimensions) {
85
+ if (isString(svg)) {
86
+ let doc = parseSVG(svg);
87
+
88
+ if (typeof doc.attr.viewBox !== 'string') {
89
+ doc.attr.viewBox = `0 0 ${stripUnits(doc.attr.width)} ${stripUnits(doc.attr.height)}`;
90
+ }
91
+
92
+ doc.attr.width = "" + dimensions.width;
93
+ doc.attr.height = "" + dimensions.height;
94
+
95
+ return doc.toString();
96
+ }
97
+
98
+ if (!svg.hasAttribute('viewBox')) {
99
+ svg.setAttribute('viewBox', `0 0 ${stripUnits(svg.getAttribute('width'))} ${stripUnits(svg.getAttribute('height'))}`);
100
+ }
101
+
102
+ svg.setAttribute('width', "" + dimensions.width);
103
+ svg.setAttribute('height', "" + dimensions.height);
104
+
105
+ return svg;
106
+ }
107
+ }
108
+
109
+ export default SVGMeasure;
@@ -1,179 +1,208 @@
1
- import { isString, isValue } from './helpers/variableType';
2
-
3
- /**
4
- * Used for style inheritance and style overrides
5
- */
6
- class StyleContextStack {
7
-
8
- /**
9
- * @param {object} styleDictionary named styles dictionary
10
- * @param {object} defaultStyle optional default style definition
11
- */
12
- constructor(styleDictionary, defaultStyle = {}) {
13
- this.styleDictionary = styleDictionary;
14
- this.defaultStyle = defaultStyle;
15
- this.styleOverrides = [];
16
- }
17
-
18
- /**
19
- * Creates cloned version of current stack
20
- *
21
- * @returns {StyleContextStack} current stack snapshot
22
- */
23
- clone() {
24
- let stack = new StyleContextStack(this.styleDictionary, this.defaultStyle);
25
-
26
- this.styleOverrides.forEach(item => {
27
- stack.styleOverrides.push(item);
28
- });
29
-
30
- return stack;
31
- }
32
-
33
- /**
34
- * Pushes style-name or style-overrides-object onto the stack for future evaluation
35
- *
36
- * @param {string|object} styleNameOrOverride style-name (referring to styleDictionary) or
37
- * a new dictionary defining overriding properties
38
- */
39
- push(styleNameOrOverride) {
40
- this.styleOverrides.push(styleNameOrOverride);
41
- }
42
-
43
- /**
44
- * Removes last style-name or style-overrides-object from the stack
45
- *
46
- * @param {number} howMany optional number of elements to be popped (if not specified,
47
- * one element will be removed from the stack)
48
- */
49
- pop(howMany = 1) {
50
- while (howMany-- > 0) {
51
- this.styleOverrides.pop();
52
- }
53
- }
54
-
55
- /**
56
- * Creates a set of named styles or/and a style-overrides-object based on the item,
57
- * pushes those elements onto the stack for future evaluation and returns the number
58
- * of elements pushed, so they can be easily popped then.
59
- *
60
- * @param {object} item - an object with optional style property and/or style overrides
61
- * @returns {number} the number of items pushed onto the stack
62
- */
63
- autopush(item) {
64
- if (isString(item)) {
65
- return 0;
66
- }
67
-
68
- if (typeof item.section !== 'undefined') { // section node not support style overrides
69
- return 0;
70
- }
71
-
72
- let styleNames = [];
73
-
74
- if (item.style) {
75
- if (Array.isArray(item.style)) {
76
- styleNames = item.style;
77
- } else {
78
- styleNames = [item.style];
79
- }
80
- }
81
-
82
- for (let i = 0, l = styleNames.length; i < l; i++) {
83
- this.push(styleNames[i]);
84
- }
85
-
86
- // rather than spend significant time making a styleOverrideObject, just add item
87
- this.push(item);
88
- return styleNames.length + 1;
89
- }
90
-
91
- /**
92
- * Automatically pushes elements onto the stack, using autopush based on item,
93
- * executes callback and then pops elements back. Returns value returned by callback
94
- *
95
- * @param {object} item - an object with optional style property and/or style overrides
96
- * @param {Function} callback to be called between autopush and pop
97
- * @returns {object} value returned by callback
98
- */
99
- auto(item, callback) {
100
- let pushedItems = this.autopush(item);
101
- let result = callback();
102
-
103
- if (pushedItems > 0) {
104
- this.pop(pushedItems);
105
- }
106
-
107
- return result;
108
- }
109
-
110
- /**
111
- * Evaluates stack and returns value of a named property
112
- *
113
- * @param {string} property - property name
114
- * @returns {?any} property value or null if not found
115
- */
116
- getProperty(property) {
117
- if (this.styleOverrides) {
118
- for (let i = this.styleOverrides.length - 1; i >= 0; i--) {
119
- let item = this.styleOverrides[i];
120
-
121
- if (isString(item)) { // named-style-override
122
- let style = this.styleDictionary[item];
123
- if (style && isValue(style[property])) {
124
- return style[property];
125
- }
126
- } else if (isValue(item[property])) { // style-overrides-object
127
- return item[property];
128
- }
129
- }
130
- }
131
-
132
- return this.defaultStyle && this.defaultStyle[property];
133
- }
134
-
135
- /**
136
- * @param {object} item
137
- * @param {StyleContextStack} styleContextStack
138
- * @param {string} property
139
- * @param {any} defaultValue
140
- * @returns {any}
141
- */
142
- static getStyleProperty(item, styleContextStack, property, defaultValue) {
143
- let value;
144
-
145
- if (isValue(item[property])) { // item defines this property
146
- return item[property];
147
- }
148
-
149
- if (!styleContextStack) {
150
- return defaultValue;
151
- }
152
-
153
- styleContextStack.auto(item, () => {
154
- value = styleContextStack.getProperty(property);
155
- });
156
-
157
- return isValue(value) ? value : defaultValue;
158
- }
159
-
160
- /**
161
- * @param {object} source
162
- * @param {object} destination
163
- * @returns {object}
164
- */
165
- static copyStyle(source = {}, destination = {}) {
166
- // TODO: default style to source
167
-
168
- for (let key in source) {
169
- if (key != 'text' && source.hasOwnProperty(key)) {
170
- destination[key] = source[key];
171
- }
172
- }
173
-
174
- return destination;
175
- }
176
-
177
- }
178
-
179
- export default StyleContextStack;
1
+ import { isString, isValue } from './helpers/variableType';
2
+
3
+ /**
4
+ * Used for style inheritance and style overrides
5
+ */
6
+ class StyleContextStack {
7
+
8
+ /**
9
+ * @param {object} styleDictionary named styles dictionary
10
+ * @param {object} defaultStyle optional default style definition
11
+ */
12
+ constructor(styleDictionary, defaultStyle = {}) {
13
+ this.styleDictionary = styleDictionary;
14
+ this.defaultStyle = defaultStyle;
15
+ this.styleOverrides = [];
16
+ }
17
+
18
+ /**
19
+ * Creates cloned version of current stack
20
+ *
21
+ * @returns {StyleContextStack} current stack snapshot
22
+ */
23
+ clone() {
24
+ let stack = new StyleContextStack(this.styleDictionary, this.defaultStyle);
25
+
26
+ this.styleOverrides.forEach(item => {
27
+ stack.styleOverrides.push(item);
28
+ });
29
+
30
+ return stack;
31
+ }
32
+
33
+ /**
34
+ * Pushes style-name or style-overrides-object onto the stack for future evaluation
35
+ *
36
+ * @param {string|object} styleNameOrOverride style-name (referring to styleDictionary) or
37
+ * a new dictionary defining overriding properties
38
+ */
39
+ push(styleNameOrOverride) {
40
+ this.styleOverrides.push(styleNameOrOverride);
41
+ }
42
+
43
+ /**
44
+ * Removes last style-name or style-overrides-object from the stack
45
+ *
46
+ * @param {number} howMany optional number of elements to be popped (if not specified,
47
+ * one element will be removed from the stack)
48
+ */
49
+ pop(howMany = 1) {
50
+ while (howMany-- > 0) {
51
+ this.styleOverrides.pop();
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Creates a set of named styles or/and a style-overrides-object based on the item,
57
+ * pushes those elements onto the stack for future evaluation and returns the number
58
+ * of elements pushed, so they can be easily popped then.
59
+ *
60
+ * @param {object} item - an object with optional style property and/or style overrides
61
+ * @returns {number} the number of items pushed onto the stack
62
+ */
63
+ autopush(item) {
64
+ if (isString(item)) {
65
+ return 0;
66
+ }
67
+
68
+ if (typeof item.section !== 'undefined') { // section node not support style overrides
69
+ return 0;
70
+ }
71
+
72
+ let styleNames = [];
73
+
74
+ if (item.style) {
75
+ if (Array.isArray(item.style)) {
76
+ styleNames = item.style;
77
+ } else {
78
+ styleNames = [item.style];
79
+ }
80
+ }
81
+
82
+ for (let i = 0, l = styleNames.length; i < l; i++) {
83
+ this.push(styleNames[i]);
84
+ }
85
+
86
+ // rather than spend significant time making a styleOverrideObject, just add item
87
+ this.push(item);
88
+ return styleNames.length + 1;
89
+ }
90
+
91
+ /**
92
+ * Automatically pushes elements onto the stack, using autopush based on item,
93
+ * executes callback and then pops elements back. Returns value returned by callback
94
+ *
95
+ * @param {object} item - an object with optional style property and/or style overrides
96
+ * @param {Function} callback to be called between autopush and pop
97
+ * @returns {object} value returned by callback
98
+ */
99
+ auto(item, callback) {
100
+ let pushedItems = this.autopush(item);
101
+ let result = callback();
102
+
103
+ if (pushedItems > 0) {
104
+ this.pop(pushedItems);
105
+ }
106
+
107
+ return result;
108
+ }
109
+
110
+ /**
111
+ * Evaluates stack and returns value of a named property
112
+ *
113
+ * @param {string} property - property name
114
+ * @returns {?any} property value or null if not found
115
+ */
116
+ getProperty(property) {
117
+
118
+ const getStylePropertyFromStyle = (styleName, property, visited = new Set()) => {
119
+ if (visited.has(styleName)) {
120
+ return undefined;
121
+ }
122
+ visited.add(styleName);
123
+
124
+ const style = this.styleDictionary[styleName];
125
+ if (!style) {
126
+ return undefined;
127
+ }
128
+
129
+ if (isValue(style[property])) {
130
+ return style[property];
131
+ }
132
+
133
+ if (style.extends) {
134
+ let parents = Array.isArray(style.extends) ? style.extends : [style.extends];
135
+ for (let i = parents.length - 1; i >= 0; i--) {
136
+ let value = getStylePropertyFromStyle(parents[i], property, visited);
137
+ if (isValue(value)) {
138
+ return value;
139
+ }
140
+ }
141
+ }
142
+
143
+ return undefined;
144
+ };
145
+
146
+ if (this.styleOverrides) {
147
+ for (let i = this.styleOverrides.length - 1; i >= 0; i--) {
148
+ let item = this.styleOverrides[i];
149
+
150
+ if (isString(item)) { // named-style-override
151
+ let value = getStylePropertyFromStyle(item, property);
152
+ if (isValue(value)) {
153
+ return value;
154
+ }
155
+ } else if (isValue(item[property])) { // style-overrides-object
156
+ return item[property];
157
+ }
158
+ }
159
+ }
160
+
161
+ return this.defaultStyle && this.defaultStyle[property];
162
+ }
163
+
164
+ /**
165
+ * @param {object} item
166
+ * @param {StyleContextStack} styleContextStack
167
+ * @param {string} property
168
+ * @param {any} defaultValue
169
+ * @returns {any}
170
+ */
171
+ static getStyleProperty(item, styleContextStack, property, defaultValue) {
172
+ let value;
173
+
174
+ if (isValue(item[property])) { // item defines this property
175
+ return item[property];
176
+ }
177
+
178
+ if (!styleContextStack) {
179
+ return defaultValue;
180
+ }
181
+
182
+ styleContextStack.auto(item, () => {
183
+ value = styleContextStack.getProperty(property);
184
+ });
185
+
186
+ return isValue(value) ? value : defaultValue;
187
+ }
188
+
189
+ /**
190
+ * @param {object} source
191
+ * @param {object} destination
192
+ * @returns {object}
193
+ */
194
+ static copyStyle(source = {}, destination = {}) {
195
+ // TODO: default style to source
196
+
197
+ for (let key in source) {
198
+ if (key != 'text' && source.hasOwnProperty(key)) {
199
+ destination[key] = source[key];
200
+ }
201
+ }
202
+
203
+ return destination;
204
+ }
205
+
206
+ }
207
+
208
+ export default StyleContextStack;