@things-factory/integration-headless 7.0.49 → 7.0.54
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/dist-server/engine/task/headless-pdf-capture-board.d.ts +59 -1
- package/dist-server/engine/task/headless-pdf-capture-board.js +29 -250
- package/dist-server/engine/task/headless-pdf-capture-board.js.map +1 -1
- package/dist-server/engine/task/headless-pdf-capture-markdown.d.ts +52 -0
- package/dist-server/engine/task/headless-pdf-capture-markdown.js +38 -0
- package/dist-server/engine/task/headless-pdf-capture-markdown.js.map +1 -0
- package/dist-server/engine/task/headless-pdf-capture.d.ts +52 -1
- package/dist-server/engine/task/headless-pdf-capture.js +13 -196
- package/dist-server/engine/task/headless-pdf-capture.js.map +1 -1
- package/dist-server/engine/task/headless-pdf-open.js +27 -257
- package/dist-server/engine/task/headless-pdf-open.js.map +1 -1
- package/dist-server/engine/task/headless-pdf-save.js +32 -20
- package/dist-server/engine/task/headless-pdf-save.js.map +1 -1
- package/dist-server/engine/task/index.d.ts +1 -0
- package/dist-server/engine/task/index.js +1 -0
- package/dist-server/engine/task/index.js.map +1 -1
- package/dist-server/engine/task/pdf-capture-util.d.ts +96 -0
- package/dist-server/engine/task/pdf-capture-util.js +252 -0
- package/dist-server/engine/task/pdf-capture-util.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/server/engine/task/headless-pdf-capture-board.ts +41 -293
- package/server/engine/task/headless-pdf-capture-markdown.ts +41 -0
- package/server/engine/task/headless-pdf-capture.ts +12 -226
- package/server/engine/task/headless-pdf-open.ts +28 -292
- package/server/engine/task/headless-pdf-save.ts +34 -21
- package/server/engine/task/index.ts +1 -0
- package/server/engine/task/pdf-capture-util.ts +319 -0
|
@@ -1,217 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
const ejs = tslib_1.__importStar(require("ejs"));
|
|
3
|
+
exports.HeadlessPDFCapture = HeadlessPDFCapture;
|
|
5
4
|
const integration_base_1 = require("@things-factory/integration-base");
|
|
6
|
-
const integration_base_2 = require("@things-factory/integration-base");
|
|
7
5
|
const utils_1 = require("@things-factory/utils");
|
|
8
|
-
const
|
|
6
|
+
const pdf_capture_util_1 = require("./pdf-capture-util");
|
|
9
7
|
async function HeadlessPDFCapture(step, context) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var { domain, data, logger, __headless_pdf } = context;
|
|
13
|
-
if (!__headless_pdf) {
|
|
14
|
-
throw new Error('It requires headless-pdf-open to be performed first');
|
|
15
|
-
}
|
|
16
|
-
var { pdfDoc, header, footer, watermark } = __headless_pdf;
|
|
17
|
-
var headlessPool = integration_base_2.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
|
|
18
|
-
let browser;
|
|
8
|
+
const pdfUtil = new pdf_capture_util_1.PDFCaptureUtil(context);
|
|
9
|
+
await pdfUtil.initBrowser(step.connection);
|
|
19
10
|
try {
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
return ejs.render(template, data);
|
|
26
|
-
}
|
|
27
|
-
catch (error) {
|
|
28
|
-
logger.warn(`Template rendering error: ${error.message}`);
|
|
29
|
-
return template;
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
const renderedHtmlContent = renderTemplateSafely(htmlContent, templateInput);
|
|
33
|
-
await page.setContent(renderedHtmlContent);
|
|
34
|
-
header = renderTemplateSafely(header, __headless_pdf);
|
|
35
|
-
footer = renderTemplateSafely(footer, __headless_pdf);
|
|
36
|
-
// Apply header, footer, and watermark using Puppeteer
|
|
37
|
-
if (header || footer || watermark) {
|
|
38
|
-
await page.evaluate(({ header, footer, watermark, isLandscape }) => {
|
|
39
|
-
const setPositioning = (element, position) => {
|
|
40
|
-
element.style.position = 'fixed';
|
|
41
|
-
element.style.left = '0';
|
|
42
|
-
element.style.width = '100%';
|
|
43
|
-
element.style.textAlign = 'center';
|
|
44
|
-
element.style.fontSize = '12px';
|
|
45
|
-
element.style.margin = '0';
|
|
46
|
-
element.style.padding = '0';
|
|
47
|
-
if (position === 'header') {
|
|
48
|
-
element.style.top = '0';
|
|
49
|
-
}
|
|
50
|
-
else if (position === 'footer') {
|
|
51
|
-
element.style.bottom = '0';
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
if (header) {
|
|
55
|
-
const headerElement = document.createElement('div');
|
|
56
|
-
headerElement.innerHTML = header;
|
|
57
|
-
setPositioning(headerElement, 'header');
|
|
58
|
-
document.body.appendChild(headerElement);
|
|
59
|
-
}
|
|
60
|
-
if (footer) {
|
|
61
|
-
const footerElement = document.createElement('div');
|
|
62
|
-
footerElement.innerHTML = footer;
|
|
63
|
-
setPositioning(footerElement, 'footer');
|
|
64
|
-
document.body.appendChild(footerElement);
|
|
65
|
-
}
|
|
66
|
-
if (watermark) {
|
|
67
|
-
const watermarkElement = document.createElement('div');
|
|
68
|
-
watermarkElement.innerHTML = watermark;
|
|
69
|
-
watermarkElement.style.position = 'fixed';
|
|
70
|
-
watermarkElement.style.top = isLandscape ? '40%' : '50%';
|
|
71
|
-
watermarkElement.style.left = '50%';
|
|
72
|
-
watermarkElement.style.transform = 'translate(-50%, -50%) rotate(-45deg)';
|
|
73
|
-
watermarkElement.style.opacity = '0.2';
|
|
74
|
-
watermarkElement.style.fontSize = '50px';
|
|
75
|
-
watermarkElement.style.color = 'red';
|
|
76
|
-
watermarkElement.style.pointerEvents = 'none';
|
|
77
|
-
watermarkElement.style.zIndex = '9999';
|
|
78
|
-
document.body.appendChild(watermarkElement);
|
|
79
|
-
}
|
|
80
|
-
}, { header, footer, watermark, isLandscape: landscape });
|
|
81
|
-
}
|
|
82
|
-
if (preferCSSPageSize) {
|
|
83
|
-
width = undefined;
|
|
84
|
-
height = undefined;
|
|
85
|
-
}
|
|
86
|
-
const pageOptions = {
|
|
87
|
-
format,
|
|
88
|
-
width,
|
|
89
|
-
height,
|
|
90
|
-
margin: {
|
|
91
|
-
top: marginTop,
|
|
92
|
-
right: marginRight,
|
|
93
|
-
bottom: marginBottom,
|
|
94
|
-
left: marginLeft
|
|
95
|
-
},
|
|
96
|
-
scale,
|
|
97
|
-
printBackground,
|
|
98
|
-
landscape,
|
|
99
|
-
displayHeaderFooter: false, // Handled via Puppeteer directly
|
|
100
|
-
preferCSSPageSize
|
|
101
|
-
};
|
|
102
|
-
const contentBuffer = await page.pdf(pageOptions);
|
|
103
|
-
const contentPdfDoc = await pdf_lib_1.PDFDocument.load(contentBuffer);
|
|
104
|
-
const copiedPages = await pdfDoc.copyPages(contentPdfDoc, contentPdfDoc.getPageIndices());
|
|
105
|
-
copiedPages.forEach(page => pdfDoc.addPage(page));
|
|
106
|
-
__headless_pdf.pageCount += copiedPages.length;
|
|
107
|
-
await page.close();
|
|
108
|
-
headlessPool.release(browser);
|
|
11
|
+
const { accessor, htmlContent } = step.params;
|
|
12
|
+
const templateInput = (0, utils_1.access)(accessor, context.data);
|
|
13
|
+
const renderedHtmlContent = pdfUtil.renderTemplate(htmlContent, templateInput);
|
|
14
|
+
await pdfUtil.processPageAndGeneratePDF(step.params, renderedHtmlContent);
|
|
109
15
|
return {
|
|
110
|
-
data: __headless_pdf
|
|
16
|
+
data: context.__headless_pdf
|
|
111
17
|
};
|
|
112
18
|
}
|
|
113
19
|
catch (error) {
|
|
114
|
-
if (browser) {
|
|
115
|
-
await browser.close();
|
|
116
|
-
}
|
|
117
20
|
throw error;
|
|
118
21
|
}
|
|
22
|
+
finally {
|
|
23
|
+
await pdfUtil.closeBrowser();
|
|
24
|
+
}
|
|
119
25
|
}
|
|
120
26
|
HeadlessPDFCapture.parameterSpec = [
|
|
121
|
-
|
|
122
|
-
type: 'scenario-step-input',
|
|
123
|
-
name: 'accessor',
|
|
124
|
-
label: 'accessor'
|
|
125
|
-
},
|
|
27
|
+
...(0, pdf_capture_util_1.getCommonParameterSpec)(),
|
|
126
28
|
{
|
|
127
29
|
type: 'textarea',
|
|
128
30
|
name: 'htmlContent',
|
|
129
31
|
label: 'html-content'
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
type: 'select',
|
|
133
|
-
name: 'format',
|
|
134
|
-
label: 'page-format',
|
|
135
|
-
property: {
|
|
136
|
-
options: [
|
|
137
|
-
{ display: '', value: '' },
|
|
138
|
-
{ display: 'A4', value: 'A4' },
|
|
139
|
-
{ display: 'A3', value: 'A3' },
|
|
140
|
-
{ display: 'Letter', value: 'Letter' },
|
|
141
|
-
{ display: 'Legal', value: 'Legal' }
|
|
142
|
-
]
|
|
143
|
-
},
|
|
144
|
-
description: 'Select the paper format for the PDF'
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
type: 'string',
|
|
148
|
-
name: 'width',
|
|
149
|
-
label: 'page-width',
|
|
150
|
-
placeholder: '(e.g., "8.5in", "21cm", "600px")',
|
|
151
|
-
description: 'Specify the width of the page (e.g., "8.5in", "21cm", "600px")'
|
|
152
|
-
},
|
|
153
|
-
{
|
|
154
|
-
type: 'string',
|
|
155
|
-
name: 'height',
|
|
156
|
-
label: 'page-height',
|
|
157
|
-
placeholder: '(e.g., "11in", "29.7cm", "800px")',
|
|
158
|
-
description: 'Specify the height of the page (e.g., "11in", "29.7cm", "800px")'
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
type: 'string',
|
|
162
|
-
name: 'marginTop',
|
|
163
|
-
label: 'page-margin-top',
|
|
164
|
-
placeholder: '(e.g., "0.5in", "1cm", "100px")',
|
|
165
|
-
description: 'Set the top margin for the page'
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
type: 'string',
|
|
169
|
-
name: 'marginBottom',
|
|
170
|
-
label: 'page-margin-bottom',
|
|
171
|
-
placeholder: '(e.g., "0.5in", "1cm", "100px")',
|
|
172
|
-
description: 'Set the bottom margin for the page'
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
type: 'string',
|
|
176
|
-
name: 'marginLeft',
|
|
177
|
-
label: 'page-margin-left',
|
|
178
|
-
placeholder: '(e.g., "0.5in", "1cm", "100px")',
|
|
179
|
-
description: 'Set the left margin for the page'
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
type: 'string',
|
|
183
|
-
name: 'marginRight',
|
|
184
|
-
label: 'page-margin-right',
|
|
185
|
-
placeholder: '(e.g., "0.5in", "1cm", "100px")',
|
|
186
|
-
description: 'Set the right margin for the page'
|
|
187
|
-
},
|
|
188
|
-
{
|
|
189
|
-
type: 'number',
|
|
190
|
-
name: 'scale',
|
|
191
|
-
label: 'page-scale',
|
|
192
|
-
defaultValue: 1,
|
|
193
|
-
description: 'Set the scale of the page content (default is 1)'
|
|
194
|
-
},
|
|
195
|
-
{
|
|
196
|
-
type: 'boolean',
|
|
197
|
-
name: 'printBackground',
|
|
198
|
-
label: 'print-background',
|
|
199
|
-
defaultValue: true,
|
|
200
|
-
description: 'Include background graphics when printing the page'
|
|
201
|
-
},
|
|
202
|
-
{
|
|
203
|
-
type: 'boolean',
|
|
204
|
-
name: 'landscape',
|
|
205
|
-
label: 'landscape',
|
|
206
|
-
defaultValue: false,
|
|
207
|
-
description: 'Print the PDF in landscape orientation'
|
|
208
|
-
},
|
|
209
|
-
{
|
|
210
|
-
type: 'boolean',
|
|
211
|
-
name: 'preferCSSPageSize',
|
|
212
|
-
label: 'prefer-css-page-size',
|
|
213
|
-
defaultValue: false,
|
|
214
|
-
description: 'Whether to prefer the CSS-defined page size over the given width and height'
|
|
215
32
|
}
|
|
216
33
|
];
|
|
217
34
|
HeadlessPDFCapture.help = 'integration/task/headless-pdf-capture';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headless-pdf-capture.js","sourceRoot":"","sources":["../../../server/engine/task/headless-pdf-capture.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ejs from 'ejs'\nimport { TaskRegistry } from '@things-factory/integration-base'\nimport { ConnectionManager } from '@things-factory/integration-base'\nimport { access } from '@things-factory/utils'\nimport { PDFDocument } from 'pdf-lib'\n\nasync function HeadlessPDFCapture(step, context) {\n var { connection: connectionName, params: stepOptions } = step\n var {\n accessor,\n htmlContent,\n format,\n width,\n height,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n scale,\n printBackground,\n landscape,\n preferCSSPageSize\n } = stepOptions || {}\n var { domain, data, logger, __headless_pdf } = context\n\n if (!__headless_pdf) {\n throw new Error('It requires headless-pdf-open to be performed first')\n }\n\n var { pdfDoc, header, footer, watermark } = __headless_pdf\n\n var headlessPool = ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n let browser\n\n try {\n browser = await headlessPool.acquire()\n const page = await browser.newPage()\n\n const templateInput = access(accessor, data)\n\n const renderTemplateSafely = (template, data) => {\n try {\n return ejs.render(template, data)\n } catch (error) {\n logger.warn(`Template rendering error: ${error.message}`)\n return template\n }\n }\n\n const renderedHtmlContent = renderTemplateSafely(htmlContent, templateInput)\n await page.setContent(renderedHtmlContent)\n\n header = renderTemplateSafely(header, __headless_pdf)\n footer = renderTemplateSafely(footer, __headless_pdf)\n\n // Apply header, footer, and watermark using Puppeteer\n if (header || footer || watermark) {\n await page.evaluate(\n ({ header, footer, watermark, isLandscape }) => {\n const setPositioning = (element, position) => {\n element.style.position = 'fixed'\n element.style.left = '0'\n element.style.width = '100%'\n element.style.textAlign = 'center'\n element.style.fontSize = '12px'\n element.style.margin = '0'\n element.style.padding = '0'\n if (position === 'header') {\n element.style.top = '0'\n } else if (position === 'footer') {\n element.style.bottom = '0'\n }\n }\n\n if (header) {\n const headerElement = document.createElement('div')\n headerElement.innerHTML = header\n setPositioning(headerElement, 'header')\n document.body.appendChild(headerElement)\n }\n\n if (footer) {\n const footerElement = document.createElement('div')\n footerElement.innerHTML = footer\n setPositioning(footerElement, 'footer')\n document.body.appendChild(footerElement)\n }\n\n if (watermark) {\n const watermarkElement = document.createElement('div')\n watermarkElement.innerHTML = watermark\n watermarkElement.style.position = 'fixed'\n watermarkElement.style.top = isLandscape ? '40%' : '50%'\n watermarkElement.style.left = '50%'\n watermarkElement.style.transform = 'translate(-50%, -50%) rotate(-45deg)'\n watermarkElement.style.opacity = '0.2'\n watermarkElement.style.fontSize = '50px'\n watermarkElement.style.color = 'red'\n watermarkElement.style.pointerEvents = 'none'\n watermarkElement.style.zIndex = '9999'\n document.body.appendChild(watermarkElement)\n }\n },\n { header, footer, watermark, isLandscape: landscape }\n )\n }\n\n if (preferCSSPageSize) {\n width = undefined\n height = undefined\n }\n\n const pageOptions = {\n format,\n width,\n height,\n margin: {\n top: marginTop,\n right: marginRight,\n bottom: marginBottom,\n left: marginLeft\n },\n scale,\n printBackground,\n landscape,\n displayHeaderFooter: false, // Handled via Puppeteer directly\n preferCSSPageSize\n }\n\n const contentBuffer = await page.pdf(pageOptions)\n const contentPdfDoc = await PDFDocument.load(contentBuffer)\n const copiedPages = await pdfDoc.copyPages(contentPdfDoc, contentPdfDoc.getPageIndices())\n\n copiedPages.forEach(page => pdfDoc.addPage(page))\n\n __headless_pdf.pageCount += copiedPages.length\n\n await page.close()\n headlessPool.release(browser)\n\n return {\n data: __headless_pdf\n }\n } catch (error) {\n if (browser) {\n await browser.close()\n }\n\n throw error\n }\n}\n\nHeadlessPDFCapture.parameterSpec = [\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n },\n {\n type: 'textarea',\n name: 'htmlContent',\n label: 'html-content'\n },\n {\n type: 'select',\n name: 'format',\n label: 'page-format',\n property: {\n options: [\n { display: '', value: '' },\n { display: 'A4', value: 'A4' },\n { display: 'A3', value: 'A3' },\n { display: 'Letter', value: 'Letter' },\n { display: 'Legal', value: 'Legal' }\n ]\n },\n description: 'Select the paper format for the PDF'\n },\n {\n type: 'string',\n name: 'width',\n label: 'page-width',\n placeholder: '(e.g., \"8.5in\", \"21cm\", \"600px\")',\n description: 'Specify the width of the page (e.g., \"8.5in\", \"21cm\", \"600px\")'\n },\n {\n type: 'string',\n name: 'height',\n label: 'page-height',\n placeholder: '(e.g., \"11in\", \"29.7cm\", \"800px\")',\n description: 'Specify the height of the page (e.g., \"11in\", \"29.7cm\", \"800px\")'\n },\n {\n type: 'string',\n name: 'marginTop',\n label: 'page-margin-top',\n placeholder: '(e.g., \"0.5in\", \"1cm\", \"100px\")',\n description: 'Set the top margin for the page'\n },\n {\n type: 'string',\n name: 'marginBottom',\n label: 'page-margin-bottom',\n placeholder: '(e.g., \"0.5in\", \"1cm\", \"100px\")',\n description: 'Set the bottom margin for the page'\n },\n {\n type: 'string',\n name: 'marginLeft',\n label: 'page-margin-left',\n placeholder: '(e.g., \"0.5in\", \"1cm\", \"100px\")',\n description: 'Set the left margin for the page'\n },\n {\n type: 'string',\n name: 'marginRight',\n label: 'page-margin-right',\n placeholder: '(e.g., \"0.5in\", \"1cm\", \"100px\")',\n description: 'Set the right margin for the page'\n },\n {\n type: 'number',\n name: 'scale',\n label: 'page-scale',\n defaultValue: 1,\n description: 'Set the scale of the page content (default is 1)'\n },\n {\n type: 'boolean',\n name: 'printBackground',\n label: 'print-background',\n defaultValue: true,\n description: 'Include background graphics when printing the page'\n },\n {\n type: 'boolean',\n name: 'landscape',\n label: 'landscape',\n defaultValue: false,\n description: 'Print the PDF in landscape orientation'\n },\n {\n type: 'boolean',\n name: 'preferCSSPageSize',\n label: 'prefer-css-page-size',\n defaultValue: false,\n description: 'Whether to prefer the CSS-defined page size over the given width and height'\n }\n]\n\nHeadlessPDFCapture.help = 'integration/task/headless-pdf-capture'\n\nTaskRegistry.registerTaskHandler('headless-pdf-capture', HeadlessPDFCapture)\n"]}
|
|
1
|
+
{"version":3,"file":"headless-pdf-capture.js","sourceRoot":"","sources":["../../../server/engine/task/headless-pdf-capture.ts"],"names":[],"mappings":";;AAKA,gDAoBC;AAzBD,uEAA+D;AAC/D,iDAA8C;AAE9C,yDAA2E;AAEpE,KAAK,UAAU,kBAAkB,CAAC,IAAI,EAAE,OAAO;IACpD,MAAM,OAAO,GAAG,IAAI,iCAAc,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAE1C,IAAI,CAAC;QACH,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAC7C,MAAM,aAAa,GAAG,IAAA,cAAM,EAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QAEpD,MAAM,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;QAE9E,MAAM,OAAO,CAAC,yBAAyB,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;QAEzE,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,cAAc;SAC7B,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,CAAA;IACb,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,YAAY,EAAE,CAAA;IAC9B,CAAC;AACH,CAAC;AAED,kBAAkB,CAAC,aAAa,GAAG;IACjC,GAAG,IAAA,yCAAsB,GAAE;IAC3B;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,cAAc;KACtB;CACF,CAAA;AAED,kBAAkB,CAAC,IAAI,GAAG,uCAAuC,CAAA;AAEjE,+BAAY,CAAC,mBAAmB,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAAA","sourcesContent":["import { TaskRegistry } from '@things-factory/integration-base'\nimport { access } from '@things-factory/utils'\n\nimport { PDFCaptureUtil, getCommonParameterSpec } from './pdf-capture-util'\n\nexport async function HeadlessPDFCapture(step, context) {\n const pdfUtil = new PDFCaptureUtil(context)\n await pdfUtil.initBrowser(step.connection)\n\n try {\n const { accessor, htmlContent } = step.params\n const templateInput = access(accessor, context.data)\n\n const renderedHtmlContent = pdfUtil.renderTemplate(htmlContent, templateInput)\n\n await pdfUtil.processPageAndGeneratePDF(step.params, renderedHtmlContent)\n\n return {\n data: context.__headless_pdf\n }\n } catch (error) {\n throw error\n } finally {\n await pdfUtil.closeBrowser()\n }\n}\n\nHeadlessPDFCapture.parameterSpec = [\n ...getCommonParameterSpec(),\n {\n type: 'textarea',\n name: 'htmlContent',\n label: 'html-content'\n }\n]\n\nHeadlessPDFCapture.help = 'integration/task/headless-pdf-capture'\n\nTaskRegistry.registerTaskHandler('headless-pdf-capture', HeadlessPDFCapture)\n"]}
|
|
@@ -1,198 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const tslib_1 = require("tslib");
|
|
4
|
-
const ejs = tslib_1.__importStar(require("ejs"));
|
|
5
3
|
const pdf_lib_1 = require("pdf-lib");
|
|
6
4
|
const integration_base_1 = require("@things-factory/integration-base");
|
|
7
|
-
const integration_base_2 = require("@things-factory/integration-base");
|
|
8
5
|
const utils_1 = require("@things-factory/utils");
|
|
6
|
+
const pdf_capture_util_1 = require("./pdf-capture-util");
|
|
9
7
|
async function HeadlessPDFOpen(step, context) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const { data
|
|
13
|
-
const headlessPool = integration_base_2.ConnectionManager.getConnectionInstanceByName(context.domain, connectionName);
|
|
14
|
-
let browser;
|
|
8
|
+
const { connection: connectionName, params: stepOptions } = step;
|
|
9
|
+
const { accessor, coverPage, lastPage, header, footer, watermark, fileName } = stepOptions || {};
|
|
10
|
+
const { data } = context;
|
|
15
11
|
// Create a new PDF document using pdf-lib
|
|
16
12
|
const pdfDoc = await pdf_lib_1.PDFDocument.create();
|
|
13
|
+
const pdfInfo = {
|
|
14
|
+
pdfDoc,
|
|
15
|
+
header,
|
|
16
|
+
footer,
|
|
17
|
+
watermark,
|
|
18
|
+
fileName,
|
|
19
|
+
pageCount: 0
|
|
20
|
+
};
|
|
21
|
+
context.__headless_pdf = pdfInfo;
|
|
22
|
+
const pdfUtil = new pdf_capture_util_1.PDFCaptureUtil(context);
|
|
23
|
+
await pdfUtil.initBrowser(connectionName);
|
|
17
24
|
try {
|
|
18
|
-
browser = await headlessPool.acquire();
|
|
19
|
-
const page = await browser.newPage();
|
|
20
25
|
const templateInput = (0, utils_1.access)(accessor, data);
|
|
21
|
-
const renderTemplateSafely = (template, data) => {
|
|
22
|
-
try {
|
|
23
|
-
return ejs.render(template, data);
|
|
24
|
-
}
|
|
25
|
-
catch (error) {
|
|
26
|
-
logger.warn(`Template rendering error: ${error.message}`);
|
|
27
|
-
return template;
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
26
|
// Convert Cover Page to PDF and add it to the document (if provided)
|
|
31
27
|
if (coverPage) {
|
|
32
|
-
const renderedCoverPage =
|
|
33
|
-
await
|
|
34
|
-
// Apply header, footer, and watermark using Puppeteer
|
|
35
|
-
// Apply header, footer, and watermark using Puppeteer
|
|
36
|
-
if (header || footer || watermark) {
|
|
37
|
-
await page.evaluate(({ header, footer, watermark, isLandscape }) => {
|
|
38
|
-
const setPositioning = (element, position) => {
|
|
39
|
-
element.style.position = 'fixed';
|
|
40
|
-
element.style.left = '0';
|
|
41
|
-
element.style.width = '100%';
|
|
42
|
-
element.style.textAlign = 'center';
|
|
43
|
-
element.style.fontSize = '12px';
|
|
44
|
-
if (position === 'header') {
|
|
45
|
-
element.style.top = '0';
|
|
46
|
-
}
|
|
47
|
-
else if (position === 'footer') {
|
|
48
|
-
element.style.bottom = '0';
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
// if (header) {
|
|
52
|
-
// const headerElement = document.createElement('div')
|
|
53
|
-
// headerElement.innerHTML = header
|
|
54
|
-
// setPositioning(headerElement, 'header')
|
|
55
|
-
// document.body.appendChild(headerElement)
|
|
56
|
-
// }
|
|
57
|
-
// if (footer) {
|
|
58
|
-
// const footerElement = document.createElement('div')
|
|
59
|
-
// footerElement.innerHTML = footer
|
|
60
|
-
// setPositioning(footerElement, 'footer')
|
|
61
|
-
// document.body.appendChild(footerElement)
|
|
62
|
-
// }
|
|
63
|
-
if (watermark) {
|
|
64
|
-
const watermarkElement = document.createElement('div');
|
|
65
|
-
watermarkElement.innerHTML = watermark;
|
|
66
|
-
watermarkElement.style.position = 'fixed';
|
|
67
|
-
watermarkElement.style.top = isLandscape ? '40%' : '50%';
|
|
68
|
-
watermarkElement.style.left = '50%';
|
|
69
|
-
watermarkElement.style.transform = 'translate(-50%, -50%) rotate(-45deg)';
|
|
70
|
-
watermarkElement.style.opacity = '0.2';
|
|
71
|
-
watermarkElement.style.fontSize = '50px';
|
|
72
|
-
watermarkElement.style.color = 'red';
|
|
73
|
-
watermarkElement.style.pointerEvents = 'none';
|
|
74
|
-
watermarkElement.style.zIndex = '9999';
|
|
75
|
-
document.body.appendChild(watermarkElement);
|
|
76
|
-
}
|
|
77
|
-
}, { header, footer, watermark, isLandscape: landscape });
|
|
78
|
-
}
|
|
79
|
-
const pageOptions = {
|
|
80
|
-
format,
|
|
81
|
-
width,
|
|
82
|
-
height,
|
|
83
|
-
margin: {
|
|
84
|
-
top: marginTop,
|
|
85
|
-
right: marginRight,
|
|
86
|
-
bottom: marginBottom,
|
|
87
|
-
left: marginLeft
|
|
88
|
-
},
|
|
89
|
-
scale,
|
|
90
|
-
printBackground,
|
|
91
|
-
landscape,
|
|
92
|
-
displayHeaderFooter: false, // Handled via Puppeteer directly
|
|
93
|
-
preferCSSPageSize
|
|
94
|
-
};
|
|
95
|
-
const coverPageBuffer = await page.pdf(pageOptions);
|
|
96
|
-
const coverPageDoc = await pdf_lib_1.PDFDocument.load(coverPageBuffer);
|
|
97
|
-
const coverPages = await pdfDoc.copyPages(coverPageDoc, coverPageDoc.getPageIndices());
|
|
98
|
-
coverPages.forEach(page => pdfDoc.addPage(page));
|
|
28
|
+
const renderedCoverPage = pdfUtil.renderTemplate(coverPage, templateInput);
|
|
29
|
+
await pdfUtil.processPageAndGeneratePDF(stepOptions, renderedCoverPage);
|
|
99
30
|
}
|
|
100
31
|
var lastPageBuffer;
|
|
101
32
|
// Process Last Page (if provided) but add it later in the save task
|
|
102
33
|
if (lastPage) {
|
|
103
|
-
const renderedLastPage =
|
|
104
|
-
await
|
|
105
|
-
// Apply header, footer, and watermark using Puppeteer
|
|
106
|
-
if (header || footer || watermark) {
|
|
107
|
-
await page.evaluate(({ header, footer, watermark, isLandscape }) => {
|
|
108
|
-
const setPositioning = (element, position) => {
|
|
109
|
-
element.style.position = 'fixed';
|
|
110
|
-
element.style.left = '0';
|
|
111
|
-
element.style.width = '100%';
|
|
112
|
-
element.style.textAlign = 'center';
|
|
113
|
-
element.style.fontSize = '12px';
|
|
114
|
-
if (position === 'header') {
|
|
115
|
-
element.style.top = '0';
|
|
116
|
-
}
|
|
117
|
-
else if (position === 'footer') {
|
|
118
|
-
element.style.bottom = '0';
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
// if (header) {
|
|
122
|
-
// const headerElement = document.createElement('div')
|
|
123
|
-
// headerElement.innerHTML = header
|
|
124
|
-
// setPositioning(headerElement, 'header')
|
|
125
|
-
// document.body.appendChild(headerElement)
|
|
126
|
-
// }
|
|
127
|
-
// if (footer) {
|
|
128
|
-
// const footerElement = document.createElement('div')
|
|
129
|
-
// footerElement.innerHTML = footer
|
|
130
|
-
// setPositioning(footerElement, 'footer')
|
|
131
|
-
// document.body.appendChild(footerElement)
|
|
132
|
-
// }
|
|
133
|
-
if (watermark) {
|
|
134
|
-
const watermarkElement = document.createElement('div');
|
|
135
|
-
watermarkElement.innerHTML = watermark;
|
|
136
|
-
watermarkElement.style.position = 'fixed';
|
|
137
|
-
watermarkElement.style.top = isLandscape ? '40%' : '50%';
|
|
138
|
-
watermarkElement.style.left = '50%';
|
|
139
|
-
watermarkElement.style.transform = 'translate(-50%, -50%) rotate(-45deg)';
|
|
140
|
-
watermarkElement.style.opacity = '0.2';
|
|
141
|
-
watermarkElement.style.fontSize = '50px';
|
|
142
|
-
watermarkElement.style.color = 'red';
|
|
143
|
-
watermarkElement.style.pointerEvents = 'none';
|
|
144
|
-
watermarkElement.style.zIndex = '9999';
|
|
145
|
-
document.body.appendChild(watermarkElement);
|
|
146
|
-
}
|
|
147
|
-
}, { header, footer, watermark, isLandscape: landscape });
|
|
148
|
-
}
|
|
149
|
-
const pageOptions = {
|
|
150
|
-
format,
|
|
151
|
-
width,
|
|
152
|
-
height,
|
|
153
|
-
margin: {
|
|
154
|
-
top: marginTop,
|
|
155
|
-
right: marginRight,
|
|
156
|
-
bottom: marginBottom,
|
|
157
|
-
left: marginLeft
|
|
158
|
-
},
|
|
159
|
-
scale,
|
|
160
|
-
printBackground,
|
|
161
|
-
landscape,
|
|
162
|
-
displayHeaderFooter: false, // Handled via Puppeteer directly
|
|
163
|
-
preferCSSPageSize
|
|
164
|
-
};
|
|
165
|
-
lastPageBuffer = await page.pdf(pageOptions);
|
|
34
|
+
const renderedLastPage = pdfUtil.renderTemplate(lastPage, templateInput);
|
|
35
|
+
lastPageBuffer = await pdfUtil.generateLastPageBuffer(stepOptions, renderedLastPage);
|
|
166
36
|
}
|
|
167
|
-
await
|
|
168
|
-
|
|
37
|
+
await pdfUtil.closeBrowser();
|
|
38
|
+
pdfInfo.lastPageBuffer = lastPageBuffer;
|
|
39
|
+
pdfInfo.pageCount = pdfDoc.getPageCount();
|
|
40
|
+
return {
|
|
41
|
+
data: pdfInfo
|
|
42
|
+
};
|
|
169
43
|
}
|
|
170
44
|
catch (error) {
|
|
171
|
-
|
|
172
|
-
await browser.close();
|
|
173
|
-
}
|
|
45
|
+
await pdfUtil.closeBrowser();
|
|
174
46
|
throw error;
|
|
175
47
|
}
|
|
176
|
-
const pdfInfo = {
|
|
177
|
-
pdfDoc,
|
|
178
|
-
lastPageBuffer,
|
|
179
|
-
header,
|
|
180
|
-
footer,
|
|
181
|
-
watermark,
|
|
182
|
-
fileName,
|
|
183
|
-
pageCount: pdfDoc.getPageCount()
|
|
184
|
-
};
|
|
185
|
-
context.__headless_pdf = pdfInfo;
|
|
186
|
-
return {
|
|
187
|
-
data: pdfInfo
|
|
188
|
-
};
|
|
189
48
|
}
|
|
190
49
|
HeadlessPDFOpen.parameterSpec = [
|
|
191
|
-
|
|
192
|
-
type: 'scenario-step-input',
|
|
193
|
-
name: 'accessor',
|
|
194
|
-
label: 'accessor'
|
|
195
|
-
},
|
|
50
|
+
...(0, pdf_capture_util_1.getCommonParameterSpec)(),
|
|
196
51
|
{
|
|
197
52
|
type: 'textarea',
|
|
198
53
|
name: 'coverPage',
|
|
@@ -224,91 +79,6 @@ HeadlessPDFOpen.parameterSpec = [
|
|
|
224
79
|
type: 'string',
|
|
225
80
|
name: 'fileName',
|
|
226
81
|
label: 'filename'
|
|
227
|
-
},
|
|
228
|
-
{
|
|
229
|
-
type: 'select',
|
|
230
|
-
name: 'format',
|
|
231
|
-
label: 'page-format',
|
|
232
|
-
property: {
|
|
233
|
-
options: [
|
|
234
|
-
{ display: '', value: '' },
|
|
235
|
-
{ display: 'A4', value: 'A4' },
|
|
236
|
-
{ display: 'A3', value: 'A3' },
|
|
237
|
-
{ display: 'Letter', value: 'Letter' },
|
|
238
|
-
{ display: 'Legal', value: 'Legal' }
|
|
239
|
-
]
|
|
240
|
-
},
|
|
241
|
-
description: 'Select the paper format for the PDF'
|
|
242
|
-
},
|
|
243
|
-
{
|
|
244
|
-
type: 'string',
|
|
245
|
-
name: 'width',
|
|
246
|
-
label: 'page-width',
|
|
247
|
-
placeholder: '(e.g., "8.5in", "21cm", "600px")',
|
|
248
|
-
description: 'Specify the width of the page (e.g., "8.5in", "21cm", "600px")'
|
|
249
|
-
},
|
|
250
|
-
{
|
|
251
|
-
type: 'string',
|
|
252
|
-
name: 'height',
|
|
253
|
-
label: 'page-height',
|
|
254
|
-
placeholder: '(e.g., "11in", "29.7cm", "800px")',
|
|
255
|
-
description: 'Specify the height of the page (e.g., "11in", "29.7cm", "800px")'
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
type: 'string',
|
|
259
|
-
name: 'marginTop',
|
|
260
|
-
label: 'page-margin-top',
|
|
261
|
-
placeholder: '(e.g., "0.5in", "1cm", "100px")',
|
|
262
|
-
description: 'Set the top margin for the page'
|
|
263
|
-
},
|
|
264
|
-
{
|
|
265
|
-
type: 'string',
|
|
266
|
-
name: 'marginBottom',
|
|
267
|
-
label: 'page-margin-bottom',
|
|
268
|
-
placeholder: '(e.g., "0.5in", "1cm", "100px")',
|
|
269
|
-
description: 'Set the bottom margin for the page'
|
|
270
|
-
},
|
|
271
|
-
{
|
|
272
|
-
type: 'string',
|
|
273
|
-
name: 'marginLeft',
|
|
274
|
-
label: 'page-margin-left',
|
|
275
|
-
placeholder: '(e.g., "0.5in", "1cm", "100px")',
|
|
276
|
-
description: 'Set the left margin for the page'
|
|
277
|
-
},
|
|
278
|
-
{
|
|
279
|
-
type: 'string',
|
|
280
|
-
name: 'marginRight',
|
|
281
|
-
label: 'page-margin-right',
|
|
282
|
-
placeholder: '(e.g., "0.5in", "1cm", "100px")',
|
|
283
|
-
description: 'Set the right margin for the page'
|
|
284
|
-
},
|
|
285
|
-
{
|
|
286
|
-
type: 'number',
|
|
287
|
-
name: 'scale',
|
|
288
|
-
label: 'page-scale',
|
|
289
|
-
defaultValue: 1,
|
|
290
|
-
description: 'Set the scale of the page content (default is 1)'
|
|
291
|
-
},
|
|
292
|
-
{
|
|
293
|
-
type: 'boolean',
|
|
294
|
-
name: 'printBackground',
|
|
295
|
-
label: 'print-background',
|
|
296
|
-
defaultValue: true,
|
|
297
|
-
description: 'Include background graphics when printing the page'
|
|
298
|
-
},
|
|
299
|
-
{
|
|
300
|
-
type: 'boolean',
|
|
301
|
-
name: 'landscape',
|
|
302
|
-
label: 'landscape',
|
|
303
|
-
defaultValue: false,
|
|
304
|
-
description: 'Print the PDF in landscape orientation'
|
|
305
|
-
},
|
|
306
|
-
{
|
|
307
|
-
type: 'boolean',
|
|
308
|
-
name: 'preferCSSPageSize',
|
|
309
|
-
label: 'prefer-css-page-size',
|
|
310
|
-
defaultValue: false,
|
|
311
|
-
description: 'Whether to prefer the CSS-defined page size over the given width and height'
|
|
312
82
|
}
|
|
313
83
|
];
|
|
314
84
|
HeadlessPDFOpen.help = 'integration/task/headless-pdf-open';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headless-pdf-open.js","sourceRoot":"","sources":["../../../server/engine/task/headless-pdf-open.ts"],"names":[],"mappings":"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","sourcesContent":["import * as ejs from 'ejs'\nimport { PDFDocument } from 'pdf-lib'\nimport { TaskRegistry } from '@things-factory/integration-base'\nimport { ConnectionManager } from '@things-factory/integration-base'\nimport { access } from '@things-factory/utils'\n\nasync function HeadlessPDFOpen(step, context) {\n var { connection: connectionName, params: stepOptions } = step\n var {\n accessor,\n coverPage,\n lastPage,\n header,\n footer,\n watermark,\n fileName,\n format,\n width,\n height,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n scale,\n printBackground,\n landscape,\n preferCSSPageSize\n } = stepOptions || {}\n const { data, logger } = context\n\n const headlessPool = ConnectionManager.getConnectionInstanceByName(context.domain, connectionName)\n let browser\n\n // Create a new PDF document using pdf-lib\n const pdfDoc = await PDFDocument.create()\n\n try {\n browser = await headlessPool.acquire()\n const page = await browser.newPage()\n\n const templateInput = access(accessor, data)\n\n const renderTemplateSafely = (template, data) => {\n try {\n return ejs.render(template, data)\n } catch (error) {\n logger.warn(`Template rendering error: ${error.message}`)\n return template\n }\n }\n\n // Convert Cover Page to PDF and add it to the document (if provided)\n if (coverPage) {\n const renderedCoverPage = renderTemplateSafely(coverPage, templateInput)\n\n await page.setContent(renderedCoverPage)\n\n // Apply header, footer, and watermark using Puppeteer\n // Apply header, footer, and watermark using Puppeteer\n if (header || footer || watermark) {\n await page.evaluate(\n ({ header, footer, watermark, isLandscape }) => {\n const setPositioning = (element, position) => {\n element.style.position = 'fixed'\n element.style.left = '0'\n element.style.width = '100%'\n element.style.textAlign = 'center'\n element.style.fontSize = '12px'\n if (position === 'header') {\n element.style.top = '0'\n } else if (position === 'footer') {\n element.style.bottom = '0'\n }\n }\n\n // if (header) {\n // const headerElement = document.createElement('div')\n // headerElement.innerHTML = header\n // setPositioning(headerElement, 'header')\n // document.body.appendChild(headerElement)\n // }\n\n // if (footer) {\n // const footerElement = document.createElement('div')\n // footerElement.innerHTML = footer\n // setPositioning(footerElement, 'footer')\n // document.body.appendChild(footerElement)\n // }\n\n if (watermark) {\n const watermarkElement = document.createElement('div')\n watermarkElement.innerHTML = watermark\n watermarkElement.style.position = 'fixed'\n watermarkElement.style.top = isLandscape ? '40%' : '50%'\n watermarkElement.style.left = '50%'\n watermarkElement.style.transform = 'translate(-50%, -50%) rotate(-45deg)'\n watermarkElement.style.opacity = '0.2'\n watermarkElement.style.fontSize = '50px'\n watermarkElement.style.color = 'red'\n watermarkElement.style.pointerEvents = 'none'\n watermarkElement.style.zIndex = '9999'\n document.body.appendChild(watermarkElement)\n }\n },\n { header, footer, watermark, isLandscape: landscape }\n )\n }\n\n const pageOptions = {\n format,\n width,\n height,\n margin: {\n top: marginTop,\n right: marginRight,\n bottom: marginBottom,\n left: marginLeft\n },\n scale,\n printBackground,\n landscape,\n displayHeaderFooter: false, // Handled via Puppeteer directly\n preferCSSPageSize\n }\n\n const coverPageBuffer = await page.pdf(pageOptions)\n const coverPageDoc = await PDFDocument.load(coverPageBuffer)\n const coverPages = await pdfDoc.copyPages(coverPageDoc, coverPageDoc.getPageIndices())\n coverPages.forEach(page => pdfDoc.addPage(page))\n }\n\n var lastPageBuffer\n\n // Process Last Page (if provided) but add it later in the save task\n if (lastPage) {\n const renderedLastPage = renderTemplateSafely(lastPage, templateInput)\n await page.setContent(renderedLastPage)\n\n // Apply header, footer, and watermark using Puppeteer\n if (header || footer || watermark) {\n await page.evaluate(\n ({ header, footer, watermark, isLandscape }) => {\n const setPositioning = (element, position) => {\n element.style.position = 'fixed'\n element.style.left = '0'\n element.style.width = '100%'\n element.style.textAlign = 'center'\n element.style.fontSize = '12px'\n if (position === 'header') {\n element.style.top = '0'\n } else if (position === 'footer') {\n element.style.bottom = '0'\n }\n }\n\n // if (header) {\n // const headerElement = document.createElement('div')\n // headerElement.innerHTML = header\n // setPositioning(headerElement, 'header')\n // document.body.appendChild(headerElement)\n // }\n\n // if (footer) {\n // const footerElement = document.createElement('div')\n // footerElement.innerHTML = footer\n // setPositioning(footerElement, 'footer')\n // document.body.appendChild(footerElement)\n // }\n\n if (watermark) {\n const watermarkElement = document.createElement('div')\n watermarkElement.innerHTML = watermark\n watermarkElement.style.position = 'fixed'\n watermarkElement.style.top = isLandscape ? '40%' : '50%'\n watermarkElement.style.left = '50%'\n watermarkElement.style.transform = 'translate(-50%, -50%) rotate(-45deg)'\n watermarkElement.style.opacity = '0.2'\n watermarkElement.style.fontSize = '50px'\n watermarkElement.style.color = 'red'\n watermarkElement.style.pointerEvents = 'none'\n watermarkElement.style.zIndex = '9999'\n document.body.appendChild(watermarkElement)\n }\n },\n { header, footer, watermark, isLandscape: landscape }\n )\n }\n\n const pageOptions = {\n format,\n width,\n height,\n margin: {\n top: marginTop,\n right: marginRight,\n bottom: marginBottom,\n left: marginLeft\n },\n scale,\n printBackground,\n landscape,\n displayHeaderFooter: false, // Handled via Puppeteer directly\n preferCSSPageSize\n }\n\n lastPageBuffer = await page.pdf(pageOptions)\n }\n\n await page.close()\n headlessPool.release(browser)\n } catch (error) {\n if (browser) {\n await browser.close()\n }\n throw error\n }\n\n const pdfInfo = {\n pdfDoc,\n lastPageBuffer,\n header,\n footer,\n watermark,\n fileName,\n pageCount: pdfDoc.getPageCount()\n }\n\n context.__headless_pdf = pdfInfo\n\n return {\n data: pdfInfo\n }\n}\n\nHeadlessPDFOpen.parameterSpec = [\n {\n type: 'scenario-step-input',\n name: 'accessor',\n label: 'accessor'\n },\n {\n type: 'textarea',\n name: 'coverPage',\n label: 'pdf-cover-page'\n },\n {\n type: 'textarea',\n name: 'lastPage',\n label: 'pdf-last-page'\n },\n {\n type: 'string',\n name: 'header',\n label: 'header',\n placeholder: 'Page <%= pageNumber %> of <%= totalPages %>'\n },\n {\n type: 'string',\n name: 'footer',\n label: 'footer',\n placeholder: 'Page <%= pageNumber %> of <%= totalPages %>'\n },\n {\n type: 'string',\n name: 'watermark',\n label: 'watermark'\n },\n {\n type: 'string',\n name: 'fileName',\n label: 'filename'\n },\n {\n type: 'select',\n name: 'format',\n label: 'page-format',\n property: {\n options: [\n { display: '', value: '' },\n { display: 'A4', value: 'A4' },\n { display: 'A3', value: 'A3' },\n { display: 'Letter', value: 'Letter' },\n { display: 'Legal', value: 'Legal' }\n ]\n },\n description: 'Select the paper format for the PDF'\n },\n {\n type: 'string',\n name: 'width',\n label: 'page-width',\n placeholder: '(e.g., \"8.5in\", \"21cm\", \"600px\")',\n description: 'Specify the width of the page (e.g., \"8.5in\", \"21cm\", \"600px\")'\n },\n {\n type: 'string',\n name: 'height',\n label: 'page-height',\n placeholder: '(e.g., \"11in\", \"29.7cm\", \"800px\")',\n description: 'Specify the height of the page (e.g., \"11in\", \"29.7cm\", \"800px\")'\n },\n {\n type: 'string',\n name: 'marginTop',\n label: 'page-margin-top',\n placeholder: '(e.g., \"0.5in\", \"1cm\", \"100px\")',\n description: 'Set the top margin for the page'\n },\n {\n type: 'string',\n name: 'marginBottom',\n label: 'page-margin-bottom',\n placeholder: '(e.g., \"0.5in\", \"1cm\", \"100px\")',\n description: 'Set the bottom margin for the page'\n },\n {\n type: 'string',\n name: 'marginLeft',\n label: 'page-margin-left',\n placeholder: '(e.g., \"0.5in\", \"1cm\", \"100px\")',\n description: 'Set the left margin for the page'\n },\n {\n type: 'string',\n name: 'marginRight',\n label: 'page-margin-right',\n placeholder: '(e.g., \"0.5in\", \"1cm\", \"100px\")',\n description: 'Set the right margin for the page'\n },\n {\n type: 'number',\n name: 'scale',\n label: 'page-scale',\n defaultValue: 1,\n description: 'Set the scale of the page content (default is 1)'\n },\n {\n type: 'boolean',\n name: 'printBackground',\n label: 'print-background',\n defaultValue: true,\n description: 'Include background graphics when printing the page'\n },\n {\n type: 'boolean',\n name: 'landscape',\n label: 'landscape',\n defaultValue: false,\n description: 'Print the PDF in landscape orientation'\n },\n {\n type: 'boolean',\n name: 'preferCSSPageSize',\n label: 'prefer-css-page-size',\n defaultValue: false,\n description: 'Whether to prefer the CSS-defined page size over the given width and height'\n }\n]\n\nHeadlessPDFOpen.help = 'integration/task/headless-pdf-open'\n\nTaskRegistry.registerTaskHandler('headless-pdf-open', HeadlessPDFOpen)\n"]}
|
|
1
|
+
{"version":3,"file":"headless-pdf-open.js","sourceRoot":"","sources":["../../../server/engine/task/headless-pdf-open.ts"],"names":[],"mappings":";;AAAA,qCAAqC;AACrC,uEAA+D;AAC/D,iDAA8C;AAC9C,yDAA2E;AAE3E,KAAK,UAAU,eAAe,CAAC,IAAI,EAAE,OAAO;IAC1C,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAA;IAChE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,WAAW,IAAI,EAAE,CAAA;IAEhG,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IAExB,0CAA0C;IAC1C,MAAM,MAAM,GAAG,MAAM,qBAAW,CAAC,MAAM,EAAE,CAAA;IAEzC,MAAM,OAAO,GAAG;QACd,MAAM;QACN,MAAM;QACN,MAAM;QACN,SAAS;QACT,QAAQ;QACR,SAAS,EAAE,CAAC;KACN,CAAA;IAER,OAAO,CAAC,cAAc,GAAG,OAAO,CAAA;IAEhC,MAAM,OAAO,GAAG,IAAI,iCAAc,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA;IAEzC,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,IAAA,cAAM,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAE5C,qEAAqE;QACrE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;YAC1E,MAAM,OAAO,CAAC,yBAAyB,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAA;QACzE,CAAC;QAED,IAAI,cAAc,CAAA;QAElB,oEAAoE;QACpE,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;YACxE,cAAc,GAAG,MAAM,OAAO,CAAC,sBAAsB,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;QACtF,CAAC;QAED,MAAM,OAAO,CAAC,YAAY,EAAE,CAAA;QAE5B,OAAO,CAAC,cAAc,GAAG,cAAc,CAAA;QACvC,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAA;QAEzC,OAAO;YACL,IAAI,EAAE,OAAO;SACd,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,CAAC,YAAY,EAAE,CAAA;QAC5B,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,eAAe,CAAC,aAAa,GAAG;IAC9B,GAAG,IAAA,yCAAsB,GAAE;IAC3B;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,gBAAgB;KACxB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,eAAe;KACvB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,6CAA6C;KAC3D;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,6CAA6C;KAC3D;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,WAAW;KACnB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;KAClB;CACF,CAAA;AAED,eAAe,CAAC,IAAI,GAAG,oCAAoC,CAAA;AAE3D,+BAAY,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAA","sourcesContent":["import { PDFDocument } from 'pdf-lib'\nimport { TaskRegistry } from '@things-factory/integration-base'\nimport { access } from '@things-factory/utils'\nimport { PDFCaptureUtil, getCommonParameterSpec } from './pdf-capture-util'\n\nasync function HeadlessPDFOpen(step, context) {\n const { connection: connectionName, params: stepOptions } = step\n const { accessor, coverPage, lastPage, header, footer, watermark, fileName } = stepOptions || {}\n\n const { data } = context\n\n // Create a new PDF document using pdf-lib\n const pdfDoc = await PDFDocument.create()\n\n const pdfInfo = {\n pdfDoc,\n header,\n footer,\n watermark,\n fileName,\n pageCount: 0\n } as any\n\n context.__headless_pdf = pdfInfo\n\n const pdfUtil = new PDFCaptureUtil(context)\n await pdfUtil.initBrowser(connectionName)\n\n try {\n const templateInput = access(accessor, data)\n\n // Convert Cover Page to PDF and add it to the document (if provided)\n if (coverPage) {\n const renderedCoverPage = pdfUtil.renderTemplate(coverPage, templateInput)\n await pdfUtil.processPageAndGeneratePDF(stepOptions, renderedCoverPage)\n }\n\n var lastPageBuffer\n\n // Process Last Page (if provided) but add it later in the save task\n if (lastPage) {\n const renderedLastPage = pdfUtil.renderTemplate(lastPage, templateInput)\n lastPageBuffer = await pdfUtil.generateLastPageBuffer(stepOptions, renderedLastPage)\n }\n\n await pdfUtil.closeBrowser()\n\n pdfInfo.lastPageBuffer = lastPageBuffer\n pdfInfo.pageCount = pdfDoc.getPageCount()\n\n return {\n data: pdfInfo\n }\n } catch (error) {\n await pdfUtil.closeBrowser()\n throw error\n }\n}\n\nHeadlessPDFOpen.parameterSpec = [\n ...getCommonParameterSpec(),\n {\n type: 'textarea',\n name: 'coverPage',\n label: 'pdf-cover-page'\n },\n {\n type: 'textarea',\n name: 'lastPage',\n label: 'pdf-last-page'\n },\n {\n type: 'string',\n name: 'header',\n label: 'header',\n placeholder: 'Page <%= pageNumber %> of <%= totalPages %>'\n },\n {\n type: 'string',\n name: 'footer',\n label: 'footer',\n placeholder: 'Page <%= pageNumber %> of <%= totalPages %>'\n },\n {\n type: 'string',\n name: 'watermark',\n label: 'watermark'\n },\n {\n type: 'string',\n name: 'fileName',\n label: 'filename'\n }\n]\n\nHeadlessPDFOpen.help = 'integration/task/headless-pdf-open'\n\nTaskRegistry.registerTaskHandler('headless-pdf-open', HeadlessPDFOpen)\n"]}
|