Skip to content
Snippets Groups Projects
utils.ts 1.79 KiB
Newer Older
  • Learn to ignore specific revisions
  • Zdravko Iliev's avatar
    Zdravko Iliev committed
    export const TimestampAndEnableLTV = async (
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      docBuffer: ArrayBuffer,
    
      certPath: string | ArrayBuffer,
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      certTSAUrl: string,
      imgBytes: ArrayBuffer,
    
      coords: any,
      lib: any
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    ): Promise<ArrayBuffer> => {
    
      const doc = await lib.PDFDoc.createFromBuffer(docBuffer);
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      doc.initSecurityHandler();
    
      const tst_config = await lib.TimestampingConfiguration.createFromURL(
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        certTSAUrl
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      );
    
      const opts = await lib.VerificationOptions.create(
        lib.VerificationOptions.SecurityLevel.e_compatibility_and_archiving
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      );
    
    
      if (typeof certPath === "string") {
        await opts.addTrustedCertificateUString(certPath);
      } else {
        await opts.addTrustedCertificate(certPath);
      }
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    
    
      const img = await lib.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 lib.SignatureWidget.createWithDigitalSignatureField(
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
            doc,
    
            new lib.Rect(
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
              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
    
    
        result = await doc.saveMemoryBuffer(lib.SDFDoc.SaveOptions.e_incremental);
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      }
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      return result.buffer;
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    };