import { PDFNet } from "@pdftron/pdfnet-node"; export const TimestampAndEnableLTV = async ( docBuffer: ArrayBuffer, certPath: string, certTSAUrl: string, imgBytes: ArrayBuffer, coords: any ): Promise<ArrayBuffer> => { const doc = await PDFNet.PDFDoc.createFromBuffer(docBuffer); doc.initSecurityHandler(); const tst_config = await PDFNet.TimestampingConfiguration.createFromURL( certTSAUrl ); const opts = await PDFNet.VerificationOptions.create( PDFNet.VerificationOptions.SecurityLevel.e_compatibility_and_archiving ); await opts.addTrustedCertificateUString(certPath); const img = await PDFNet.Image.createFromMemory2(doc, imgBytes); //make this dynamic with canvas lib const imgWidth = 300; const imgHeight = 300; const pagesForSining = Object.keys(coords).map((k) => { return parseInt(k); }); const pages = await doc.getPageCount(); let result; for (let p = 1; p <= pages; p++) { if (!pagesForSining.includes(p)) { continue; } const page = await doc.getPage(p); const doctimestamp_signature_field = await doc.createDigitalSignatureField(); const widgetAnnot = await PDFNet.SignatureWidget.createWithDigitalSignatureField( doc, new PDFNet.Rect( parseFloat(coords[p].x), parseFloat(coords[p].x + imgWidth), parseFloat(coords[p].y), parseFloat(coords[p].y + imgHeight) ), doctimestamp_signature_field ); await page.annotPushBack(widgetAnnot); await widgetAnnot.createSignatureAppearance(img); await doctimestamp_signature_field.timestampOnNextSave(tst_config, opts); result = await doc.saveMemoryBuffer( PDFNet.SDFDoc.SaveOptions.e_incremental ); } return result.buffer; };