@polotno/pdf-export 0.1.18 → 0.1.19
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/README.md +52 -0
- package/lib/figure.d.ts +10 -0
- package/lib/figure.js +53 -48
- package/lib/ghostscript.d.ts +21 -0
- package/lib/ghostscript.js +101 -128
- package/lib/group.d.ts +5 -0
- package/lib/group.js +4 -8
- package/lib/image.d.ts +19 -0
- package/lib/image.js +134 -89
- package/lib/index.d.ts +26 -0
- package/lib/index.js +130 -0
- package/lib/line.d.ts +10 -0
- package/lib/line.js +41 -57
- package/lib/spot-colors.d.ts +38 -0
- package/lib/spot-colors.js +141 -0
- package/lib/svg-render.d.ts +9 -0
- package/lib/svg-render.js +19 -28
- package/lib/svg.d.ts +11 -0
- package/lib/svg.js +203 -232
- package/lib/text.d.ts +28 -0
- package/lib/text.js +147 -174
- package/lib/utils.d.ts +15 -0
- package/lib/utils.js +88 -72
- package/package.json +22 -14
- package/index.js +0 -130
package/index.js
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
const PDFDocument = require('pdfkit');
|
|
2
|
-
const fs = require('fs');
|
|
3
|
-
const path = require('path');
|
|
4
|
-
const { srcToBuffer, parseColor } = require('./lib/utils');
|
|
5
|
-
const { renderImage } = require('./lib/image');
|
|
6
|
-
const { loadFontIfNeeded, renderText } = require('./lib/text');
|
|
7
|
-
const { renderFigure } = require('./lib/figure');
|
|
8
|
-
const { renderGroup } = require('./lib/group');
|
|
9
|
-
const { lineToPDF } = require('./lib/line');
|
|
10
|
-
const { renderSVG } = require('./lib/svg-render');
|
|
11
|
-
const { convertToPDFX1a, validatePDFX1a } = require('./lib/ghostscript');
|
|
12
|
-
const SVGtoPDF = require('svg-to-pdfkit');
|
|
13
|
-
|
|
14
|
-
PDFDocument.prototype.addSVG = function (svg, x, y, options) {
|
|
15
|
-
return SVGtoPDF(this, svg, x, y, options), this;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
async function renderElement({ doc, element, fonts, attrs }) {
|
|
19
|
-
if (!element.visible || !element.showInExport) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
doc.save();
|
|
24
|
-
if (element.type !== 'group') {
|
|
25
|
-
doc.translate(element.x, element.y);
|
|
26
|
-
doc.rotate(element.rotation);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if (element.opacity !== undefined) {
|
|
30
|
-
doc.opacity(element.opacity);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if (element.type === 'group') {
|
|
34
|
-
await renderGroup(doc, element, renderElement, fonts, attrs);
|
|
35
|
-
} else if (element.type === 'text') {
|
|
36
|
-
await loadFontIfNeeded(doc, element, fonts);
|
|
37
|
-
renderText(doc, element, attrs);
|
|
38
|
-
} else if (element.type === 'line') {
|
|
39
|
-
lineToPDF(doc, element);
|
|
40
|
-
} else if (element.type === 'image') {
|
|
41
|
-
await renderImage(doc, element);
|
|
42
|
-
} else if (element.type === 'svg') {
|
|
43
|
-
await renderSVG(doc, element);
|
|
44
|
-
} else if (element.type === 'figure') {
|
|
45
|
-
renderFigure(doc, element);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
doc.restore();
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
module.exports.jsonToPDF = async function jsonToPDF(
|
|
52
|
-
json,
|
|
53
|
-
pdfFileName,
|
|
54
|
-
attrs = {}
|
|
55
|
-
) {
|
|
56
|
-
const fonts = {};
|
|
57
|
-
|
|
58
|
-
var doc = new PDFDocument({
|
|
59
|
-
size: [json.width, json.height],
|
|
60
|
-
autoFirstPage: false,
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
for (const font of json.fonts) {
|
|
64
|
-
doc.registerFont(font.fontFamily, await srcToBuffer(font.url));
|
|
65
|
-
fonts[font.fontFamily] = true;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
for (const page of json.pages) {
|
|
69
|
-
doc.addPage();
|
|
70
|
-
if (page.background) {
|
|
71
|
-
const isURL =
|
|
72
|
-
page.background.indexOf('http') >= 0 ||
|
|
73
|
-
page.background.indexOf('.png') >= 0 ||
|
|
74
|
-
page.background.indexOf('.jpg') >= 0;
|
|
75
|
-
|
|
76
|
-
if (isURL) {
|
|
77
|
-
doc.image(await srcToBuffer(page.background), 0, 0);
|
|
78
|
-
} else {
|
|
79
|
-
doc.rect(0, 0, json.width, json.height);
|
|
80
|
-
doc.fill(parseColor(page.background).hex);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
for (const element of page.children) {
|
|
84
|
-
await renderElement({ doc, element, fonts, attrs });
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
doc.end();
|
|
89
|
-
|
|
90
|
-
await new Promise((r) =>
|
|
91
|
-
doc.pipe(fs.createWriteStream(pdfFileName)).on('finish', r)
|
|
92
|
-
);
|
|
93
|
-
|
|
94
|
-
// Optional PDF/X-1a conversion
|
|
95
|
-
if (attrs.pdfx1a) {
|
|
96
|
-
console.log('Converting to PDF/X-1a...');
|
|
97
|
-
const tempFileName = pdfFileName.replace('.pdf', '-temp.pdf');
|
|
98
|
-
|
|
99
|
-
// Rename current file to temp
|
|
100
|
-
fs.renameSync(pdfFileName, tempFileName);
|
|
101
|
-
|
|
102
|
-
try {
|
|
103
|
-
// Convert temp file to PDF/X-1a
|
|
104
|
-
await convertToPDFX1a(tempFileName, pdfFileName, {
|
|
105
|
-
metadata: attrs.metadata || {},
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
// Clean up temp file
|
|
109
|
-
fs.unlinkSync(tempFileName);
|
|
110
|
-
|
|
111
|
-
// Optional validation
|
|
112
|
-
if (attrs.validate) {
|
|
113
|
-
const isValid = await validatePDFX1a(pdfFileName);
|
|
114
|
-
if (!isValid) {
|
|
115
|
-
console.warn(
|
|
116
|
-
'Warning: Generated PDF may not be fully PDF/X-1a compliant'
|
|
117
|
-
);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
console.log('PDF/X-1a conversion completed');
|
|
122
|
-
} catch (error) {
|
|
123
|
-
// Restore original file if conversion fails
|
|
124
|
-
if (fs.existsSync(tempFileName)) {
|
|
125
|
-
fs.renameSync(tempFileName, pdfFileName);
|
|
126
|
-
}
|
|
127
|
-
throw new Error(`PDF/X-1a conversion failed: ${error.message}`);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
};
|