pdfmake 0.2.4 → 0.3.0-beta.1

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 +8 -30
  2. package/README.md +8 -6
  3. package/build/pdfmake.js +28921 -26825
  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 +750 -0
  22. package/js/DocPreprocessor.js +285 -0
  23. package/js/DocumentContext.js +306 -0
  24. package/js/ElementWriter.js +377 -0
  25. package/js/LayoutBuilder.js +833 -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 +163 -0
  30. package/js/PageElementWriter.js +161 -0
  31. package/js/PageSize.js +88 -0
  32. package/js/Printer.js +238 -0
  33. package/js/Renderer.js +433 -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 +79 -0
  41. package/js/base.js +69 -0
  42. package/js/browser-extensions/OutputDocumentBrowser.js +131 -0
  43. package/js/browser-extensions/URLBrowserResolver.js +89 -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 +694 -0
  65. package/src/DocPreprocessor.js +258 -0
  66. package/src/DocumentContext.js +309 -0
  67. package/src/ElementWriter.js +368 -0
  68. package/src/LayoutBuilder.js +814 -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 +148 -0
  73. package/src/PageElementWriter.js +156 -0
  74. package/src/PageSize.js +53 -0
  75. package/src/Printer.js +220 -0
  76. package/src/Renderer.js +370 -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 +69 -0
  84. package/src/base.js +61 -0
  85. package/src/browser-extensions/OutputDocumentBrowser.js +117 -0
  86. package/src/browser-extensions/URLBrowserResolver.js +46 -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
