Skip to content
Snippets Groups Projects
utils.ts 1.75 KiB
Newer Older
  • Learn to ignore specific revisions
  • Zdravko Iliev's avatar
    Zdravko Iliev committed
    import { PDFNet } from "@pdftron/pdfnet-node";
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    export const TimestampAndEnableLTV = async (
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      docBuffer: ArrayBuffer,
      certPath: string,
      certTSAUrl: string,
      imgBytes: ArrayBuffer,
      coords: any
    ): Promise<ArrayBuffer> => {
      const doc = await PDFNet.PDFDoc.createFromBuffer(docBuffer);
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      doc.initSecurityHandler();
      const tst_config = await PDFNet.TimestampingConfiguration.createFromURL(
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        certTSAUrl
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      );
      const opts = await PDFNet.VerificationOptions.create(
        PDFNet.VerificationOptions.SecurityLevel.e_compatibility_and_archiving
      );
    
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      await opts.addTrustedCertificateUString(certPath);
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      const img = await PDFNet.Image.createFromMemory2(doc, imgBytes);
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      //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;
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        }
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        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
          );
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        await page.annotPushBack(widgetAnnot);
        await widgetAnnot.createSignatureAppearance(img);
        await doctimestamp_signature_field.timestampOnNextSave(tst_config, opts);
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        result = await doc.saveMemoryBuffer(
          PDFNet.SDFDoc.SaveOptions.e_incremental
        );
      }
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      return result.buffer;
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    };