chromiumly 2.2.0 → 2.3.1

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 (34) hide show
  1. package/README.md +1 -0
  2. package/dist/chromium/converters/html.converter.d.ts +8 -3
  3. package/dist/chromium/converters/html.converter.js +14 -18
  4. package/dist/chromium/converters/html.converter.js.map +1 -1
  5. package/dist/chromium/converters/markdown.converter.d.ts +8 -3
  6. package/dist/chromium/converters/markdown.converter.js +14 -18
  7. package/dist/chromium/converters/markdown.converter.js.map +1 -1
  8. package/dist/chromium/converters/url.converter.d.ts +8 -3
  9. package/dist/chromium/converters/url.converter.js +14 -19
  10. package/dist/chromium/converters/url.converter.js.map +1 -1
  11. package/dist/chromium/interfaces/converter.types.d.ts +17 -0
  12. package/dist/chromium/utils/converter.utils.d.ts +2 -1
  13. package/dist/chromium/utils/converter.utils.js +44 -0
  14. package/dist/chromium/utils/converter.utils.js.map +1 -1
  15. package/dist/common/gotenberg.utils.js.map +1 -1
  16. package/dist/gotenberg.js.map +1 -1
  17. package/dist/libre-office/utils/libre-office.utils.js.map +1 -1
  18. package/dist/pdf-engines/pdf.engine.d.ts +2 -1
  19. package/dist/pdf-engines/pdf.engine.js +5 -2
  20. package/dist/pdf-engines/pdf.engine.js.map +1 -1
  21. package/dist/pdf-engines/utils/engine.utils.js.map +1 -1
  22. package/package.json +27 -12
  23. package/src/chromium/converters/html.converter.ts +26 -23
  24. package/src/chromium/converters/markdown.converter.ts +27 -22
  25. package/src/chromium/converters/url.converter.ts +27 -22
  26. package/src/chromium/interfaces/converter.types.ts +18 -0
  27. package/src/chromium/utils/converter.utils.ts +63 -1
  28. package/src/chromium/utils/tests/converter.utils.test.ts +233 -7
  29. package/src/pdf-engines/pdf.engine.ts +13 -1
  30. package/src/pdf-engines/tests/pdf.engine.test.ts +2 -1
  31. package/dist/chromium/interfaces/converter.interface.d.ts +0 -10
  32. package/dist/chromium/interfaces/converter.interface.js +0 -3
  33. package/dist/chromium/interfaces/converter.interface.js.map +0 -1
  34. package/src/chromium/interfaces/converter.interface.ts +0 -12
@@ -3,7 +3,6 @@ import { constants, createReadStream, PathLike, promises } from "fs";
3
3
  import FormData from "form-data";
4
4
 
5
5
  import { GotenbergUtils, PdfFormat } from "../../common";
