Skip to content

Commit

Permalink
Merge pull request #120 from dotkom/fix/new-pdf-generator
Browse files Browse the repository at this point in the history
Add new browserless PDF generator
  • Loading branch information
henrikskog committed Mar 27, 2022
2 parents a517188 + 4616b35 commit e7f3ec4
Show file tree
Hide file tree
Showing 5 changed files with 507 additions and 17 deletions.
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,20 @@
"@sentry/browser": "^5.0.3",
"@sentry/node": "^5.4.3",
"@types/file-saver": "^2.0.0",
"@types/get-stream": "^3.0.2",
"@types/jsdom": "^16.2.4",
"@types/mime-types": "^2.1.0",
"@types/node": "^14.11.10",
"@types/nodemailer": "^6.2.0",
"@types/pdfkit": "^0.12.3",
"@types/puppeteer": "^5.4.0",
"@types/react": "16.9.53",
"@types/react-dom": "16.9.8",
"@types/react-redux": "^7.1.0",
"@types/styled-components": "^5.1.4",
"core-js": "^3.0.1",
"file-saver": "^2.0.1",
"get-stream": "^6.0.1",
"isomorphic-fetch": "^3.0.0",
"jsdom": "^16.4.0",
"markdown-to-jsx": "^7.0.1",
Expand All @@ -28,6 +31,7 @@
"nodemailer": "^6.3.0",
"oidc-client": "^1.10.1",
"pdf-lib": "^1.11.2",
"pdfkit": "^0.13.0",
"puppeteer": "^5.2.1",
"react": "^16.14.0",
"react-dom": "^16.14.0",
Expand Down
55 changes: 55 additions & 0 deletions src/lambda/browserlessGenerator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import Document from 'pdfkit';
import getStream from 'get-stream';
import { EncryptedAttachmentError, PdfRenderError } from './errors';
import { mergeAttachments, NonNullableState } from './generatePDF';
import { getCurrentDateString } from './tools/date';
import { readFileAsDataUrl } from 'utils/readFileAsDataUrl';
import { getGroupName } from 'models/groups';
import { formatAmount } from './tools/format';

const createTableRow = (document: PDFKit.PDFDocument, height: number, label: string, value: string) => {
document.fontSize(14).text(label, 100, height).text(value, 220, height);
};

const createTableDocument = async (state: NonNullableState): Promise<Buffer> => {
const pdf = new Document();
pdf.fontSize(25).text('Kvitteringsskjema', 100, 80);
createTableRow(pdf, 120, 'Navn: ', state.fullname);
createTableRow(pdf, 140, 'Epost: ', state.email);
createTableRow(pdf, 160, 'Ansvarlig enhet: ', getGroupName(state.committee));
createTableRow(pdf, 180, 'Dato: ', getCurrentDateString());
if (state.type === 'card') {
createTableRow(pdf, 200, 'Kontonummer: ', state.cardDetails);
} else {
createTableRow(pdf, 200, 'Kontonummer: ', state.account);
}
createTableRow(pdf, 220, 'Beløp: ', formatAmount(state.amount));
createTableRow(pdf, 240, 'Anledning: ', state.intent);
createTableRow(pdf, 260, 'Type: ', state.type === 'card' ? 'Bankkort' : 'Utlegg');
pdf.fontSize(14).text('Kommentar', 100, 300).moveDown().text(state.comments, {
width: 412,
align: 'justify',
indent: 0,
columns: 1,
height: 300,
ellipsis: true,
});
const image = await readFileAsDataUrl(state.signature);
pdf.image(image, 100, 600, { width: 400 });
pdf.end();
return await getStream.buffer(pdf);
};

export const pdfGenerator = async (form: NonNullableState): Promise<Uint8Array> => {
try {
const table = await createTableDocument(form);
const completePdf = await mergeAttachments(table, form.attachments);
// await setTimeoutAsync(5000);
return completePdf;
} catch (error) {
if (error.message.includes('encrypted')) {
throw new EncryptedAttachmentError(error.message);
}
throw new PdfRenderError(error);
}
};
2 changes: 1 addition & 1 deletion src/lambda/generatePDF.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ const renderStringToPdf = async (html: string, css: string) => {
}
};

const mergeAttachments = async (pdf: Buffer, attachments: File[]) => {
export const mergeAttachments = async (pdf: Buffer, attachments: File[]) => {
/** Initialize a new PDF document as output */
const frontPageDocument = await PDFDocument.load(new Uint8Array(pdf));
const outputPdf = await PDFDocument.create();
Expand Down
3 changes: 2 additions & 1 deletion src/lambda/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ import './polyfills';
import { IDeserializedState, serializeReceipt } from 'form/state';
import { getIsValid } from 'form/validation';

import { NonNullableState, pdfGenerator } from './generatePDF';
import { NonNullableState } from './generatePDF';

import { readFileAsDataUrl } from 'utils/readFileAsDataUrl';
import { sendEmail } from './sendEmail';
import { ApiBodyError, ApiValidationError } from './errors';
import { pdfGenerator } from './browserlessGenerator';

export interface SuccessBody {
message: string;
Expand Down

1 comment on commit e7f3ec4

@vercel
Copy link

@vercel vercel bot commented on e7f3ec4 Mar 27, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.