@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.
Files changed (28) hide show
  1. package/dist-server/engine/task/headless-pdf-capture-board.d.ts +59 -1
  2. package/dist-server/engine/task/headless-pdf-capture-board.js +29 -250
  3. package/dist-server/engine/task/headless-pdf-capture-board.js.map +1 -1
  4. package/dist-server/engine/task/headless-pdf-capture-markdown.d.ts +52 -0
  5. package/dist-server/engine/task/headless-pdf-capture-markdown.js +38 -0
  6. package/dist-server/engine/task/headless-pdf-capture-markdown.js.map +1 -0
  7. package/dist-server/engine/task/headless-pdf-capture.d.ts +52 -1
  8. package/dist-server/engine/task/headless-pdf-capture.js +13 -196
  9. package/dist-server/engine/task/headless-pdf-capture.js.map +1 -1
  10. package/dist-server/engine/task/headless-pdf-open.js +27 -257
  11. package/dist-server/engine/task/headless-pdf-open.js.map +1 -1
  12. package/dist-server/engine/task/headless-pdf-save.js +32 -20
  13. package/dist-server/engine/task/headless-pdf-save.js.map +1 -1
  14. package/dist-server/engine/task/index.d.ts +1 -0
  15. package/dist-server/engine/task/index.js +1 -0
  16. package/dist-server/engine/task/index.js.map +1 -1
  17. package/dist-server/engine/task/pdf-capture-util.d.ts +96 -0
  18. package/dist-server/engine/task/pdf-capture-util.js +252 -0
  19. package/dist-server/engine/task/pdf-capture-util.js.map +1 -0
  20. package/dist-server/tsconfig.tsbuildinfo +1 -1
  21. package/package.json +2 -2
  22. package/server/engine/task/headless-pdf-capture-board.ts +41 -293
  23. package/server/engine/task/headless-pdf-capture-markdown.ts +41 -0
  24. package/server/engine/task/headless-pdf-capture.ts +12 -226
  25. package/server/engine/task/headless-pdf-open.ts +28 -292
  26. package/server/engine/task/headless-pdf-save.ts +34 -21
  27. package/server/engine/task/index.ts +1 -0
  28. 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
