pdfmake 0.3.0-beta.9 → 0.3.0

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 (74) hide show
  1. package/CHANGELOG.md +7 -48
  2. package/LICENSE +1 -1
  3. package/README.md +78 -85
  4. package/build/pdfmake.js +66833 -75014
  5. package/build/pdfmake.js.map +1 -1
  6. package/build/pdfmake.min.js +2 -2
  7. package/build/pdfmake.min.js.map +1 -1
  8. package/build/vfs_fonts.js +4 -4
  9. package/fonts/Roboto/Roboto-Italic.ttf +0 -0
  10. package/fonts/Roboto/Roboto-Medium.ttf +0 -0
  11. package/fonts/Roboto/Roboto-MediumItalic.ttf +0 -0
  12. package/fonts/Roboto/Roboto-Regular.ttf +0 -0
  13. package/js/DocMeasure.js +20 -1
  14. package/js/DocPreprocessor.js +21 -6
  15. package/js/DocumentContext.js +64 -17
  16. package/js/ElementWriter.js +31 -8
  17. package/js/LayoutBuilder.js +488 -127
  18. package/js/OutputDocument.js +22 -34
  19. package/js/OutputDocumentServer.js +6 -11
  20. package/js/PDFDocument.js +1 -1
  21. package/js/PageElementWriter.js +17 -2
  22. package/js/Printer.js +133 -133
  23. package/js/Renderer.js +22 -14
  24. package/js/SVGMeasure.js +2 -2
  25. package/js/StyleContextStack.js +4 -0
  26. package/js/TableProcessor.js +40 -14
  27. package/js/TextBreaker.js +31 -4
  28. package/js/TextInlines.js +1 -1
  29. package/js/URLResolver.js +25 -55
  30. package/js/base.js +1 -1
  31. package/js/browser-extensions/OutputDocumentBrowser.js +35 -72
  32. package/js/browser-extensions/index.js +2 -2
  33. package/js/browser-extensions/pdfMake.js +0 -12
  34. package/js/browser-extensions/standard-fonts/Courier.js +4 -4
  35. package/js/browser-extensions/standard-fonts/Helvetica.js +4 -4
  36. package/js/browser-extensions/standard-fonts/Symbol.js +1 -1
  37. package/js/browser-extensions/standard-fonts/Times.js +4 -4
  38. package/js/browser-extensions/standard-fonts/ZapfDingbats.js +1 -1
  39. package/js/helpers/tools.js +6 -0
  40. package/js/index.js +1 -1
  41. package/package.json +25 -24
  42. package/src/DocMeasure.js +21 -1
  43. package/src/DocPreprocessor.js +25 -6
  44. package/src/DocumentContext.js +56 -20
  45. package/src/ElementWriter.js +30 -7
  46. package/src/LayoutBuilder.js +531 -144
  47. package/src/OutputDocument.js +23 -37
  48. package/src/OutputDocumentServer.js +6 -11
  49. package/src/PDFDocument.js +1 -1
  50. package/src/PageElementWriter.js +21 -2
  51. package/src/Printer.js +134 -131
  52. package/src/Renderer.js +13 -15
  53. package/src/SVGMeasure.js +2 -2
  54. package/src/StyleContextStack.js +4 -0
  55. package/src/TableProcessor.js +42 -18
  56. package/src/TextBreaker.js +24 -5
  57. package/src/TextInlines.js +1 -1
  58. package/src/URLResolver.js +24 -58
  59. package/src/base.js +1 -1
  60. package/src/browser-extensions/OutputDocumentBrowser.js +33 -71
  61. package/src/browser-extensions/index.js +3 -3
  62. package/src/browser-extensions/pdfMake.js +0 -14
  63. package/src/browser-extensions/standard-fonts/Courier.js +4 -4
  64. package/src/browser-extensions/standard-fonts/Helvetica.js +4 -4
  65. package/src/browser-extensions/standard-fonts/Symbol.js +1 -1
  66. package/src/browser-extensions/standard-fonts/Times.js +4 -4
  67. package/src/browser-extensions/standard-fonts/ZapfDingbats.js +1 -1
  68. package/src/columnCalculator.js +12 -12
  69. package/src/helpers/tools.js +5 -0
  70. package/src/helpers/variableType.js +1 -1
  71. package/src/index.js +1 -1
  72. package/standard-fonts/Helvetica.js +0 -1
  73. package/js/browser-extensions/URLBrowserResolver.js +0 -76
  74. package/src/browser-extensions/URLBrowserResolver.js +0 -84