package/src/printer.js DELETED
@@ -1,705 +0,0 @@
1
- /*eslint no-unused-vars: ["error", {"args": "none"}]*/
2
- 'use strict';
3
-
4
- var PdfKitEngine = require('./pdfKitEngine');
5
- var FontProvider = require('./fontProvider');
6
- var LayoutBuilder = require('./layoutBuilder');
7
- var sizes = require('./standardPageSizes');
8
- var ImageMeasure = require('./imageMeasure');
9
- var SVGMeasure = require('./svgMeasure');
10
- var textDecorator = require('./textDecorator');
11
- var TextTools = require('./textTools');
12
- var isFunction = require('./helpers').isFunction;
13
- var isString = require('./helpers').isString;
14
- var isNumber = require('./helpers').isNumber;
15
- var isBoolean = require('./helpers').isBoolean;
16
- var isArray = require('./helpers').isArray;
17
- var isUndefined = require('./helpers').isUndefined;
18
- var isPattern = require('./helpers').isPattern;
19
- var getPattern = require('./helpers').getPattern;
20
- var SVGtoPDF = require('./3rd-party/svg-to-pdfkit');
21
-
22
- var findFont = function (fonts, requiredFonts, defaultFont) {
23
- for (var i = 0; i < requiredFonts.length; i++) {
24
- var requiredFont = requiredFonts[i].toLowerCase();
25
-
26
- for (var font in fonts) {
27
- if (font.toLowerCase() === requiredFont) {
28
- return font;
29
- }
30
- }
31
- }
32
-
33
- return defaultFont;
34
- };
35
-
36
- ////////////////////////////////////////
37
- // PdfPrinter
38
-
39
- /**
40
- * @class Creates an instance of a PdfPrinter which turns document definition into a pdf
41
- *
42
- * @param {Object} fontDescriptors font definition dictionary
43
- *
44
- * @example
45
- * var fontDescriptors = {
46
- * Roboto: {
47
- * normal: 'fonts/Roboto-Regular.ttf',
48
- * bold: 'fonts/Roboto-Medium.ttf',
49
- * italics: 'fonts/Roboto-Italic.ttf',
50
- * bolditalics: 'fonts/Roboto-MediumItalic.ttf'
51
- * }
52
- * };
53
- *
54
- * var printer = new PdfPrinter(fontDescriptors);
55
- */
56
- function PdfPrinter(fontDescriptors) {
57
- this.fontDescriptors = fontDescriptors;
58
- }
59
-
60
- /**
61
- * Executes layout engine for the specified document and renders it into a pdfkit document
62
- * ready to be saved.
63
- *
64
- * @param {Object} docDefinition document definition
65
- * @param {Object} docDefinition.content an array describing the pdf structure (for more information take a look at the examples in the /examples folder)
66
- * @param {Object} [docDefinition.defaultStyle] default (implicit) style definition
67
- * @param {Object} [docDefinition.styles] dictionary defining all styles which can be used in the document
68
- * @param {Object} [docDefinition.pageSize] page size (pdfkit units, A4 dimensions by default)
69
- * @param {Number} docDefinition.pageSize.width width
70
- * @param {Number} docDefinition.pageSize.height height
71
- * @param {Object} [docDefinition.pageMargins] page margins (pdfkit units)
72
- * @param {Number} docDefinition.maxPagesNumber maximum number of pages to render
73
- *
74
- * @example
75
- *
76
- * var docDefinition = {
77
- * info: {
78
- * title: 'awesome Document',
79
- * author: 'john doe',
80
- * subject: 'subject of document',
81
- * keywords: 'keywords for document',
82
- * },
83
- * content: [
84
- * 'First paragraph',
85
- * 'Second paragraph, this time a little bit longer',
86
- * { text: 'Third paragraph, slightly bigger font size', fontSize: 20 },
87
- * { text: 'Another paragraph using a named style', style: 'header' },
88
- * { text: ['playing with ', 'inlines' ] },
89
- * { text: ['and ', { text: 'restyling ', bold: true }, 'them'] },
90
- * ],
91
- * styles: {
92
- * header: { fontSize: 30, bold: true }
93
- * },
94
- * patterns: {
95
- * stripe45d: {
96
- * boundingBox: [1, 1, 4, 4],
97
- * xStep: 3,
98
- * yStep: 3,
99
- * pattern: '1 w 0 1 m 4 5 l s 2 0 m 5 3 l s'
100
- * }
101
- * }
102
- * };
103
- *
104
- * var pdfKitDoc = printer.createPdfKitDocument(docDefinition);
105
- *
106
- * pdfKitDoc.pipe(fs.createWriteStream('sample.pdf'));
107
- * pdfKitDoc.end();
108
- *
109
- * @return {Object} a pdfKit document object which can be saved or encode to data-url
110
- */
111
- PdfPrinter.prototype.createPdfKitDocument = function (docDefinition, options) {
112
- options = options || {};
113
-
114
- docDefinition.version = docDefinition.version || '1.3';
115
- docDefinition.compress = isBoolean(docDefinition.compress) ? docDefinition.compress : true;
116
- docDefinition.images = docDefinition.images || {};
117
- docDefinition.pageMargins = ((docDefinition.pageMargins !== undefined) && (docDefinition.pageMargins !== null)) ? docDefinition.pageMargins : 40;
118
-
119
- var pageSize = fixPageSize(docDefinition.pageSize, docDefinition.pageOrientation);
120
-
121
- var pdfOptions = {
122
- size: [pageSize.width, pageSize.height],
123
- pdfVersion: docDefinition.version,
124
- compress: docDefinition.compress,
125
- userPassword: docDefinition.userPassword,
126
- ownerPassword: docDefinition.ownerPassword,
127
- permissions: docDefinition.permissions,
128
- fontLayoutCache: isBoolean(options.fontLayoutCache) ? options.fontLayoutCache : true,
129
- bufferPages: options.bufferPages || false,
130
- autoFirstPage: false,
131
- info: createMetadata(docDefinition),
132
- font: null
133
- };
134
-
135
- this.pdfKitDoc = PdfKitEngine.createPdfDocument(pdfOptions);
136
-
137
- this.fontProvider = new FontProvider(this.fontDescriptors, this.pdfKitDoc);
138
-
139
- var builder = new LayoutBuilder(pageSize, fixPageMargins(docDefinition.pageMargins), new ImageMeasure(this.pdfKitDoc, docDefinition.images), new SVGMeasure());
140
-
141
- registerDefaultTableLayouts(builder);
142
- if (options.tableLayouts) {
143
- builder.registerTableLayouts(options.tableLayouts);
144
- }
145
-
146
- var pages = builder.layoutDocument(docDefinition.content, this.fontProvider, docDefinition.styles || {}, docDefinition.defaultStyle || {
147
- fontSize: 12,
148
- font: 'Roboto'
149
- }, docDefinition.background, docDefinition.header, docDefinition.footer, docDefinition.images, docDefinition.watermark, docDefinition.pageBreakBefore);
150
- var maxNumberPages = docDefinition.maxPagesNumber || -1;
151
- if (isNumber(maxNumberPages) && maxNumberPages > -1) {
152
- pages = pages.slice(0, maxNumberPages);
153
- }
154
-
155
- // if pageSize.height is set to Infinity, calculate the actual height of the page that
156
- // was laid out using the height of each of the items in the page.
157
- if (pageSize.height === Infinity) {
158
- var pageHeight = calculatePageHeight(pages, docDefinition.pageMargins);
159
- this.pdfKitDoc.options.size = [pageSize.width, pageHeight];
160
- }
161
-
162
- var patterns = createPatterns(docDefinition.patterns || {}, this.pdfKitDoc);
163
-
164
- renderPages(pages, this.fontProvider, this.pdfKitDoc, patterns, options.progressCallback);
165
-
166
- if (options.autoPrint) {
167
- var printActionRef = this.pdfKitDoc.ref({
168
- Type: 'Action',
169
- S: 'Named',
170
- N: 'Print'
171
- });
172
- this.pdfKitDoc._root.data.OpenAction = printActionRef;
173
- printActionRef.end();
174
- }
175
- return this.pdfKitDoc;
176
- };
177
-
178
- function createMetadata(docDefinition) {
179
- // PDF standard has these properties reserved: Title, Author, Subject, Keywords,
180
- // Creator, Producer, CreationDate, ModDate, Trapped.
181
- // To keep the pdfmake api consistent, the info field are defined lowercase.
182
- // Custom properties don't contain a space.
183
- function standardizePropertyKey(key) {
184
- var standardProperties = ['Title', 'Author', 'Subject', 'Keywords',
185
- 'Creator', 'Producer', 'CreationDate', 'ModDate', 'Trapped'];
186
- var standardizedKey = key.charAt(0).toUpperCase() + key.slice(1);
187
- if (standardProperties.indexOf(standardizedKey) !== -1) {
188
- return standardizedKey;
189
- }
190
-
191
- return key.replace(/\s+/g, '');
192
- }
193
-
194
- var info = {
195
- Producer: 'pdfmake',
196
- Creator: 'pdfmake'
197
- };
198
-
199
- if (docDefinition.info) {
200
- for (var key in docDefinition.info) {
201
- var value = docDefinition.info[key];
202
- if (value) {
203
- key = standardizePropertyKey(key);
204
- info[key] = value;
205
- }
206
- }
207
- }
208
- return info;
209
- }
210
-
211
- function calculatePageHeight(pages, margins) {
212
- function getItemHeight(item) {
213
- if (isFunction(item.item.getHeight)) {
214
- return item.item.getHeight();
215
- } else if (item.item._height) {
216
- return item.item._height;
217
- } else if (item.type === 'vector') {
218
- return item.item.y1 > item.item.y2 ? item.item.y1 : item.item.y2;
219
- } else {
220
- // TODO: add support for next item types
221
- return 0;
222
- }
223
- }
224
-
225
- function getBottomPosition(item) {
226
- var top = item.item.y || 0;
227
- var height = getItemHeight(item);
228
- return top + height;
229
- }
230
-
231
- var fixedMargins = fixPageMargins(margins || 40);
232
- var height = fixedMargins.top;
233
-
234
- pages.forEach(function (page) {
235
- page.items.forEach(function (item) {
236
- var bottomPosition = getBottomPosition(item);
237
- if (bottomPosition > height) {
238
- height = bottomPosition;
239
- }
240
- });
241
- });
242
-
243
- height += fixedMargins.bottom;
244
-
245
- return height;
246
- }
247
-
248
- function fixPageSize(pageSize, pageOrientation) {
249
- function isNeedSwapPageSizes(pageOrientation) {
250
- if (isString(pageOrientation)) {
251
- pageOrientation = pageOrientation.toLowerCase();
252
- return ((pageOrientation === 'portrait') && (size.width > size.height)) ||
253
- ((pageOrientation === 'landscape') && (size.width < size.height));
254
- }
255
- return false;
256
- }
257
-
258
- // if pageSize.height is set to auto, set the height to infinity so there are no page breaks.
259
- if (pageSize && pageSize.height === 'auto') {
260
- pageSize.height = Infinity;
261
- }
262
-
263
- var size = pageSize2widthAndHeight(pageSize || 'A4');
264
- if (isNeedSwapPageSizes(pageOrientation)) { // swap page sizes
265
- size = { width: size.height, height: size.width };
266
- }
267
- size.orientation = size.width > size.height ? 'landscape' : 'portrait';
268
- return size;
269
- }
270
-
271
- function fixPageMargins(margin) {
272
- if (isNumber(margin)) {
273
- margin = { left: margin, right: margin, top: margin, bottom: margin };
274
- } else if (isArray(margin)) {
275
- if (margin.length === 2) {
276
- margin = { left: margin[0], top: margin[1], right: margin[0], bottom: margin[1] };
277
- } else if (margin.length === 4) {
278
- margin = { left: margin[0], top: margin[1], right: margin[2], bottom: margin[3] };
279
- } else {
280
- throw 'Invalid pageMargins definition';
281
- }
282
- }
283
-
284
- return margin;
285
- }
286
-
287
- function registerDefaultTableLayouts(layoutBuilder) {
288
- layoutBuilder.registerTableLayouts({
289
- noBorders: {
290
- hLineWidth: function (i) {
291
- return 0;
292
- },
293
- vLineWidth: function (i) {
294
- return 0;
295
- },
296
- paddingLeft: function (i) {
297
- return i && 4 || 0;
298
- },
299
- paddingRight: function (i, node) {
300
- return (i < node.table.widths.length - 1) ? 4 : 0;
301
- }
302
- },
303
- headerLineOnly: {
304
- hLineWidth: function (i, node) {
305
- if (i === 0 || i === node.table.body.length) {
306
- return 0;
307
- }
308
- return (i === node.table.headerRows) ? 2 : 0;
309
- },
310
- vLineWidth: function (i) {
311
- return 0;
312
- },
313
- paddingLeft: function (i) {
314
- return i === 0 ? 0 : 8;
315
- },
316
- paddingRight: function (i, node) {
317
- return (i === node.table.widths.length - 1) ? 0 : 8;
318
- }
319
- },
320
- lightHorizontalLines: {
321
- hLineWidth: function (i, node) {
322
- if (i === 0 || i === node.table.body.length) {
323
- return 0;
324
- }
325
- return (i === node.table.headerRows) ? 2 : 1;
326
- },
327
- vLineWidth: function (i) {
328
- return 0;
329
- },
330
- hLineColor: function (i) {
331
- return i === 1 ? 'black' : '#aaa';
332
- },
333
- paddingLeft: function (i) {
334
- return i === 0 ? 0 : 8;
335
- },
336
- paddingRight: function (i, node) {
337
- return (i === node.table.widths.length - 1) ? 0 : 8;
338
- }
339
- }
340
- });
341
- }
342
-
343
- function pageSize2widthAndHeight(pageSize) {
344
- if (isString(pageSize)) {
345
- var size = sizes[pageSize.toUpperCase()];
346
- if (!size) {
347
- throw 'Page size ' + pageSize + ' not recognized';
348
- }
349
- return { width: size[0], height: size[1] };
350
- }
351
-
352
- return pageSize;
353
- }
354
-
355
- function updatePageOrientationInOptions(currentPage, pdfKitDoc) {
356
- var previousPageOrientation = pdfKitDoc.options.size[0] > pdfKitDoc.options.size[1] ? 'landscape' : 'portrait';
357
-
358
- if (currentPage.pageSize.orientation !== previousPageOrientation) {
359
- var width = pdfKitDoc.options.size[0];
360
- var height = pdfKitDoc.options.size[1];
361
- pdfKitDoc.options.size = [height, width];
362
- }
363
- }
364
-
365
- function renderPages(pages, fontProvider, pdfKitDoc, patterns, progressCallback) {
366
- pdfKitDoc._pdfMakePages = pages;
367
- pdfKitDoc.addPage();
368
-
369
- var totalItems = 0;
370
- if (progressCallback) {
371
- pages.forEach(function (page) {
372
- totalItems += page.items.length;
373
- });
374
- }
375
-
376
- var renderedItems = 0;
377
- progressCallback = progressCallback || function () {
378
- };
379
-
380
- for (var i = 0; i < pages.length; i++) {
381
- if (i > 0) {
382
- updatePageOrientationInOptions(pages[i], pdfKitDoc);
383
- pdfKitDoc.addPage(pdfKitDoc.options);
384
- }
385
-
386
- var page = pages[i];
387
- for (var ii = 0, il = page.items.length; ii < il; ii++) {
388
- var item = page.items[ii];
389
- switch (item.type) {
390
- case 'vector':
391
- renderVector(item.item, patterns, pdfKitDoc);
392
- break;
393
- case 'line':
394
- renderLine(item.item, item.item.x, item.item.y, patterns, pdfKitDoc);
395
- break;
396
- case 'image':
397
- renderImage(item.item, item.item.x, item.item.y, pdfKitDoc);
398
- break;
399
- case 'svg':
400
- renderSVG(item.item, item.item.x, item.item.y, pdfKitDoc, fontProvider);
401
- break;
402
- case 'beginClip':
403
- beginClip(item.item, pdfKitDoc);
404
- break;
405
- case 'endClip':
406
- endClip(pdfKitDoc);
407
- break;
408
- }
409
- renderedItems++;
410
- progressCallback(renderedItems / totalItems);
411
- }
412
- if (page.watermark) {
413
- renderWatermark(page, pdfKitDoc);
414
- }
415
- }
416
- }
417
-
418
- /**
419
- * Shift the "y" height of the text baseline up or down (superscript or subscript,
420
- * respectively). The exact shift can / should be changed according to standard
421
- * conventions.
422
- *
423
- * @param {number} y
424
- * @param {any} inline
425
- */
426
- function offsetText(y, inline) {
427
- var newY = y;
428
- if (inline.sup) {
429
- newY -= inline.fontSize * 0.75;
430
- }
431
- if (inline.sub) {
432
- newY += inline.fontSize * 0.35;
433
- }
434
- return newY;
435
- }
436
-
437
- function renderLine(line, x, y, patterns, pdfKitDoc) {
438
- function preparePageNodeRefLine(_pageNodeRef, inline) {
439
- var newWidth;
440
- var diffWidth;
441
- var textTools = new TextTools(null);
442
-
443
- if (isUndefined(_pageNodeRef.positions)) {
444
- throw 'Page reference id not found';
445
- }
446
-
447
- var pageNumber = _pageNodeRef.positions[0].pageNumber.toString();
448
-
449
- inline.text = pageNumber;
450
- newWidth = textTools.widthOfString(inline.text, inline.font, inline.fontSize, inline.characterSpacing, inline.fontFeatures);
451
- diffWidth = inline.width - newWidth;
452
- inline.width = newWidth;
453
-
454
- switch (inline.alignment) {
455
- case 'right':
456
- inline.x += diffWidth;
457
- break;
458
- case 'center':
459
- inline.x += diffWidth / 2;
460
- break;
461
- }
462
- }
463
-
464
- if (line._pageNodeRef) {
465
- preparePageNodeRefLine(line._pageNodeRef, line.inlines[0]);
466
- }
467
-
468
- x = x || 0;
469
- y = y || 0;
470
-
471
- var lineHeight = line.getHeight();
472
- var ascenderHeight = line.getAscenderHeight();
473
- var descent = lineHeight - ascenderHeight;
474
-
475
- textDecorator.drawBackground(line, x, y, patterns, pdfKitDoc);
476
-
477
- //TODO: line.optimizeInlines();
478
- for (var i = 0, l = line.inlines.length; i < l; i++) {
479
- var inline = line.inlines[i];
480
- var shiftToBaseline = lineHeight - ((inline.font.ascender / 1000) * inline.fontSize) - descent;
481
-
482
- if (inline._pageNodeRef) {
483
- preparePageNodeRefLine(inline._pageNodeRef, inline);
484
- }
485
-
486
- var options = {
487
- lineBreak: false,
488
- textWidth: inline.width,
489
- characterSpacing: inline.characterSpacing,
490
- wordCount: 1,
491
- link: inline.link
492
- };
493
-
494
- if (inline.linkToDestination) {
495
- options.goTo = inline.linkToDestination;
496
- }
497
-
498
- if (line.id && i === 0) {
499
- options.destination = line.id;
500
- }
501
-
502
- if (inline.fontFeatures) {
503
- options.features = inline.fontFeatures;
504
- }
505
-
506
- var opacity = isNumber(inline.opacity) ? inline.opacity : 1;
507
- pdfKitDoc.opacity(opacity);
508
- pdfKitDoc.fill(inline.color || 'black');
509
-
510
- pdfKitDoc._font = inline.font;
511
- pdfKitDoc.fontSize(inline.fontSize);
512
-
513
- var shiftedY = offsetText(y + shiftToBaseline, inline);
514
- pdfKitDoc.text(inline.text, x + inline.x, shiftedY, options);
515
-
516
- if (inline.linkToPage) {
517
- var _ref = pdfKitDoc.ref({ Type: 'Action', S: 'GoTo', D: [inline.linkToPage, 0, 0] }).end();
518
- pdfKitDoc.annotate(x + inline.x, shiftedY, inline.width, inline.height, {
519
- Subtype: 'Link',
520
- Dest: [inline.linkToPage - 1, 'XYZ', null, null, null]
521
- });
522
- }
523
-
524
- }
525
- // Decorations won't draw correctly for superscript
526
- textDecorator.drawDecorations(line, x, y, pdfKitDoc);
527
- }
528
-
529
- function renderWatermark(page, pdfKitDoc) {
530
- var watermark = page.watermark;
531
-
532
- pdfKitDoc.fill(watermark.color);
533
- pdfKitDoc.opacity(watermark.opacity);
534
-
535
- pdfKitDoc.save();
536
-
537
- pdfKitDoc.rotate(watermark.angle, { origin: [pdfKitDoc.page.width / 2, pdfKitDoc.page.height / 2] });
538
-
539
- var x = pdfKitDoc.page.width / 2 - watermark._size.size.width / 2;
540
- var y = pdfKitDoc.page.height / 2 - watermark._size.size.height / 2;
541
-
542
- pdfKitDoc._font = watermark.font;
543
- pdfKitDoc.fontSize(watermark.fontSize);
544
- pdfKitDoc.text(watermark.text, x, y, { lineBreak: false });
545
-
546
- pdfKitDoc.restore();
547
- }
548
-
549
- function renderVector(vector, patterns, pdfKitDoc) {
550
- //TODO: pdf optimization (there's no need to write all properties everytime)
551
- pdfKitDoc.lineWidth(vector.lineWidth || 1);
552
- if (vector.dash) {
553
- pdfKitDoc.dash(vector.dash.length, { space: vector.dash.space || vector.dash.length, phase: vector.dash.phase || 0 });
554
- } else {
555
- pdfKitDoc.undash();
556
- }
557
- pdfKitDoc.lineJoin(vector.lineJoin || 'miter');
558
- pdfKitDoc.lineCap(vector.lineCap || 'butt');
559
-
560
- //TODO: clipping
561
-
562
- var gradient = null;
563
-
564
- switch (vector.type) {
565
- case 'ellipse':
566
- pdfKitDoc.ellipse(vector.x, vector.y, vector.r1, vector.r2);
567
-
568
- if (vector.linearGradient) {
569
- gradient = pdfKitDoc.linearGradient(vector.x - vector.r1, vector.y, vector.x + vector.r1, vector.y);
570
- }
571
- break;
572
- case 'rect':
573
- if (vector.r) {
574
- pdfKitDoc.roundedRect(vector.x, vector.y, vector.w, vector.h, vector.r);
575
- } else {
576
- pdfKitDoc.rect(vector.x, vector.y, vector.w, vector.h);
577
- }
578
-
579
- if (vector.linearGradient) {
580
- gradient = pdfKitDoc.linearGradient(vector.x, vector.y, vector.x + vector.w, vector.y);
581
- }
582
- break;
583
- case 'line':
584
- pdfKitDoc.moveTo(vector.x1, vector.y1);
585
- pdfKitDoc.lineTo(vector.x2, vector.y2);
586
- break;
587
- case 'polyline':
588
- if (vector.points.length === 0) {
589
- break;
590
- }
591
-
592
- pdfKitDoc.moveTo(vector.points[0].x, vector.points[0].y);
593
- for (var i = 1, l = vector.points.length; i < l; i++) {
594
- pdfKitDoc.lineTo(vector.points[i].x, vector.points[i].y);
595
- }
596
-
597
- if (vector.points.length > 1) {
598
- var p1 = vector.points[0];
599
- var pn = vector.points[vector.points.length - 1];
600
-
601
- if (vector.closePath || p1.x === pn.x && p1.y === pn.y) {
602
- pdfKitDoc.closePath();
603
- }
604
- }
605
- break;
606
- case 'path':
607
- pdfKitDoc.path(vector.d);
608
- break;
609
- }
610
-
611
- if (vector.linearGradient && gradient) {
612
- var step = 1 / (vector.linearGradient.length - 1);
613
-
614
- for (var i = 0; i < vector.linearGradient.length; i++) {
615
- gradient.stop(i * step, vector.linearGradient[i]);
616
- }
617
-
618
- vector.color = gradient;
619
- }
620
-
621
- if (isPattern(vector.color)) {
622
- vector.color = getPattern(vector.color, patterns);
623
- }
624
-
625
- var fillOpacity = isNumber(vector.fillOpacity) ? vector.fillOpacity : 1;
626
- var strokeOpacity = isNumber(vector.strokeOpacity) ? vector.strokeOpacity : 1;
627
-
628
- if (vector.color && vector.lineColor) {
629
- pdfKitDoc.fillColor(vector.color, fillOpacity);
630
- pdfKitDoc.strokeColor(vector.lineColor, strokeOpacity);
631
- pdfKitDoc.fillAndStroke();
632
- } else if (vector.color) {
633
- pdfKitDoc.fillColor(vector.color, fillOpacity);
634
- pdfKitDoc.fill();
635
- } else {
636
- pdfKitDoc.strokeColor(vector.lineColor || 'black', strokeOpacity);
637
- pdfKitDoc.stroke();
638
- }
639
- }
640
-
641
- function renderImage(image, x, y, pdfKitDoc) {
642
- var opacity = isNumber(image.opacity) ? image.opacity : 1;
643
- pdfKitDoc.opacity(opacity);
644
- if (image.cover) {
645
- var align = image.cover.align || 'center';
646
- var valign = image.cover.valign || 'center';
647
- var width = image.cover.width ? image.cover.width : image.width;
648
- var height = image.cover.height ? image.cover.height : image.height;
649
- pdfKitDoc.save();
650
- pdfKitDoc.rect(image.x, image.y, width, height).clip();
651
- pdfKitDoc.image(image.image, image.x, image.y, { cover: [width, height], align: align, valign: valign });
652
- pdfKitDoc.restore();
653
- } else {
654
- pdfKitDoc.image(image.image, image.x, image.y, { width: image._width, height: image._height });
655
- }
656
- if (image.link) {
657
- pdfKitDoc.link(image.x, image.y, image._width, image._height, image.link);
658
- }
659
- if (image.linkToPage) {
660
- pdfKitDoc.ref({ Type: 'Action', S: 'GoTo', D: [image.linkToPage, 0, 0] }).end();
661
- pdfKitDoc.annotate(image.x, image.y, image._width, image._height, { Subtype: 'Link', Dest: [image.linkToPage - 1, 'XYZ', null, null, null] });
662
- }
663
- if (image.linkToDestination) {
664
- pdfKitDoc.goTo(image.x, image.y, image._width, image._height, image.linkToDestination);
665
- }
666
- }
667
-
668
- function renderSVG(svg, x, y, pdfKitDoc, fontProvider) {
669
- var options = Object.assign({ width: svg._width, height: svg._height, assumePt: true }, svg.options);
670
- options.fontCallback = function (family, bold, italic) {
671
- var fontsFamily = family.split(',').map(function (f) { return f.trim().replace(/('|")/g, ''); });
672
- var font = findFont(fontProvider.fonts, fontsFamily, svg.font || 'Roboto');
673
-
674
- var fontFile = fontProvider.getFontFile(font, bold, italic);
675
- if (fontFile === null) {
676
- var type = fontProvider.getFontType(bold, italic);
677
- throw new Error('Font \'' + font + '\' in style \'' + type + '\' is not defined in the font section of the document definition.');
678
- }
679
-
680
- return fontFile;
681
- };
682
-
683
- SVGtoPDF(pdfKitDoc, svg.svg, svg.x, svg.y, options);
684
- }
685
-
686
- function beginClip(rect, pdfKitDoc) {
687
- pdfKitDoc.save();
688
- pdfKitDoc.addContent('' + rect.x + ' ' + rect.y + ' ' + rect.width + ' ' + rect.height + ' re');
689
- pdfKitDoc.clip();
690
- }
691
-
692
- function endClip(pdfKitDoc) {
693
- pdfKitDoc.restore();
694
- }
695
-
696
- function createPatterns(patternDefinitions, pdfKitDoc) {
697
- var patterns = {};
698
- Object.keys(patternDefinitions).forEach(function (p) {
699
- var pattern = patternDefinitions[p];
700
- patterns[p] = pdfKitDoc.pattern(pattern.boundingBox, pattern.xStep, pattern.yStep, pattern.pattern, pattern.colored);
701
- });
702
- return patterns;
703
- }
704
-
705
- module.exports = PdfPrinter;