6
- import { IConverter } from "../interfaces/converter.interface";
7
6
  import {
8
7
  EmulatedMediaType,
9
8
  PageProperties,
@@ -12,7 +11,7 @@ import { ConverterUtils } from "../utils/converter.utils";
12
11
  import { Converter } from "./converter";
13
12
  import { ChromiumRoute } from "../../main.config";
14
13
 
15
- export class MarkdownConverter extends Converter implements IConverter {
14
+ export class MarkdownConverter extends Converter {
16
15
  constructor() {
17
16
  super(ChromiumRoute.MARKDOWN);
18
17
  }
@@ -24,7 +23,13 @@ export class MarkdownConverter extends Converter implements IConverter {
24
23
  footer,
25
24
  properties,
26
25
  pdfFormat,
26
+ pdfUA,
27
27
  emulatedMediaType,
28
+ waitDelay,
29
+ waitForExpression,
30
+ userAgent,
31
+ extraHttpHeaders,
32
+ failOnConsoleExceptions,
28
33
  }: {
29
34
  html: PathLike;
30
35
  markdown: PathLike;
@@ -32,34 +37,34 @@ export class MarkdownConverter extends Converter implements IConverter {
32
37
  footer?: PathLike;
33
38
  properties?: PageProperties;
34
39
  pdfFormat?: PdfFormat;
40
+ pdfUA?: boolean;
35
41
  emulatedMediaType?: EmulatedMediaType;
42
+ waitDelay?: string;
43
+ waitForExpression?: string;
44
+ userAgent?: string;
45
+ extraHttpHeaders?: Record<string, string>;
46
+ failOnConsoleExceptions?: boolean;
36
47
  }): Promise<Buffer> {
37
48
  await promises.access(html, constants.R_OK);
38
49
  await promises.access(markdown, constants.R_OK);
39
50
  const data = new FormData();
40
- if (pdfFormat) {
41
- data.append("pdfFormat", pdfFormat);
42
- }
51
+
43
52
  data.append("index.html", createReadStream(html));
44
53
  data.append("file.md", createReadStream(markdown));
45
54
 
46
- if (header) {
47
- await promises.access(header, constants.R_OK);
48
- data.append("header.html", createReadStream(header));
49
- }
50
-
51
- if (footer) {
52
- await promises.access(footer, constants.R_OK);
53
- data.append("footer.html", createReadStream(footer));
54
- }
55
-
56
- if (emulatedMediaType) {
57
- data.append("emulatedMediaType", emulatedMediaType);
58
- }
59
-
60
- if (properties) {
61
- ConverterUtils.injectPageProperties(data, properties);
62
- }
55
+ ConverterUtils.customize(data, {
56
+ header,
57
+ footer,
58
+ properties,
59
+ pdfFormat,
60
+ pdfUA,
61
+ emulatedMediaType,
62
+ waitDelay,
63
+ waitForExpression,
64
+ userAgent,
65
+ extraHttpHeaders,
66
+ failOnConsoleExceptions,
67
+ });
63
68
 
64
69
  return GotenbergUtils.fetch(this.endpoint, data);
65
70
  }
@@ -1,11 +1,10 @@
1
- import { PathLike, constants, createReadStream, promises } from "fs";
1
+ import { PathLike } from "fs";
2
2
 
3
3
  import { URL } from "url";
4
4
 
5
5
  import FormData from "form-data";
6
6
 
7
7
  import { GotenbergUtils, PdfFormat } from "../../common";
8
- import { IConverter } from "../interfaces/converter.interface";
9
8
  import {
10
9
  EmulatedMediaType,
11
10
  PageProperties,
@@ -14,7 +13,7 @@ import { ConverterUtils } from "../utils/converter.utils";
14
13
  import { Converter } from "./converter";
15
14
  import { ChromiumRoute } from "../../main.config";
16
15
 
17
- export class UrlConverter extends Converter implements IConverter {
16
+ export class UrlConverter extends Converter {
18
17
  constructor() {
19
18
  super(ChromiumRoute.URL);
20
19
  }
@@ -25,40 +24,46 @@ export class UrlConverter extends Converter implements IConverter {
25
24
  footer,
26
25
  properties,
27
26
  pdfFormat,
27
+ pdfUA,
28
28
  emulatedMediaType,
29
+ waitDelay,
30
+ waitForExpression,
31
+ userAgent,
32
+ extraHttpHeaders,
33
+ failOnConsoleExceptions,
29
34
  }: {
30
35
  url: string;
31
36
  header?: PathLike;
32
37
  footer?: PathLike;
33
38
  properties?: PageProperties;
34
39
  pdfFormat?: PdfFormat;
40
+ pdfUA?: boolean;
35
41
  emulatedMediaType?: EmulatedMediaType;
42
+ waitDelay?: string;
43
+ waitForExpression?: string;
44
+ userAgent?: string;
45
+ extraHttpHeaders?: Record<string, string>;
46
+ failOnConsoleExceptions?: boolean;
36
47
  }): Promise<Buffer> {
37
48
  const _url = new URL(url);
38
49
  const data = new FormData();
39
- if (pdfFormat) {
40
- data.append("pdfFormat", pdfFormat);
41
- }
42
50
 
43
51
  data.append("url", _url.href);
44
52
 
45
- if (header) {
46
- await promises.access(header, constants.R_OK);
47
- data.append("header.html", createReadStream(header));
48
- }
53
+ ConverterUtils.customize(data, {
54
+ header,
55
+ footer,
56
+ properties,
57
+ pdfFormat,
58
+ pdfUA,
59
+ emulatedMediaType,
60
+ waitDelay,
61
+ waitForExpression,
62
+ userAgent,
63
+ extraHttpHeaders,
64
+ failOnConsoleExceptions,
65
+ });
49
66
 
50
- if (footer) {
51
- await promises.access(footer, constants.R_OK);
52
- data.append("footer.html", createReadStream(footer));
53
- }
54
-
55
- if (emulatedMediaType) {
56
- data.append("emulatedMediaType", emulatedMediaType);
57
- }
58
-
59
- if (properties) {
60
- ConverterUtils.injectPageProperties(data, properties);
61
- }
62
67
  return GotenbergUtils.fetch(this.endpoint, data);
63
68
  }
64
69
  }
@@ -1,3 +1,6 @@
1
+ import { PathLike } from "fs";
2
+ import { PdfFormat } from "../../common";
3
+
1
4
  type PageSize = {
2
5
  width: number; // Paper width, in inches (default 8.5)
3
6
  height: number; //Paper height, in inches (default 11)
@@ -15,9 +18,24 @@ export type PageProperties = {
15
18
  margins?: PageMargins;
16
19
  preferCssPageSize?: boolean; // Define whether to prefer page size as defined by CSS (default false)
17
20
  printBackground?: boolean; // Print the background graphics (default false)
21
+ omitBackground?: boolean; // Hide the default white background and allow generating PDFs with transparency (default false)
18
22
  landscape?: boolean; // Set the paper orientation to landscape (default false)
19
23
  scale?: number; // The scale of the page rendering (default 1.0)
20
24
  nativePageRanges?: { from: number; to: number }; // Page ranges to print
21
25
  };
22
26
 
23
27
  export type EmulatedMediaType = "screen" | "print";
28
+
29
+ export type ConversionOptions = {
30
+ header?: PathLike;
31
+ footer?: PathLike;
32
+ properties?: PageProperties;
33
+ pdfFormat?: PdfFormat;
34
+ pdfUA?: boolean; // Enable PDF for Universal Access for optimal accessibility (default false)
35
+ emulatedMediaType?: EmulatedMediaType;
36
+ waitDelay?: string; // Duration (e.g, '5s') to wait when loading an HTML document before converting it into PDF
37
+ waitForExpression?: string; // JavaScript expression to wait before converting an HTML document into PDF until it returns true.
38
+ userAgent?: string;
39
+ extraHttpHeaders?: Record<string, string>;
40
+ failOnConsoleExceptions?: boolean; // Return a 409 Conflict response if there are exceptions in the Chromium console (default false)
41
+ };
@@ -1,7 +1,11 @@
1
+ import { constants, createReadStream, promises } from "fs";
1
2
  import FormData from "form-data";
2
3
 
3
4
  import { GotenbergUtils } from "../../common/gotenberg.utils";
4
- import { PageProperties } from "../interfaces/converter.types";
5
+ import {
6
+ ConversionOptions,
7
+ PageProperties,
8
+ } from "../interfaces/converter.types";
5
9
 
6
10
  export class ConverterUtils {
7
11
  public static injectPageProperties(
@@ -44,6 +48,10 @@ export class ConverterUtils {
44
48
  data.append("printBackground", String(pageProperties.printBackground));
45
49
  }
46
50
 
51
+ if (pageProperties.omitBackground) {
52
+ data.append("omitBackground", String(pageProperties.omitBackground));
53
+ }
54
+
47
55
  if (pageProperties.landscape) {
48
56
  data.append("landscape", String(pageProperties.landscape));
49
57
  }
@@ -72,4 +80,58 @@ export class ConverterUtils {
72
80
  );
73
81
  }
74
82
  }
83
+
84
+ public static async customize(
85
+ data: FormData,
86
+ options: ConversionOptions
87
+ ): Promise<void> {
88
+ if (options.pdfFormat) {
89
+ data.append("pdfa", options.pdfFormat);
90
+ }
91
+
92
+ if (options.pdfUA) {
93
+ data.append("pdfua", String(options.pdfUA));
94
+ }
95
+
96
+ if (options.header) {
97
+ await promises.access(options.header, constants.R_OK);
98
+ data.append("header.html", createReadStream(options.header));
99
+ }
100
+
101
+ if (options.footer) {
102
+ await promises.access(options.footer, constants.R_OK);
103
+ data.append("footer.html", createReadStream(options.footer));
104
+ }
105
+
106
+ if (options.emulatedMediaType) {
107
+ data.append("emulatedMediaType", options.emulatedMediaType);
108
+ }
109
+
110
+ if (options.properties) {
111
+ ConverterUtils.injectPageProperties(data, options.properties);
112
+ }
113
+
114
+ if (options.waitDelay) {
115
+ data.append("waitDelay", options.waitDelay);
116
+ }
117
+
118
+ if (options.waitForExpression) {
119
+ data.append("waitForExpression", options.waitForExpression);
120
+ }
121
+
122
+ if (options.userAgent) {
123
+ data.append("userAgent", options.userAgent);
124
+ }
125
+
126
+ if (options.extraHttpHeaders) {
127
+ data.append("extraHttpHeaders", JSON.stringify(options.extraHttpHeaders));
128
+ }
129
+
130
+ if (options.failOnConsoleExceptions) {
131
+ data.append(
132
+ "failOnConsoleExceptions",
133
+ String(options.failOnConsoleExceptions)
134
+ );
135
+ }
136
+ }
75
137
  }
@@ -1,10 +1,20 @@
1
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
+ import { createReadStream, promises } from "fs";
1
3
  import FormData from "form-data";
2
4
  import { ConverterUtils } from "../converter.utils";
5
+ import { PdfFormat } from "../../../common";
3
6
 
4
7
  describe("ConverterUtils", () => {
5
8
  const mockFormDataAppend = jest.spyOn(FormData.prototype, "append");
9
+ const mockPromisesAccess = jest.spyOn(promises, "access");
6
10
  const data = new FormData();
7
11
 
12
+ beforeEach(() => {
13
+ (createReadStream as jest.Mock) = jest
14
+ .fn()
15
+ .mockImplementation((file) => file);
16
+ });
17
+
8
18
  afterEach(() => {
9
19
  jest.resetAllMocks();
10
20
  });
@@ -16,7 +26,7 @@ describe("ConverterUtils", () => {
16
26
  ConverterUtils.injectPageProperties(data, {
17
27
  size: { width: 8.3, height: 11.7 },
18
28
  });
19
- expect(mockFormDataAppend).toBeCalledTimes(2);
29
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(2);
20
30
  expect(data.append).toHaveBeenCalledWith("paperWidth", 8.3);
21
31
  expect(data.append).toHaveBeenNthCalledWith(2, "paperHeight", 11.7);
22
32
  });
@@ -29,7 +39,7 @@ describe("ConverterUtils", () => {
29
39
  ConverterUtils.injectPageProperties(data, {
30
40
  margins: { top: 0.5, bottom: 0.5, left: 1, right: 1 },
31
41
  });
32
- expect(mockFormDataAppend).toBeCalledTimes(4);
42
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(4);
33
43
  expect(data.append).toHaveBeenCalledWith("marginTop", 0.5);
34
44
  expect(data.append).toHaveBeenNthCalledWith(2, "marginBottom", 0.5);
35
45
  expect(data.append).toHaveBeenNthCalledWith(3, "marginLeft", 1);
@@ -44,7 +54,7 @@ describe("ConverterUtils", () => {
44
54
  ConverterUtils.injectPageProperties(data, {
45
55
  preferCssPageSize: true,
46
56
  });
47
- expect(mockFormDataAppend).toBeCalledTimes(1);
57
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
48
58
  expect(data.append).toHaveBeenCalledWith("preferCssPageSize", "true");
49
59
  });
50
60
  });
@@ -56,10 +66,20 @@ describe("ConverterUtils", () => {
56
66
  ConverterUtils.injectPageProperties(data, {
57
67
  printBackground: true,
58
68
  });
59
- expect(mockFormDataAppend).toBeCalledTimes(1);
69
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
60
70
  expect(data.append).toHaveBeenCalledWith("printBackground", "true");
61
71
  });
62
72
  });
73
+
74
+ describe("when omitBackground parameter is set", () => {
75
+ it("should append omitBackground to data", () => {
76
+ ConverterUtils.injectPageProperties(data, {
77
+ omitBackground: true,
78
+ });
79
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
80
+ expect(data.append).toHaveBeenCalledWith("omitBackground", "true");
81
+ });
82
+ });
63
83
  });
64
84
 
65
85
  describe("Page landscape", () => {
@@ -68,7 +88,7 @@ describe("ConverterUtils", () => {
68
88
  ConverterUtils.injectPageProperties(data, {
69
89
  landscape: true,
70
90
  });
71
- expect(mockFormDataAppend).toBeCalledTimes(1);
91
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
72
92
  expect(data.append).toHaveBeenCalledWith("landscape", "true");
73
93
  });
74
94
  });
@@ -80,7 +100,7 @@ describe("ConverterUtils", () => {
80
100
  ConverterUtils.injectPageProperties(data, {
81
101
  scale: 1.5,
82
102
  });
83
- expect(mockFormDataAppend).toBeCalledTimes(1);
103
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
84
104
  expect(data.append).toHaveBeenCalledWith("scale", 1.5);
85
105
  });
86
106
  });
