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,322 +0,0 @@
1
- 'use strict';
2
-
3
- var Line = require('./line');
4
- var isNumber = require('./helpers').isNumber;
5
- var pack = require('./helpers').pack;
6
- var offsetVector = require('./helpers').offsetVector;
7
- var DocumentContext = require('./documentContext');
8
-
9
- /**
10
- * Creates an instance of ElementWriter - a line/vector writer, which adds
11
- * elements to current page and sets their positions based on the context
12
- */
13
- function ElementWriter(context, tracker) {
14
- this.context = context;
15
- this.contextStack = [];
16
- this.tracker = tracker;
17
- }
18
-
19
- function addPageItem(page, item, index) {
20
- if (index === null || index === undefined || index < 0 || index > page.items.length) {
21
- page.items.push(item);
22
- } else {
23
- page.items.splice(index, 0, item);
24
- }
25
- }
26
-
27
- ElementWriter.prototype.addLine = function (line, dontUpdateContextPosition, index) {
28
- var height = line.getHeight();
29
- var context = this.context;
30
- var page = context.getCurrentPage(),
31
- position = this.getCurrentPositionOnPage();
32
-
33
- if (context.availableHeight < height || !page) {
34
- return false;
35
- }
36
-
37
- line.x = context.x + (line.x || 0);
38
- line.y = context.y + (line.y || 0);
39
-
40
- this.alignLine(line);
41
-
42
- addPageItem(page, {
43
- type: 'line',
44
- item: line
45
- }, index);
46
- this.tracker.emit('lineAdded', line);
47
-
48
- if (!dontUpdateContextPosition) {
49
- context.moveDown(height);
50
- }
51
-
52
- return position;
53
- };
54
-
55
- ElementWriter.prototype.alignLine = function (line) {
56
- var width = this.context.availableWidth;
57
- var lineWidth = line.getWidth();
58
-
59
- var alignment = line.inlines && line.inlines.length > 0 && line.inlines[0].alignment;
60
-
61
- var offset = 0;
62
- switch (alignment) {
63
- case 'right':
64
- offset = width - lineWidth;
65
- break;
66
- case 'center':
67
- offset = (width - lineWidth) / 2;
68
- break;
69
- }
70
-
71
- if (offset) {
72
- line.x = (line.x || 0) + offset;
73
- }
74
-
75
- if (alignment === 'justify' &&
76
- !line.newLineForced &&
77
- !line.lastLineInParagraph &&
78
- line.inlines.length > 1) {
79
- var additionalSpacing = (width - lineWidth) / (line.inlines.length - 1);
80
-
81
- for (var i = 1, l = line.inlines.length; i < l; i++) {
82
- offset = i * additionalSpacing;
83
-
84
- line.inlines[i].x += offset;
85
- line.inlines[i].justifyShift = additionalSpacing;
86
- }
87
- }
88
- };
89
-
90
- ElementWriter.prototype.addImage = function (image, index, type) {
91
- var context = this.context;
92
- var page = context.getCurrentPage(),
93
- position = this.getCurrentPositionOnPage();
94
-
95
- if (!page || (image.absolutePosition === undefined && context.availableHeight < image._height && page.items.length > 0)) {
96
- return false;
97
- }
98
-
99
- if (image._x === undefined) {
100
- image._x = image.x || 0;
101
- }
102
-
103
- image.x = context.x + image._x;
104
- image.y = context.y;
105
-
106
- this.alignImage(image);
107
-
108
- addPageItem(page, {
109
- type: type || 'image',
110
- item: image
111
- }, index);
112
-
113
- context.moveDown(image._height);
114
-
115
- return position;
116
- };
117
-
118
- ElementWriter.prototype.addSVG = function (image, index) {
119
- return this.addImage(image, index, 'svg')
120
- };
121
-
122
- ElementWriter.prototype.addQr = function (qr, index) {
123
- var context = this.context;
124
- var page = context.getCurrentPage(),
125
- position = this.getCurrentPositionOnPage();
126
-
127
- if (!page || (qr.absolutePosition === undefined && context.availableHeight < qr._height)) {
128
- return false;
129
- }
130
-
131
- if (qr._x === undefined) {
132
- qr._x = qr.x || 0;
133
- }
134
-
135
- qr.x = context.x + qr._x;
136
- qr.y = context.y;
137
-
138
- this.alignImage(qr);
139
-
140
- for (var i = 0, l = qr._canvas.length; i < l; i++) {
141
- var vector = qr._canvas[i];
142
- vector.x += qr.x;
143
- vector.y += qr.y;
144
- this.addVector(vector, true, true, index);
145
- }
146
-
147
- context.moveDown(qr._height);
148
-
149
- return position;
150
- };
151
-
152
- ElementWriter.prototype.alignImage = function (image) {
153
- var width = this.context.availableWidth;
154
- var imageWidth = image._minWidth;
155
- var offset = 0;
156
- switch (image._alignment) {
157
- case 'right':
158
- offset = width - imageWidth;
159
- break;
160
- case 'center':
161
- offset = (width - imageWidth) / 2;
162
- break;
163
- }
164
-
165
- if (offset) {
166
- image.x = (image.x || 0) + offset;
167
- }
168
- };
169
-
170
- ElementWriter.prototype.alignCanvas = function (node) {
171
- var width = this.context.availableWidth;
172
- var canvasWidth = node._minWidth;
173
- var offset = 0;
174
- switch (node._alignment) {
175
- case 'right':
176
- offset = width - canvasWidth;
177
- break;
178
- case 'center':
179
- offset = (width - canvasWidth) / 2;
180
- break;
181
- }
182
- if (offset) {
183
- node.canvas.forEach(function (vector) {
184
- offsetVector(vector, offset, 0);
185
- });
186
- }
187
- };
188
-
189
- ElementWriter.prototype.addVector = function (vector, ignoreContextX, ignoreContextY, index) {
190
- var context = this.context;
191
- var page = context.getCurrentPage(),
192
- position = this.getCurrentPositionOnPage();
193
-
194
- if (page) {
195
- offsetVector(vector, ignoreContextX ? 0 : context.x, ignoreContextY ? 0 : context.y);
196
- addPageItem(page, {
197
- type: 'vector',
198
- item: vector
199
- }, index);
200
- return position;
201
- }
202
- };
203
-
204
- ElementWriter.prototype.beginClip = function (width, height) {
205
- var ctx = this.context;
206
- var page = ctx.getCurrentPage();
207
- page.items.push({
208
- type: 'beginClip',
209
- item: { x: ctx.x, y: ctx.y, width: width, height: height }
210
- });
211
- return true;
212
- };
213
-
214
- ElementWriter.prototype.endClip = function () {
215
- var ctx = this.context;
216
- var page = ctx.getCurrentPage();
217
- page.items.push({
218
- type: 'endClip'
219
- });
220
- return true;
221
- };
222
-
223
- function cloneLine(line) {
224
- var result = new Line(line.maxWidth);
225
-
226
- for (var key in line) {
227
- if (line.hasOwnProperty(key)) {
228
- result[key] = line[key];
229
- }
230
- }
231
-
232
- return result;
233
- }
234
-
235
- ElementWriter.prototype.addFragment = function (block, useBlockXOffset, useBlockYOffset, dontUpdateContextPosition) {
236
- var ctx = this.context;
237
- var page = ctx.getCurrentPage();
238
-
239
- if (!useBlockXOffset && block.height > ctx.availableHeight) {
240
- return false;
241
- }
242
-
243
- block.items.forEach(function (item) {
244
- switch (item.type) {
245
- case 'line':
246
- var l = cloneLine(item.item);
247
-
248
- if (l._node) {
249
- l._node.positions[0].pageNumber = ctx.page + 1;
250
- }
251
- l.x = (l.x || 0) + (useBlockXOffset ? (block.xOffset || 0) : ctx.x);
252
- l.y = (l.y || 0) + (useBlockYOffset ? (block.yOffset || 0) : ctx.y);
253
-
254
- page.items.push({
255
- type: 'line',
256
- item: l
257
- });
258
- break;
259
-
260
- case 'vector':
261
- var v = pack(item.item);
262
-
263
- offsetVector(v, useBlockXOffset ? (block.xOffset || 0) : ctx.x, useBlockYOffset ? (block.yOffset || 0) : ctx.y);
264
- page.items.push({
265
- type: 'vector',
266
- item: v
267
- });
268
- break;
269
-
270
- case 'image':
271
- case 'svg':
272
- var img = pack(item.item);
273
-
274
- img.x = (img.x || 0) + (useBlockXOffset ? (block.xOffset || 0) : ctx.x);
275
- img.y = (img.y || 0) + (useBlockYOffset ? (block.yOffset || 0) : ctx.y);
276
-
277
- page.items.push({
278
- type: item.type,
279
- item: img
280
- });
281
- break;
282
- }
283
- });
284
-
285
- if (!dontUpdateContextPosition) {
286
- ctx.moveDown(block.height);
287
- }
288
-
289
- return true;
290
- };
291
-
292
- /**
293
- * Pushes the provided context onto the stack or creates a new one
294
- *
295
- * pushContext(context) - pushes the provided context and makes it current
296
- * pushContext(width, height) - creates and pushes a new context with the specified width and height
297
- * pushContext() - creates a new context for unbreakable blocks (with current availableWidth and full-page-height)
298
- */
299
- ElementWriter.prototype.pushContext = function (contextOrWidth, height) {
300
- if (contextOrWidth === undefined) {
301
- height = this.context.getCurrentPage().height - this.context.pageMargins.top - this.context.pageMargins.bottom;
302
- contextOrWidth = this.context.availableWidth;
303
- }
304
-
305
- if (isNumber(contextOrWidth)) {
306
- contextOrWidth = new DocumentContext({ width: contextOrWidth, height: height }, { left: 0, right: 0, top: 0, bottom: 0 });
307
- }
308
-
309
- this.contextStack.push(this.context);
310
- this.context = contextOrWidth;
311
- };
312
-
313
- ElementWriter.prototype.popContext = function () {
314
- this.context = this.contextStack.pop();
315
- };
316
-
317
- ElementWriter.prototype.getCurrentPositionOnPage = function () {
318
- return (this.contextStack[0] || this.context).getCurrentPosition();
319
- };
320
-
321
-
322
- module.exports = ElementWriter;
@@ -1,68 +0,0 @@
1
- 'use strict';
2
-
3
- var isArray = require('./helpers').isArray;
4
-
5
- function typeName(bold, italics) {
6
- var type = 'normal';
7
- if (bold && italics) {
8
- type = 'bolditalics';
9
- } else if (bold) {
10
- type = 'bold';
11
- } else if (italics) {
12
- type = 'italics';
13
- }
14
- return type;
15
- }
16
-
17
- function FontProvider(fontDescriptors, pdfKitDoc) {
18
- this.fonts = {};
19
- this.pdfKitDoc = pdfKitDoc;
20
- this.fontCache = {};
21
-
22
- for (var font in fontDescriptors) {
23
- if (fontDescriptors.hasOwnProperty(font)) {
24
- var fontDef = fontDescriptors[font];
25
-
26
- this.fonts[font] = {
27
- normal: fontDef.normal,
28
- bold: fontDef.bold,
29
- italics: fontDef.italics,
30
- bolditalics: fontDef.bolditalics
31
- };
32
- }
33
- }
34
- }
35
-
36
- FontProvider.prototype.getFontType = function (bold, italics) {
37
- return typeName(bold, italics);
38
- }
39
-
40
- FontProvider.prototype.getFontFile = function (familyName, bold, italics) {
41
- var type = this.getFontType(bold, italics);
42
- if (!this.fonts[familyName] || !this.fonts[familyName][type]) {
43
- return null;
44
- }
45
-
46
- return this.fonts[familyName][type];
47
- }
48
-
49
- FontProvider.prototype.provideFont = function (familyName, bold, italics) {
50
- var type = this.getFontType(bold, italics);
51
- if (this.getFontFile(familyName, bold, italics) === null) {
52
- throw new Error('Font \'' + familyName + '\' in style \'' + type + '\' is not defined in the font section of the document definition.');
53
- }
54
-
55
- this.fontCache[familyName] = this.fontCache[familyName] || {};
56
-
57
- if (!this.fontCache[familyName][type]) {
58
- var def = this.fonts[familyName][type];
59
- if (!isArray(def)) {
60
- def = [def];
61
- }
62
- this.fontCache[familyName][type] = this.pdfKitDoc.font.apply(this.pdfKitDoc, def)._font;
63
- }
64
-
65
- return this.fontCache[familyName][type];
66
- };
67
-
68
- module.exports = FontProvider;
package/src/helpers.js DELETED
@@ -1,126 +0,0 @@
1
- 'use strict';
2
-
3
- function isString(variable) {
4
- return typeof variable === 'string' || variable instanceof String;
5
- }
6
-
7
- function isNumber(variable) {
8
- return typeof variable === 'number' || variable instanceof Number;
9
- }
10
-
11
- function isBoolean(variable) {
12
- return typeof variable === 'boolean';
13
- }
14
-
15
- function isArray(variable) {
16
- return Array.isArray(variable);
17
- }
18
-
19
- function isFunction(variable) {
20
- return typeof variable === 'function';
21
- }
22
-
23
- function isObject(variable) {
24
- return variable !== null && typeof variable === 'object';
25
- }
26
-
27
- function isNull(variable) {
28
- return variable === null;
29
- }
30
-
31
- function isUndefined(variable) {
32
- return variable === undefined;
33
- }
34
-
35
- function pack() {
36
- var result = {};
37
-
38
- for (var i = 0, l = arguments.length; i < l; i++) {
39
- var obj = arguments[i];
40
-
41
- if (obj) {
42
- for (var key in obj) {
43
- if (obj.hasOwnProperty(key)) {
44
- result[key] = obj[key];
45
- }
46
- }
47
- }
48
- }
49
-
50
- return result;
51
- }
52
-
53
- function offsetVector(vector, x, y) {
54
- switch (vector.type) {
55
- case 'ellipse':
56
- case 'rect':
57
- vector.x += x;
58
- vector.y += y;
59
- break;
60
- case 'line':
61
- vector.x1 += x;
62
- vector.x2 += x;
63
- vector.y1 += y;
64
- vector.y2 += y;
65
- break;
66
- case 'polyline':
67
- for (var i = 0, l = vector.points.length; i < l; i++) {
68
- vector.points[i].x += x;
69
- vector.points[i].y += y;
70
- }
71
- break;
72
- }
73
- }
74
-
75
- function fontStringify(key, val) {
76
- if (key === 'font') {
77
- return 'font';
78
- }
79
- return val;
80
- }
81
-
82
- function getNodeId(node) {
83
- if (node.id) {
84
- return node.id;
85
- }
86
-
87
- if (isArray(node.text)) {
88
- for (var i = 0, l = node.text.length; i < l; i++) {
89
- var n = node.text[i];
90
- var nodeId = getNodeId(n);
91
- if (nodeId) {
92
- return nodeId;
93
- }
94
- }
95
- }
96
-
97
- return null;
98
- }
99
-
100
- function isPattern(color) {
101
- return isArray(color) && color.length === 2;
102
- }
103
-
104
- // converts from a [<pattern name>, <color>] as used by pdfmake
105
- // into [<pattern object>, <color>] as used by pdfkit
106
- // (the pattern has to be registered in the doc definition of course)
107
- function getPattern(color, patterns) {
108
- return [patterns[color[0]], color[1]];
109
- }
110
-
111
- module.exports = {
112
- isString: isString,
113
- isNumber: isNumber,
114
- isBoolean: isBoolean,
115
- isArray: isArray,
116
- isFunction: isFunction,
117
- isObject: isObject,
118
- isNull: isNull,
119
- isUndefined: isUndefined,
120
- pack: pack,
121
- fontStringify: fontStringify,
122
- offsetVector: offsetVector,
123
- getNodeId: getNodeId,
124
- isPattern: isPattern,
125
- getPattern: getPattern
126
- };
@@ -1,51 +0,0 @@
1
- 'use strict';
2
-
3
- var fs = require('fs');
4
-
5
- function ImageMeasure(pdfKitDoc, imageDictionary) {
6
- this.pdfKitDoc = pdfKitDoc;
7
- this.imageDictionary = imageDictionary || {};
8
- }
9
-
10
- ImageMeasure.prototype.measureImage = function (src) {
11
- var image;
12
- var that = this;
13
-
14
- if (!this.pdfKitDoc._imageRegistry[src]) {
15
- try {
16
- image = this.pdfKitDoc.openImage(realImageSrc(src));
17
- if (!image) {
18
- throw 'No image';
19
- }
20
- } catch (error) {
21
- throw 'Invalid image: ' + error.toString() + '\nImages dictionary should contain dataURL entries (or local file paths in node.js)';
22
- }
23
- image.embed(this.pdfKitDoc);
24
- this.pdfKitDoc._imageRegistry[src] = image;
25
- } else {
26
- image = this.pdfKitDoc._imageRegistry[src];
27
- }
28
-
29
- return { width: image.width, height: image.height };
30
-
31
- function realImageSrc(src) {
32
- var img = that.imageDictionary[src];
33
-
34
- if (!img) {
35
- return src;
36
- }
37
-
38
- if (fs.existsSync(img)) {
39
- return fs.readFileSync(img);
40
- }
41
-
42
- var index = img.indexOf('base64,');
43
- if (index < 0) {
44
- return that.imageDictionary[src];
45
- }
46
-
47
- return Buffer.from(img.substring(index + 7), 'base64');
48
- }
49
- };
50
-
51
- module.exports = ImageMeasure;