-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgotenbergService.ts
87 lines (77 loc) · 2.77 KB
/
gotenbergService.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import correlator from 'express-correlation-id';
import FormData from 'form-data';
import { config } from '../../../config/config';
import { logger } from '../../../logger';
import { synchronousResponseToError } from '../../../utils/errorHandling';
import fetchWithRetry from '../../../utils/fetchWithRetry';
const { gotenbergUrl } = config;
// Sette opp formdata til å merge en liste av PDFer
export const mergeFiles = async (
schema: string,
title: string,
language: string,
fileList: Buffer<ArrayBuffer>[],
options: { pdfa: boolean; pdfua: boolean },
): Promise<any> => {
const formData = new FormData();
// Add the main content
fileList.forEach((buffer, index) => {
if (buffer != undefined && index != undefined) {
formData.append('files', buffer, `file${index}.pdf`);
}
});
// Add Gotenberg-specific options
formData.append('pdfa', options.pdfa ? 'PDF/A-2b' : '');
formData.append('pdfua', options.pdfua ? 'true' : '');
formData.append('skipNetworkIdleEvent', 'false');
const date = new Date();
const formattedDate = formatPDFDate(date);
const metadata = {
Author: 'Nav',
Creator: 'Nav',
Subject: schema,
CreationDate: formattedDate,
ModDate: formattedDate,
Title: title,
};
formData.append('metadata', `${JSON.stringify(metadata)}`);
// Hvordan sette språk? En engelsk og en norsk Gotenberg installasjon?
logger.info(`Skal kalle Gotenberg for å merge filer`);
return await callGotenberg('/forms/pdfengines/merge', formData);
};
const formatPDFDate = (date: Date) => {
return date.toISOString().replace(/\.\d{3}Z$/, ''); // Removes milliseconds & Zulu time
};
// Generisk metode for kall til mot Gotenberg gitt rute og preparert FormData
export const callGotenberg = async (route: string, formData: FormData): Promise<any> => {
console.log(`Calling Gotenberg with url = ${gotenbergUrl}${route}`);
try {
// Send the request to Gotenberg
const gotenbergResponse = await fetchWithRetry(`${gotenbergUrl}${route}`, {
retry: 1,
headers: {
accept: 'application/pdf, text/plain',
correlation_id: correlator.getId(),
} as HeadersInit,
method: 'POST',
body: formData,
});
if (!gotenbergResponse.ok) {
console.log(`Response fra Gotenberg feilet`);
const errorText = await gotenbergResponse.text();
throw synchronousResponseToError(
`Feil i responsdata fra Gotenberg på id "${correlator.getId()}"`,
errorText,
gotenbergResponse.status,
gotenbergResponse.url,
true,
);
}
const pdfBuffer = await gotenbergResponse.arrayBuffer();
console.log(`Returnerer fra callGotenberg`);
return pdfBuffer;
} catch (e) {
logger.error(`Request to gotenberg pdf service failed with ${e}`);
throw e;
}
};