@@ -92,10 +112,216 @@ describe("ConverterUtils", () => {
92
112
  ConverterUtils.injectPageProperties(data, {
93
113
  nativePageRanges: { from: 1, to: 6 },
94
114
  });
95
- expect(mockFormDataAppend).toBeCalledTimes(1);
115
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
96
116
  expect(data.append).toHaveBeenCalledWith("nativePageRanges", "1-6");
97
117
  });
98
118
  });
99
119
  });
100
120
  });
121
+
122
+ describe("customize", () => {
123
+ describe("when no option is passed", () => {
124
+ it("should not append anything", async () => {
125
+ await ConverterUtils.customize(data, {});
126
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(0);
127
+ });
128
+ });
129
+
130
+ describe("when header parameter is passed", () => {
131
+ it("should append header", async () => {
132
+ mockPromisesAccess.mockResolvedValue();
133
+ await ConverterUtils.customize(data, {
134
+ header: "path/to/header.html",
135
+ });
136
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
137
+ expect(data.append).toHaveBeenCalledWith(
138
+ "header.html",
139
+ "path/to/header.html"
140
+ );
141
+ });
142
+ });
143
+
144
+ describe("when footer parameter is passed", () => {
145
+ it("should append footer", async () => {
146
+ mockPromisesAccess.mockResolvedValue();
147
+ await ConverterUtils.customize(data, {
148
+ footer: "path/to/footer.html",
149
+ });
150
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
151
+ expect(data.append).toHaveBeenCalledWith(
152
+ "footer.html",
153
+ "path/to/footer.html"
154
+ );
155
+ });
156
+ });
157
+
158
+ describe("when pdf format parameter is passed", () => {
159
+ it("should append pdf format", async () => {
160
+ await ConverterUtils.customize(data, {
161
+ pdfFormat: PdfFormat.A_1a,
162
+ });
163
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
164
+ expect(data.append).toHaveBeenCalledWith("pdfa", "PDF/A-1a");
165
+ });
166
+ });
167
+
168
+ describe("when pdf universal access parameter is passed", () => {
169
+ it("should append pdfua format", async () => {
170
+ await ConverterUtils.customize(data, {
171
+ pdfUA: true,
172
+ });
173
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
174
+ expect(data.append).toHaveBeenCalledWith("pdfua", "true");
175
+ });
176
+ });
177
+
178
+ describe("when page properties parameter is passed", () => {
179
+ it("should append page propertiers", async () => {
180
+ await ConverterUtils.customize(data, {
181
+ properties: { size: { width: 8.3, height: 11.7 } },
182
+ });
183
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(2);
184
+ expect(data.append).toHaveBeenCalledWith("paperWidth", 8.3);
185
+ expect(data.append).toHaveBeenNthCalledWith(2, "paperHeight", 11.7);
186
+ });
187
+ });
188
+
189
+ describe("when emulatedMediaType parameter is passed", () => {
190
+ it("should append emulatedMediaType", async () => {
191
+ await ConverterUtils.customize(data, {
192
+ emulatedMediaType: "screen",
193
+ });
194
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
195
+ expect(data.append).toHaveBeenCalledWith("emulatedMediaType", "screen");
196
+ });
197
+ });
198
+
199
+ describe("when waitDelay parameter is passed", () => {
200
+ it("should append waitDelay", async () => {
201
+ await ConverterUtils.customize(data, {
202
+ waitDelay: "5s",
203
+ });
204
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
205
+ expect(data.append).toHaveBeenCalledWith("waitDelay", "5s");
206
+ });
207
+ });
208
+
209
+ describe("when waitForExpression parameter is passed", () => {
210
+ it("should append waitForExpression", async () => {
211
+ await ConverterUtils.customize(data, {
212
+ waitForExpression: "document.readyState === 'complete'",
213
+ });
214
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
215
+ expect(data.append).toHaveBeenCalledWith(
216
+ "waitForExpression",
217
+ "document.readyState === 'complete'"
218
+ );
219
+ });
220
+ });
221
+
222
+ describe("when userAgent parameter is passed", () => {
223
+ it("should append userAgent", async () => {
224
+ const userAgent =
225
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
226
+
227
+ await ConverterUtils.customize(data, {
228
+ userAgent,
229
+ });
230
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
231
+ expect(data.append).toHaveBeenCalledWith("userAgent", userAgent);
232
+ });
233
+ });
234
+
235
+ describe("when extraHttpHeaders parameter is passed", () => {
236
+ it("should append extraHttpHeaders", async () => {
237
+ const extraHttpHeaders = {
238
+ "X-Custom-Header": "value",
239
+ };
240
+
241
+ await ConverterUtils.customize(data, {
242
+ extraHttpHeaders,
243
+ });
244
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
245
+ expect(data.append).toHaveBeenCalledWith(
246
+ "extraHttpHeaders",
247
+ JSON.stringify(extraHttpHeaders)
248
+ );
249
+ });
250
+ });
251
+
252
+ describe("when failOnConsoleExceptions parameter is passed", () => {
253
+ it("should append failOnConsoleExceptions", async () => {
254
+ await ConverterUtils.customize(data, {
255
+ failOnConsoleExceptions: true,
256
+ });
257
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(1);
258
+ expect(data.append).toHaveBeenCalledWith(
259
+ "failOnConsoleExceptions",
260
+ "true"
261
+ );
262
+ });
263
+ });
264
+
265
+ describe("when all options are passed", () => {
266
+ it("should append all options", async () => {
267
+ mockPromisesAccess.mockResolvedValue();
268
+
269
+ await ConverterUtils.customize(data, {
270
+ header: "path/to/header.html",
271
+ footer: "path/to/footer.html",
272
+ pdfFormat: PdfFormat.A_1a,
273
+ pdfUA: true,
274
+ emulatedMediaType: "screen",
275
+ properties: { size: { width: 8.3, height: 11.7 } },
276
+ waitDelay: "5s",
277
+ waitForExpression: "document.readyState === 'complete'",
278
+ userAgent:
279
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
280
+ extraHttpHeaders: { "X-Custom-Header": "value" },
281
+ failOnConsoleExceptions: true,
282
+ });
283
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(12);
284
+ expect(data.append).toHaveBeenNthCalledWith(1, "pdfa", "PDF/A-1a");
285
+ expect(data.append).toHaveBeenNthCalledWith(2, "pdfua", "true");
286
+ expect(data.append).toHaveBeenNthCalledWith(
287
+ 3,
288
+ "header.html",
289
+ "path/to/header.html"
290
+ );
291
+ expect(data.append).toHaveBeenNthCalledWith(
292
+ 4,
293
+ "footer.html",
294
+ "path/to/footer.html"
295
+ );
296
+ expect(data.append).toHaveBeenNthCalledWith(
297
+ 5,
298
+ "emulatedMediaType",
299
+ "screen"
300
+ );
301
+ expect(data.append).toHaveBeenNthCalledWith(6, "paperWidth", 8.3);
302
+ expect(data.append).toHaveBeenNthCalledWith(7, "paperHeight", 11.7);
303
+ expect(data.append).toHaveBeenNthCalledWith(8, "waitDelay", "5s");
304
+ expect(data.append).toHaveBeenNthCalledWith(
305
+ 9,
306
+ "waitForExpression",
307
+ "document.readyState === 'complete'"
308
+ );
309
+ expect(data.append).toHaveBeenNthCalledWith(
310
+ 10,
311
+ "userAgent",
312
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
313
+ );
314
+ expect(data.append).toHaveBeenNthCalledWith(
315
+ 11,
316
+ "extraHttpHeaders",
317
+ JSON.stringify({ "X-Custom-Header": "value" })
318
+ );
319
+ expect(data.append).toHaveBeenNthCalledWith(
320
+ 12,
321
+ "failOnConsoleExceptions",
322
+ "true"
323
+ );
324
+ });
325
+ });
326
+ });
101
327
  });
