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.
- package/CHANGELOG.md +7 -48
- package/LICENSE +1 -1
- package/README.md +78 -85
- package/build/pdfmake.js +66833 -75014
- package/build/pdfmake.js.map +1 -1
- package/build/pdfmake.min.js +2 -2
- package/build/pdfmake.min.js.map +1 -1
- package/build/vfs_fonts.js +4 -4
- package/fonts/Roboto/Roboto-Italic.ttf +0 -0
- package/fonts/Roboto/Roboto-Medium.ttf +0 -0
- package/fonts/Roboto/Roboto-MediumItalic.ttf +0 -0
- package/fonts/Roboto/Roboto-Regular.ttf +0 -0
- package/js/DocMeasure.js +20 -1
- package/js/DocPreprocessor.js +21 -6
- package/js/DocumentContext.js +64 -17
- package/js/ElementWriter.js +31 -8
- package/js/LayoutBuilder.js +488 -127
- package/js/OutputDocument.js +22 -34
- package/js/OutputDocumentServer.js +6 -11
- package/js/PDFDocument.js +1 -1
- package/js/PageElementWriter.js +17 -2
- package/js/Printer.js +133 -133
- package/js/Renderer.js +22 -14
- package/js/SVGMeasure.js +2 -2
- package/js/StyleContextStack.js +4 -0
- package/js/TableProcessor.js +40 -14
- package/js/TextBreaker.js +31 -4
- package/js/TextInlines.js +1 -1
- package/js/URLResolver.js +25 -55
- package/js/base.js +1 -1
- package/js/browser-extensions/OutputDocumentBrowser.js +35 -72
- package/js/browser-extensions/index.js +2 -2
- package/js/browser-extensions/pdfMake.js +0 -12
- package/js/browser-extensions/standard-fonts/Courier.js +4 -4
- package/js/browser-extensions/standard-fonts/Helvetica.js +4 -4
- package/js/browser-extensions/standard-fonts/Symbol.js +1 -1
- package/js/browser-extensions/standard-fonts/Times.js +4 -4
- package/js/browser-extensions/standard-fonts/ZapfDingbats.js +1 -1
- package/js/helpers/tools.js +6 -0
- package/js/index.js +1 -1
- package/package.json +25 -24
- package/src/DocMeasure.js +21 -1
- package/src/DocPreprocessor.js +25 -6
- package/src/DocumentContext.js +56 -20
- package/src/ElementWriter.js +30 -7
- package/src/LayoutBuilder.js +531 -144
- package/src/OutputDocument.js +23 -37
- package/src/OutputDocumentServer.js +6 -11
- package/src/PDFDocument.js +1 -1
- package/src/PageElementWriter.js +21 -2
- package/src/Printer.js +134 -131
- package/src/Renderer.js +13 -15
- package/src/SVGMeasure.js +2 -2
- package/src/StyleContextStack.js +4 -0
- package/src/TableProcessor.js +42 -18
- package/src/TextBreaker.js +24 -5
- package/src/TextInlines.js +1 -1
- package/src/URLResolver.js +24 -58
- package/src/base.js +1 -1
- package/src/browser-extensions/OutputDocumentBrowser.js +33 -71
- package/src/browser-extensions/index.js +3 -3
- package/src/browser-extensions/pdfMake.js +0 -14
- package/src/browser-extensions/standard-fonts/Courier.js +4 -4
- package/src/browser-extensions/standard-fonts/Helvetica.js +4 -4
- package/src/browser-extensions/standard-fonts/Symbol.js +1 -1
- package/src/browser-extensions/standard-fonts/Times.js +4 -4
- package/src/browser-extensions/standard-fonts/ZapfDingbats.js +1 -1
- package/src/columnCalculator.js +12 -12
- package/src/helpers/tools.js +5 -0
- package/src/helpers/variableType.js +1 -1
- package/src/index.js +1 -1
- package/standard-fonts/Helvetica.js +0 -1
- package/js/browser-extensions/URLBrowserResolver.js +0 -76
- package/src/browser-extensions/URLBrowserResolver.js +0 -84
package/src/OutputDocument.js
CHANGED
|
@@ -20,57 +20,43 @@ class OutputDocument {
|
|
|
20
20
|
* @returns {Promise<Buffer>}
|
|
21
21
|
*/
|
|
22
22
|
getBuffer() {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
let
|
|
29
|
-
stream.
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
55
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
|
package/src/PDFDocument.js
CHANGED
package/src/PageElementWriter.js
CHANGED
|
@@ -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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
97
|
-
|
|
87
|
+
this.pdfKitDoc = new PDFDocument(this.fontDescriptors, docDefinition.images, docDefinition.patterns, docDefinition.attachments, pdfOptions, this.virtualfs);
|
|
88
|
+
embedFiles(docDefinition, this.pdfKitDoc);
|
|
98
89
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
131
|
+
if (this.urlResolver === null) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
126
134
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
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
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
24
|
+
let doc;
|
|
25
25
|
|
|
26
26
|
try {
|
|
27
27
|
doc = new xmldoc.XmlDocument(svgString);
|