- const tslib_1 = require("tslib");
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 pdf_lib_1 = require("pdf-lib");
6
+ const pdf_capture_util_1 = require("./pdf-capture-util");
9
7
  async function HeadlessPDFCapture(step, context) {
10
- var { connection: connectionName, params: stepOptions } = step;
11
- var { accessor, htmlContent, format, width, height, marginTop, marginBottom, marginLeft, marginRight, scale, printBackground, landscape, preferCSSPageSize } = stepOptions || {};
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
- browser = await headlessPool.acquire();
21
- const page = await browser.newPage();
22
- const templateInput = (0, utils_1.access)(accessor, data);
23
- const renderTemplateSafely = (template, data) => {
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
- var { connection: connectionName, params: stepOptions } = step;
11
- var { accessor, coverPage, lastPage, header, footer, watermark, fileName, format, width, height, marginTop, marginBottom, marginLeft, marginRight, scale, printBackground, landscape, preferCSSPageSize } = stepOptions || {};
12
- const { data, logger } = context;
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 = renderTemplateSafely(coverPage, templateInput);
33
- await page.setContent(renderedCoverPage);
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 = renderTemplateSafely(lastPage, templateInput);
104
- await page.setContent(renderedLastPage);
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 page.close();
168
- headlessPool.release(browser);
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
- if (browser) {
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":";;;AAAA,iDAA0B;AAC1B,qCAAqC;AACrC,uEAA+D;AAC/D,uEAAoE;AACpE,iDAA8C;AAE9C,KAAK,UAAU,eAAe,CAAC,IAAI,EAAE,OAAO;IAC1C,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAA;IAC9D,IAAI,EACF,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,MAAM,EACN,MAAM,EACN,SAAS,EACT,QAAQ,EACR,MAAM,EACN,KAAK,EACL,MAAM,EACN,SAAS,EACT,YAAY,EACZ,UAAU,EACV,WAAW,EACX,KAAK,EACL,eAAe,EACf,SAAS,EACT,iBAAiB,EAClB,GAAG,WAAW,IAAI,EAAE,CAAA;IACrB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAEhC,MAAM,YAAY,GAAG,oCAAiB,CAAC,2BAA2B,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IAClG,IAAI,OAAO,CAAA;IAEX,0CAA0C;IAC1C,MAAM,MAAM,GAAG,MAAM,qBAAW,CAAC,MAAM,EAAE,CAAA;IAEzC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,CAAA;QACtC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;QAEpC,MAAM,aAAa,GAAG,IAAA,cAAM,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAE5C,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;YAC9C,IAAI,CAAC;gBACH,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;gBACzD,OAAO,QAAQ,CAAA;YACjB,CAAC;QACH,CAAC,CAAA;QAED,qEAAqE;QACrE,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAA;YAExE,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAA;YAExC,sDAAsD;YACtD,sDAAsD;YACtD,IAAI,MAAM,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;gBAClC,MAAM,IAAI,CAAC,QAAQ,CACjB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE;oBAC7C,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;wBAC3C,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAA;wBAChC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAA;wBACxB,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAA;wBAC5B,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAA;wBAClC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAA;wBAC/B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;4BAC1B,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAA;wBACzB,CAAC;6BAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;4BACjC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAA;wBAC5B,CAAC;oBACH,CAAC,CAAA;oBAED,gBAAgB;oBAChB,wDAAwD;oBACxD,qCAAqC;oBACrC,4CAA4C;oBAC5C,6CAA6C;oBAC7C,IAAI;oBAEJ,gBAAgB;oBAChB,wDAAwD;oBACxD,qCAAqC;oBACrC,4CAA4C;oBAC5C,6CAA6C;oBAC7C,IAAI;oBAEJ,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,gBAAgB,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;wBACtD,gBAAgB,CAAC,SAAS,GAAG,SAAS,CAAA;wBACtC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAA;wBACzC,gBAAgB,CAAC,KAAK,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;wBACxD,gBAAgB,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAA;wBACnC,gBAAgB,CAAC,KAAK,CAAC,SAAS,GAAG,sCAAsC,CAAA;wBACzE,gBAAgB,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAA;wBACtC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAA;wBACxC,gBAAgB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAA;wBACpC,gBAAgB,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAA;wBAC7C,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAA;wBACtC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAA;oBAC7C,CAAC;gBACH,CAAC,EACD,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,CACtD,CAAA;YACH,CAAC;YAED,MAAM,WAAW,GAAG;gBAClB,MAAM;gBACN,KAAK;gBACL,MAAM;gBACN,MAAM,EAAE;oBACN,GAAG,EAAE,SAAS;oBACd,KAAK,EAAE,WAAW;oBAClB,MAAM,EAAE,YAAY;oBACpB,IAAI,EAAE,UAAU;iBACjB;gBACD,KAAK;gBACL,eAAe;gBACf,SAAS;gBACT,mBAAmB,EAAE,KAAK,EAAE,iCAAiC;gBAC7D,iBAAiB;aAClB,CAAA;YAED,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YACnD,MAAM,YAAY,GAAG,MAAM,qBAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YAC5D,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAC,cAAc,EAAE,CAAC,CAAA;YACtF,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QAClD,CAAC;QAED,IAAI,cAAc,CAAA;QAElB,oEAAoE;QACpE,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;YACtE,MAAM,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAA;YAEvC,sDAAsD;YACtD,IAAI,MAAM,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;gBAClC,MAAM,IAAI,CAAC,QAAQ,CACjB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,EAAE;oBAC7C,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;wBAC3C,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAA;wBAChC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAA;wBACxB,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAA;wBAC5B,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAA;wBAClC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAA;wBAC/B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;4BAC1B,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAA;wBACzB,CAAC;6BAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;4BACjC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAA;wBAC5B,CAAC;oBACH,CAAC,CAAA;oBAED,gBAAgB;oBAChB,wDAAwD;oBACxD,qCAAqC;oBACrC,4CAA4C;oBAC5C,6CAA6C;oBAC7C,IAAI;oBAEJ,gBAAgB;oBAChB,wDAAwD;oBACxD,qCAAqC;oBACrC,4CAA4C;oBAC5C,6CAA6C;oBAC7C,IAAI;oBAEJ,IAAI,SAAS,EAAE,CAAC;wBACd,MAAM,gBAAgB,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;wBACtD,gBAAgB,CAAC,SAAS,GAAG,SAAS,CAAA;wBACtC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAA;wBACzC,gBAAgB,CAAC,KAAK,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;wBACxD,gBAAgB,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAA;wBACnC,gBAAgB,CAAC,KAAK,CAAC,SAAS,GAAG,sCAAsC,CAAA;wBACzE,gBAAgB,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAA;wBACtC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAA;wBACxC,gBAAgB,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAA;wBACpC,gBAAgB,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAA;wBAC7C,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAA;wBACtC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAA;oBAC7C,CAAC;gBACH,CAAC,EACD,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,CACtD,CAAA;YACH,CAAC;YAED,MAAM,WAAW,GAAG;gBAClB,MAAM;gBACN,KAAK;gBACL,MAAM;gBACN,MAAM,EAAE;oBACN,GAAG,EAAE,SAAS;oBACd,KAAK,EAAE,WAAW;oBAClB,MAAM,EAAE,YAAY;oBACpB,IAAI,EAAE,UAAU;iBACjB;gBACD,KAAK;gBACL,eAAe;gBACf,SAAS;gBACT,mBAAmB,EAAE,KAAK,EAAE,iCAAiC;gBAC7D,iBAAiB;aAClB,CAAA;YAED,cAAc,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QAC9C,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;QAClB,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;QACvB,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;IAED,MAAM,OAAO,GAAG;QACd,MAAM;QACN,cAAc;QACd,MAAM;QACN,MAAM;QACN,SAAS;QACT,QAAQ;QACR,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE;KACjC,CAAA;IAED,OAAO,CAAC,cAAc,GAAG,OAAO,CAAA;IAEhC,OAAO;QACL,IAAI,EAAE,OAAO;KACd,CAAA;AACH,CAAC;AAED,eAAe,CAAC,aAAa,GAAG;IAC9B;QACE,IAAI,EAAE,qBAAqB;QAC3B,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;KAClB;IACD;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;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,aAAa;QACpB,QAAQ,EAAE;YACR,OAAO,EAAE;gBACP,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC1B,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;gBAC9B,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;gBAC9B,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;gBACtC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;aACrC;SACF;QACD,WAAW,EAAE,qCAAqC;KACnD;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,kCAAkC;QAC/C,WAAW,EAAE,gEAAgE;KAC9E;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,mCAAmC;QAChD,WAAW,EAAE,kEAAkE;KAChF;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,iCAAiC;QAC9C,WAAW,EAAE,iCAAiC;KAC/C;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,iCAAiC;QAC9C,WAAW,EAAE,oCAAoC;KAClD;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,iCAAiC;QAC9C,WAAW,EAAE,kCAAkC;KAChD;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,iCAAiC;QAC9C,WAAW,EAAE,mCAAmC;KACjD;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,YAAY;QACnB,YAAY,EAAE,CAAC;QACf,WAAW,EAAE,kDAAkD;KAChE;IACD;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,kBAAkB;QACzB,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,oDAAoD;KAClE;IACD;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,WAAW;QAClB,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,wCAAwC;KACtD;IACD;QACE,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,sBAAsB;QAC7B,YAAY,EAAE,KAAK;QACnB,WAAW,EAAE,6EAA6E;KAC3F;CACF,CAAA;AAED,eAAe,CAAC,IAAI,GAAG,oCAAoC,CAAA;AAE3D,+BAAY,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAA","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"]}