@@ -20,25 +20,37 @@ export class PDFEngine {
20
20
  files,
21
21
  properties,
22
22
  pdfFormat,
23
+ pdfUA,
23
24
  merge,
24
25
  }: {
25
26
  files: PathLike[];
26
27
  properties?: PageProperties;
27
28
  pdfFormat?: PdfFormat;
29
+ pdfUA?: boolean;
28
30
  merge?: boolean;
29
31
  }): Promise<Buffer> {
30
32
  const data = new FormData();
33
+
31
34
  if (pdfFormat) {
32
- data.append("pdfFormat", pdfFormat);
35
+ data.append("pdfa", pdfFormat);
36
+ }
37
+
38
+ if (pdfUA) {
39
+ data.append("pdfUA", String(pdfUA));
33
40
  }
41
+
34
42
  if (merge) {
35
43
  data.append("merge", String(merge));
36
44
  }
45
+
37
46
  if (properties) {
38
47
  LibreOfficeUtils.injectPageProperties(data, properties);
39
48
  }
49
+
40
50
  await LibreOfficeUtils.injectFiles(files, data);
51
+
41
52
  const endpoint = `${Chromiumly.GOTENBERG_ENDPOINT}/${Chromiumly.LIBRE_OFFICE_PATH}/${Chromiumly.LIBRE_OFFICE_ROUTES.convert}`;
53
+
42
54
  return GotenbergUtils.fetch(endpoint, data);
43
55
  }
