84 lines
1.6 KiB
TypeScript
84 lines
1.6 KiB
TypeScript
import BaseService from "@Services/BaseService";
|
|
import puppeteer from "puppeteer";
|
|
import { Service } from "typedi";
|
|
|
|
import proofTemplate from "./proofTemplate";
|
|
|
|
export interface AnchoringProofData {
|
|
rootHash: string;
|
|
anchoringTime: string;
|
|
txLink: string;
|
|
office_name: string;
|
|
}
|
|
|
|
@Service()
|
|
export default class AnchoringProofService extends BaseService {
|
|
constructor() {
|
|
super();
|
|
}
|
|
|
|
/**
|
|
* @description : Generate a PDF file from a SVG template from anchoring proof data
|
|
*/
|
|
public async generate(data: AnchoringProofData): Promise<Buffer> {
|
|
const browser = await puppeteer.launch({
|
|
executablePath: `/usr/bin/chromium`,
|
|
args: ["--no-sandbox", "--disable-setuid-sandbox"],
|
|
});
|
|
|
|
const page = await browser.newPage();
|
|
|
|
const proofTemplateSvg = proofTemplate({
|
|
rootHash: data.rootHash,
|
|
anchoringTime: data.anchoringTime,
|
|
officeName: data.office_name,
|
|
txLink: data.txLink,
|
|
});
|
|
|
|
var htmlContent = `
|
|
<html>
|
|
<body>
|
|
${proofTemplateSvg}
|
|
</body>
|
|
</html>
|
|
`;
|
|
|
|
await page.setContent(htmlContent, { waitUntil: "networkidle0", timeout: 1200000 });
|
|
await page.addStyleTag({
|
|
content: `
|
|
@page {
|
|
size: A4 landscape;
|
|
margin: 0;
|
|
}
|
|
html, body {
|
|
margin: 0;
|
|
padding: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
body {
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
svg {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
`,
|
|
});
|
|
|
|
const uint8Array = await page.pdf({
|
|
landscape: true,
|
|
printBackground: false,
|
|
format: "A4",
|
|
});
|
|
|
|
const buffer = Buffer.from(uint8Array);
|
|
|
|
await browser.close();
|
|
|
|
return buffer;
|
|
}
|
|
}
|