@@ -20,57 +20,43 @@ class OutputDocument {
20
20
  * @returns {Promise<Buffer>}
21
21
  */
22
22
  getBuffer() {
23
- if (this.bufferPromise === null) {
24
- this.bufferPromise = new Promise((resolve, reject) => {
25
- this.getStream().then(stream => {
26
-
27
- let chunks = [];
28
- let result;
29
- stream.on('readable', () => {
30
- let chunk;
31
- while ((chunk = stream.read(this.bufferSize)) !== null) {
32
- chunks.push(chunk);
33
- }
34
- });
35
- stream.on('end', () => {
36
- result = Buffer.concat(chunks);
37
- resolve(result);
38
- });
39
- stream.end();
40
-
41
- }, result => {
42
- reject(result);
23
+ const getBufferInternal = (async () => {
24
+ const stream = await this.getStream();
25
+ return new Promise((resolve) => {
26
+ let chunks = [];
27
+ stream.on('readable', () => {
28
+ let chunk;
29
+ while ((chunk = stream.read(this.bufferSize)) !== null) {
30
+ chunks.push(chunk);
31
+ }
43
32
  });
33
+ stream.on('end', () => {
34
+ resolve(Buffer.concat(chunks));
35
+ });
36
+ stream.end();
44
37
  });
45
- }
38
+ });
46
39
 
40
+ if (this.bufferPromise === null) {
41
+ this.bufferPromise = getBufferInternal();
42
+ }
47
43
  return this.bufferPromise;
48
44
  }
49
45
 
50
46
  /**
51
47
  * @returns {Promise<string>}
52
48
  */
53
- getBase64() {
54
- return new Promise((resolve, reject) => {
55
- this.getBuffer().then(buffer => {
56
- resolve(buffer.toString('base64'));
57
- }, result => {
58
- reject(result);
59
- });
60
- });
49
+ async getBase64() {
50
+ const buffer = await this.getBuffer();
51
+ return buffer.toString('base64');
61
52
  }
62
53
 
63
54
  /**
64
55
  * @returns {Promise<string>}
65
56
  */
66
- getDataUrl() {
67
- return new Promise((resolve, reject) => {
68
- this.getBase64().then(data => {
69
- resolve('data:application/pdf;base64,' + data);
70
- }, result => {
71
- reject(result);
72
- });
73
- });
57
+ async getDataUrl() {
58
+ const data = await this.getBase64();
59
+ return 'data:application/pdf;base64,' + data;
74
60
  }
75
61
 
76
62
  }
@@ -7,17 +7,12 @@ class OutputDocumentServer extends OutputDocument {
7
7
  * @param {string} filename
8
8
  * @returns {Promise}
9
9
  */
10
- write(filename) {
11
- return new Promise((resolve, reject) => {
12
- this.getStream().then(stream => {
13
- stream.pipe(fs.createWriteStream(filename));
14
- stream.on('end', () => {
15
- resolve();
16
- });
17
- stream.end();
18
- }, result => {
19
- reject(result);
20
- });
10
+ async write(filename) {
11
+ const stream = await this.getStream();
12
+ return new Promise((resolve) => {
13
+ stream.pipe(fs.createWriteStream(filename));
14
+ stream.on('end', resolve);
15
+ stream.end();
21
16
  });
22
17
  }
23
18
 
@@ -1,4 +1,4 @@
1
- import PDFKit from '@foliojs-fork/pdfkit';
1
+ import PDFKit from 'pdfkit';
2
2
 
3
3
  const typeName = (bold, italics) => {
4
4
  let type = 'normal';
@@ -1,4 +1,6 @@
1
1
  import ElementWriter from './ElementWriter';
2
+ import { normalizePageSize, normalizePageMargin } from './PageSize';
3
+ import DocumentContext from './DocumentContext';
2
4
 
3
5
  /**
4
6
  * An extended ElementWriter which can handle:
@@ -9,6 +11,10 @@ import ElementWriter from './ElementWriter';
9
11
  * whole block will be rendered on the same page)
10
12
  */
11
13
  class PageElementWriter extends ElementWriter {
14
+
15
+ /**
16
+ * @param {DocumentContext} context
17
+ */
12
18
  constructor(context) {
13
19
  super(context);
14
20
  this.transactionLevel = 0;
@@ -39,8 +45,8 @@ class PageElementWriter extends ElementWriter {
39
45
  return this._fitOnPage(() => super.addAttachment(attachment, index));
40
46
  }
41
47
 
42
- addVector(vector, ignoreContextX, ignoreContextY, index) {
43
- return super.addVector(vector, ignoreContextX, ignoreContextY, index);
48
+ addVector(vector, ignoreContextX, ignoreContextY, index, forcePage) {
49
+ return super.addVector(vector, ignoreContextX, ignoreContextY, index, forcePage);
44
50
  }
45
51
 
46
52
  beginClip(width, height) {
@@ -77,6 +83,19 @@ class PageElementWriter extends ElementWriter {
77
83
  });
78
84
  }
79
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
+
80
99
  beginUnbreakableBlock(width, height) {
81
100
  if (this.transactionLevel++ === 0) {
82
101
  this.originalX = this.context().x;
package/src/Printer.js CHANGED
@@ -5,6 +5,7 @@ import { normalizePageSize, normalizePageMargin } from './PageSize';
5
5
  import { tableLayouts } from './tableLayouts';
6
6
  import Renderer from './Renderer';
7
7
  import { isNumber, isValue } from './helpers/variableType';
8
+ import { convertToDynamicContent } from './helpers/tools';
8
9
 
9
10
  /**
10
11
  * Printer which turns document definition into a pdf
@@ -42,75 +43,83 @@ class PdfPrinter {
42
43
  * @param {object} options
43
44
  * @returns {Promise<PDFDocument>} resolved promise return a pdfkit document
44
45
  */
45
- createPdfKitDocument(docDefinition, options = {}) {
46
- return new Promise((resolve, reject) => {
47
- this.resolveUrls(docDefinition).then(() => {
48
- try {
49
- docDefinition.version = docDefinition.version || '1.3';
50
- docDefinition.compress = typeof docDefinition.compress === 'boolean' ? docDefinition.compress : true;
51
- docDefinition.images = docDefinition.images || {};
52
- docDefinition.attachments = docDefinition.attachments || {};
53
- docDefinition.pageMargins = isValue(docDefinition.pageMargins) ? docDefinition.pageMargins : 40;
54
- docDefinition.patterns = docDefinition.patterns || {};
55
-
56
- let pageSize = normalizePageSize(docDefinition.pageSize, docDefinition.pageOrientation);
57
-
58
- let pdfOptions = {
59
- size: [pageSize.width, pageSize.height],
60
- pdfVersion: docDefinition.version,
61
- compress: docDefinition.compress,
62
- userPassword: docDefinition.userPassword,
63
- ownerPassword: docDefinition.ownerPassword,
64
- permissions: docDefinition.permissions,
65
- lang: docDefinition.language,
66
- fontLayoutCache: typeof options.fontLayoutCache === 'boolean' ? options.fontLayoutCache : true,
67
- bufferPages: options.bufferPages || false,
68
- autoFirstPage: false,
69
- info: createMetadata(docDefinition),
70
- font: null
71
- };
72
-
73
- this.pdfKitDoc = new PDFDocument(this.fontDescriptors, docDefinition.images, docDefinition.patterns, docDefinition.attachments, pdfOptions, this.virtualfs);
74
- embedFiles(docDefinition, this.pdfKitDoc);
75
-
76
- const builder = new LayoutBuilder(pageSize, normalizePageMargin(docDefinition.pageMargins), new SVGMeasure());
77
-
78
- builder.registerTableLayouts(tableLayouts);
79
- if (options.tableLayouts) {
80
- builder.registerTableLayouts(options.tableLayouts);
81
- }
46
+ async createPdfKitDocument(docDefinition, options = {}) {
47
+ await this.resolveUrls(docDefinition);
48
+
49
+ docDefinition.version = docDefinition.version || '1.3';
50
+ docDefinition.subset = docDefinition.subset || undefined;
51
+ docDefinition.tagged = typeof docDefinition.tagged === 'boolean' ? docDefinition.tagged : false;
52
+ docDefinition.displayTitle = typeof docDefinition.displayTitle === 'boolean' ? docDefinition.displayTitle : false;
53
+ docDefinition.compress = typeof docDefinition.compress === 'boolean' ? docDefinition.compress : true;
54
+ docDefinition.images = docDefinition.images || {};
55
+ docDefinition.attachments = docDefinition.attachments || {};
56
+ docDefinition.pageMargins = isValue(docDefinition.pageMargins) ? docDefinition.pageMargins : 40;
57
+ docDefinition.patterns = docDefinition.patterns || {};
58
+
59
+ if (docDefinition.header && typeof docDefinition.header !== 'function') {
60
+ docDefinition.header = convertToDynamicContent(docDefinition.header);
61
+ }
82
62
 
83
- let pages = builder.layoutDocument(docDefinition.content, this.pdfKitDoc, docDefinition.styles || {}, docDefinition.defaultStyle || { fontSize: 12, font: 'Roboto' }, docDefinition.background, docDefinition.header, docDefinition.footer, docDefinition.watermark, docDefinition.pageBreakBefore);
84
- let maxNumberPages = docDefinition.maxPagesNumber || -1;
85
- if (isNumber(maxNumberPages) && maxNumberPages > -1) {
86
- pages = pages.slice(0, maxNumberPages);
87
- }
63
+ if (docDefinition.footer && typeof docDefinition.footer !== 'function') {
64
+ docDefinition.footer = convertToDynamicContent(docDefinition.footer);
65
+ }
88
66
 
89
- // if pageSize.height is set to Infinity, calculate the actual height of the page that
90
- // was laid out using the height of each of the items in the page.
91
- if (pageSize.height === Infinity) {
92
- let pageHeight = calculatePageHeight(pages, docDefinition.pageMargins);
93
- this.pdfKitDoc.options.size = [pageSize.width, pageHeight];
94
- }
67
+ let pageSize = normalizePageSize(docDefinition.pageSize, docDefinition.pageOrientation);
68
+
69
+ let pdfOptions = {
70
+ size: [pageSize.width, pageSize.height],
71
+ pdfVersion: docDefinition.version,
72
+ subset: docDefinition.subset,
73
+ tagged: docDefinition.tagged,
74
+ displayTitle: docDefinition.displayTitle,
75
+ compress: docDefinition.compress,
76
+ userPassword: docDefinition.userPassword,
77
+ ownerPassword: docDefinition.ownerPassword,
78
+ permissions: docDefinition.permissions,
79
+ lang: docDefinition.language,
80
+ fontLayoutCache: typeof options.fontLayoutCache === 'boolean' ? options.fontLayoutCache : true,
81
+ bufferPages: options.bufferPages || false,
82
+ autoFirstPage: false,
83
+ info: createMetadata(docDefinition),
84
+ font: null
85
+ };
95
86
 
96
- const renderer = new Renderer(this.pdfKitDoc, options.progressCallback);
97
- renderer.renderPages(pages);
87
+ this.pdfKitDoc = new PDFDocument(this.fontDescriptors, docDefinition.images, docDefinition.patterns, docDefinition.attachments, pdfOptions, this.virtualfs);
88
+ embedFiles(docDefinition, this.pdfKitDoc);
98
89
 
99
- resolve(this.pdfKitDoc);
100
- } catch (e) {
101
- reject(e);
102
- }
103
- }, result => {
104
- reject(result);
90
+ const builder = new LayoutBuilder(pageSize, normalizePageMargin(docDefinition.pageMargins), new SVGMeasure());
91
+
92
+ builder.registerTableLayouts(tableLayouts);
93
+ if (options.tableLayouts) {
94
+ builder.registerTableLayouts(options.tableLayouts);
95
+ }
96
+
97
+ let pages = builder.layoutDocument(docDefinition.content, this.pdfKitDoc, docDefinition.styles || {}, docDefinition.defaultStyle || { fontSize: 12, font: 'Roboto' }, docDefinition.background, docDefinition.header, docDefinition.footer, docDefinition.watermark, docDefinition.pageBreakBefore);
98
+ let maxNumberPages = docDefinition.maxPagesNumber || -1;
99
+ if (isNumber(maxNumberPages) && maxNumberPages > -1) {
100
+ pages = pages.slice(0, maxNumberPages);
101
+ }
102
+
103
+ // if pageSize.height is set to Infinity, calculate the actual height of the page that
104
+ // was laid out using the height of each of the items in the page.
105
+ if (pageSize.height === Infinity) {
106
+ let pageHeight = calculatePageHeight(pages, docDefinition.pageMargins);
107
+ pages.forEach(page => {
108
+ page.pageSize.height = pageHeight;
105
109
  });
106
- });
110
+ }
111
+
112
+ const renderer = new Renderer(this.pdfKitDoc, options.progressCallback);
113
+ renderer.renderPages(pages);
114
+
115
+ return this.pdfKitDoc;
107
116
  }
108
117
 
109
118
  /**
110
119
  * @param {object} docDefinition
111
120
  * @returns {Promise}
112
121
  */
113
- resolveUrls(docDefinition) {
122
+ async resolveUrls(docDefinition) {
114
123
  const getExtendedUrl = url => {
115
124
  if (typeof url === 'object') {
116
125
  return { url: url.url, headers: url.headers };
@@ -119,96 +128,90 @@ class PdfPrinter {
119
128
  return { url: url, headers: {} };
120
129
  };
121
130
 
122
- return new Promise((resolve, reject) => {
123
- if (this.urlResolver === null) {
124
- resolve();
125
- }
131
+ if (this.urlResolver === null) {
132
+ return;
133
+ }
126
134
 
127
- for (let font in this.fontDescriptors) {
128
- if (this.fontDescriptors.hasOwnProperty(font)) {
129
- if (this.fontDescriptors[font].normal) {
130
- if (Array.isArray(this.fontDescriptors[font].normal)) { // TrueType Collection
131
- let url = getExtendedUrl(this.fontDescriptors[font].normal[0]);
132
- this.urlResolver.resolve(url.url, url.headers);
133
- this.fontDescriptors[font].normal[0] = url.url;
134
- } else {
135
- let url = getExtendedUrl(this.fontDescriptors[font].normal);
136
- this.urlResolver.resolve(url.url, url.headers);
137
- this.fontDescriptors[font].normal = url.url;
138
- }
135
+ for (let font in this.fontDescriptors) {
136
+ if (this.fontDescriptors.hasOwnProperty(font)) {
137
+ if (this.fontDescriptors[font].normal) {
138
+ if (Array.isArray(this.fontDescriptors[font].normal)) { // TrueType Collection
139
+ let url = getExtendedUrl(this.fontDescriptors[font].normal[0]);
140
+ this.urlResolver.resolve(url.url, url.headers);
141
+ this.fontDescriptors[font].normal[0] = url.url;
142
+ } else {
143
+ let url = getExtendedUrl(this.fontDescriptors[font].normal);
144
+ this.urlResolver.resolve(url.url, url.headers);
145
+ this.fontDescriptors[font].normal = url.url;
139
146
  }
140
- if (this.fontDescriptors[font].bold) {
141
- if (Array.isArray(this.fontDescriptors[font].bold)) { // TrueType Collection
142
- let url = getExtendedUrl(this.fontDescriptors[font].bold[0]);
143
- this.urlResolver.resolve(url.url, url.headers);
144
- this.fontDescriptors[font].bold[0] = url.url;
145
- } else {
146
- let url = getExtendedUrl(this.fontDescriptors[font].bold);
147
- this.urlResolver.resolve(url.url, url.headers);
148
- this.fontDescriptors[font].bold = url.url;
149
- }
147
+ }
148
+ if (this.fontDescriptors[font].bold) {
149
+ if (Array.isArray(this.fontDescriptors[font].bold)) { // TrueType Collection
150
+ let url = getExtendedUrl(this.fontDescriptors[font].bold[0]);
151
+ this.urlResolver.resolve(url.url, url.headers);
152
+ this.fontDescriptors[font].bold[0] = url.url;
153
+ } else {
154
+ let url = getExtendedUrl(this.fontDescriptors[font].bold);
155
+ this.urlResolver.resolve(url.url, url.headers);
156
+ this.fontDescriptors[font].bold = url.url;
150
157
  }
151
- if (this.fontDescriptors[font].italics) {
152
- if (Array.isArray(this.fontDescriptors[font].italics)) { // TrueType Collection
153
- let url = getExtendedUrl(this.fontDescriptors[font].italics[0]);
154
- this.urlResolver.resolve(url.url, url.headers);
155
- this.fontDescriptors[font].italics[0] = url.url;
156
- } else {
157
- let url = getExtendedUrl(this.fontDescriptors[font].italics);
158
- this.urlResolver.resolve(url.url, url.headers);
159
- this.fontDescriptors[font].italics = url.url;
160
- }
158
+ }
159
+ if (this.fontDescriptors[font].italics) {
160
+ if (Array.isArray(this.fontDescriptors[font].italics)) { // TrueType Collection
161
+ let url = getExtendedUrl(this.fontDescriptors[font].italics[0]);
162
+ this.urlResolver.resolve(url.url, url.headers);
163
+ this.fontDescriptors[font].italics[0] = url.url;
164
+ } else {
165
+ let url = getExtendedUrl(this.fontDescriptors[font].italics);
166
+ this.urlResolver.resolve(url.url, url.headers);
167
+ this.fontDescriptors[font].italics = url.url;
161
168
  }
162
- if (this.fontDescriptors[font].bolditalics) {
163
- if (Array.isArray(this.fontDescriptors[font].bolditalics)) { // TrueType Collection
164
- let url = getExtendedUrl(this.fontDescriptors[font].bolditalics[0]);
165
- this.urlResolver.resolve(url.url, url.headers);
166
- this.fontDescriptors[font].bolditalics[0] = url.url;
167
- } else {
168
- let url = getExtendedUrl(this.fontDescriptors[font].bolditalics);
169
- this.urlResolver.resolve(url.url, url.headers);
170
- this.fontDescriptors[font].bolditalics = url.url;
171
- }
169
+ }
170
+ if (this.fontDescriptors[font].bolditalics) {
171
+ if (Array.isArray(this.fontDescriptors[font].bolditalics)) { // TrueType Collection
172
+ let url = getExtendedUrl(this.fontDescriptors[font].bolditalics[0]);
173
+ this.urlResolver.resolve(url.url, url.headers);
174
+ this.fontDescriptors[font].bolditalics[0] = url.url;
175
+ } else {
176
+ let url = getExtendedUrl(this.fontDescriptors[font].bolditalics);
177
+ this.urlResolver.resolve(url.url, url.headers);
178
+ this.fontDescriptors[font].bolditalics = url.url;
172
179
  }
173
180
  }
174
181
  }
182
+ }
175
183
 
176
- if (docDefinition.images) {
177
- for (let image in docDefinition.images) {
178
- if (docDefinition.images.hasOwnProperty(image)) {
179
- let url = getExtendedUrl(docDefinition.images[image]);
180
- this.urlResolver.resolve(url.url, url.headers);
181
- docDefinition.images[image] = url.url;
182
- }
184
+ if (docDefinition.images) {
185
+ for (let image in docDefinition.images) {
186
+ if (docDefinition.images.hasOwnProperty(image)) {
187
+ let url = getExtendedUrl(docDefinition.images[image]);
188
+ this.urlResolver.resolve(url.url, url.headers);
189
+ docDefinition.images[image] = url.url;
183
190
  }
184
191
  }
192
+ }
185
193
 
186
- if (docDefinition.attachments) {
187
- for (let attachment in docDefinition.attachments) {
188
- if (docDefinition.attachments.hasOwnProperty(attachment) && docDefinition.attachments[attachment].src) {
189
- let url = getExtendedUrl(docDefinition.attachments[attachment].src);
190
- this.urlResolver.resolve(url.url, url.headers);
191
- docDefinition.attachments[attachment].src = url.url;
192
- }
194
+ if (docDefinition.attachments) {
195
+ for (let attachment in docDefinition.attachments) {
196
+ if (docDefinition.attachments.hasOwnProperty(attachment) && docDefinition.attachments[attachment].src) {
197
+ let url = getExtendedUrl(docDefinition.attachments[attachment].src);
198
+ this.urlResolver.resolve(url.url, url.headers);
199
+ docDefinition.attachments[attachment].src = url.url;
193
200
  }
194
201
  }
202
+ }
195
203
 
196
- if (docDefinition.files) {
197
- for (let file in docDefinition.files) {
198
- if (docDefinition.files.hasOwnProperty(file) && docDefinition.files[file].src) {
199
- let url = getExtendedUrl(docDefinition.files[file].src);
200
- this.urlResolver.resolve(url.url, url.headers);
201
- docDefinition.files[file].src = url.url;
202
- }
204
+ if (docDefinition.files) {
205
+ for (let file in docDefinition.files) {
206
+ if (docDefinition.files.hasOwnProperty(file) && docDefinition.files[file].src) {
207
+ let url = getExtendedUrl(docDefinition.files[file].src);
208
+ this.urlResolver.resolve(url.url, url.headers);
209
+ docDefinition.files[file].src = url.url;
203
210
  }
204
211
  }
212
+ }
205
213
 
206
- this.urlResolver.resolved().then(() => {
207
- resolve();
208
- }, result => {
209
- reject(result);
210
- });
211
- });
214
+ await this.urlResolver.resolved();
212
215
  }
213
216
  }
214
217
 
package/src/Renderer.js CHANGED
@@ -27,7 +27,7 @@ const findFont = (fonts, requiredFonts, defaultFont) => {
27
27
  * @returns {number}
28
28
  */
29
29
  const offsetText = (y, inline) => {
30
- var newY = y;
30
+ let newY = y;
31
31
  if (inline.sup) {
32
32
  newY -= inline.fontSize * 0.75;
33
33
  }
@@ -45,7 +45,6 @@ class Renderer {
45
45
 
46
46
  renderPages(pages) {
47
47
  this.pdfDocument._pdfMakePages = pages; // TODO: Why?
48
- this.pdfDocument.addPage();
49
48
 
50
49
  let totalItems = 0;
51
50
  if (this.progressCallback) {
@@ -57,10 +56,7 @@ class Renderer {
57
56
  let renderedItems = 0;
58
57
 
59
58
  for (let i = 0; i < pages.length; i++) {
60
- if (i > 0) {
61
- this._updatePageOrientationInOptions(pages[i]);
62
- this.pdfDocument.addPage(this.pdfDocument.options);
63
- }
59
+ this.pdfDocument.addPage({ size: [pages[i].pageSize.width, pages[i].pageSize.height] });
64
60
 
65
61
  let page = pages[i];
66
62
  for (let ii = 0, il = page.items.length; ii < il; ii++) {
@@ -348,6 +344,17 @@ class Renderer {
348
344
  };
349
345
 
350
346
  SVGtoPDF(this.pdfDocument, svg.svg, svg.x, svg.y, options);
347
+
348
+ if (svg.link) {
349
+ this.pdfDocument.link(svg.x, svg.y, svg._width, svg._height, svg.link);
350
+ }
351
+ if (svg.linkToPage) {
352
+ this.pdfDocument.ref({ Type: 'Action', S: 'GoTo', D: [svg.linkToPage, 0, 0] }).end();
353
+ this.pdfDocument.annotate(svg.x, svg.y, svg._width, svg._height, { Subtype: 'Link', Dest: [svg.linkToPage - 1, 'XYZ', null, null, null] });
354
+ }
355
+ if (svg.linkToDestination) {
356
+ this.pdfDocument.goTo(svg.x, svg.y, svg._width, svg._height, svg.linkToDestination);
357
+ }
351
358
  }
352
359
 
353
360
  renderAttachment(attachment) {
@@ -391,15 +398,6 @@ class Renderer {
391
398
  this.pdfDocument.restore();
392
399
  }
393
400
 
394
- _updatePageOrientationInOptions(currentPage) {
395
- let previousPageOrientation = this.pdfDocument.options.size[0] > this.pdfDocument.options.size[1] ? 'landscape' : 'portrait';
396
-
397
- if (currentPage.pageSize.orientation !== previousPageOrientation) {
398
- let width = this.pdfDocument.options.size[0];
399
- let height = this.pdfDocument.options.size[1];
400
- this.pdfDocument.options.size = [height, width];
401
- }
402
- }
403
401
  }
404
402
 
405
403
  export default Renderer;
package/src/SVGMeasure.js CHANGED
@@ -7,7 +7,7 @@ import xmldoc from 'xmldoc';
7
7
  * @returns {?number}
8
8
  */
9
9
  const stripUnits = textVal => {
10
- var n = parseFloat(textVal);
10
+ let n = parseFloat(textVal);
11
11
  if (typeof n !== 'number' || isNaN(n)) {
12
12
  return undefined;
13
13
  }
@@ -21,7 +21,7 @@ const stripUnits = textVal => {
21
21
  * @returns {object}
22
22
  */
23
23
  const parseSVG = (svgString) => {
24
- var doc;
24
+ let doc;
25
25
 
26
26
  try {
27
27
  doc = new xmldoc.XmlDocument(svgString);
@@ -65,6 +65,10 @@ class StyleContextStack {
65
65
  return 0;
66
66
  }
67
67
 
68
+ if (typeof item.section !== 'undefined') { // section node not support style overrides
69
+ return 0;
70
+ }
71
+
68
72
  let styleNames = [];
69
73
 
70
74
  if (item.style) {