44
56
 
@@ -47,10 +47,11 @@ describe("PDFEngine", () => {
47
47
  files: ["path/to/file.docx", "path/to/file.bib"],
48
48
  properties: { landscape: true },
49
49
  pdfFormat: PdfFormat.A_1a,
50
+ pdfUA: true,
50
51
  merge: true,
51
52
  });
52
53
  expect(buffer).toEqual(Buffer.from("content"));
53
- expect(mockFormDataAppend).toHaveBeenCalledTimes(5);
54
+ expect(mockFormDataAppend).toHaveBeenCalledTimes(6);
54
55
  });
55
56
  });
56
57
  });
@@ -1,10 +0,0 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
- import { PathLike } from "fs";
4
- import { PdfFormat } from "../../common";
5
- import { PageProperties } from "./converter.types";
6
- export interface IConverter {
7
- convert({ ...args }: {
8
- [x: string]: string | PathLike | PageProperties | PdfFormat;
9
- }): Promise<Buffer>;
10
- }
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=converter.interface.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"converter.interface.js","sourceRoot":"","sources":["../../../src/chromium/interfaces/converter.interface.ts"],"names":[],"mappings":""}
@@ -1,12 +0,0 @@
1
- import { PathLike } from "fs";
2
-
3
- import { PdfFormat } from "../../common";
4
- import { PageProperties } from "./converter.types";
5
-
6
- export interface IConverter {
7
- convert({
8
- ...args
9
- }: {
10
- [x: string]: string | PathLike | PageProperties | PdfFormat;
11
- }): Promise<Buffer>;
12
- }