Skip to content
Snippets Groups Projects
pdfParser.ts 2.49 KiB
Newer Older
  • Learn to ignore specific revisions
  • Zdravko Iliev's avatar
    Zdravko Iliev committed
    import { PdfData } from "pdfdataextract";
    import { config } from "./config";
    
    import { IGetMetaResponse } from "./types";
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    import { verifyPDF } from "./lib";
    import { formatPdfTime } from "./lib/timeUtils";
    
    import { AppError, GeneralError } from "./lib/errors";
    
    import { isPDF } from "./lib/generalUtils";
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    import { TimestampAndEnableLTV } from "./utils";
    
    
    type SealCoords = {
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      [key: string]: { x: string; y: string };
    
    declare global {
      interface Window {
        PDFNet: any;
        CoreControls: any;
      }
    }
    
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    class PDFparser {
      readonly document;
    
      constructor(document: Buffer) {
        this.document = document;
      }
    
    
      getPDFMeta = async (): Promise<IGetMetaResponse> => {
    
        if (!(this.document instanceof Buffer)) {
          throw new AppError("Document is not Buffer");
        }
    
    
        if (!isPDF(this.document)) {
          throw new AppError("Only pdf file type is supported");
        }
    
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        try {
          const signaturesMeta = await verifyPDF(this.document);
    
          const pdfMeta = await PdfData.extract(this.document, config);
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
          const result = {
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
            pages: pdfMeta.pages,
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
            title: pdfMeta.info.Title || "Unknown",
            author: pdfMeta.info.Author || "Unknown",
            creation_date: formatPdfTime(pdfMeta.info.CreationDate),
            mod_date: formatPdfTime(pdfMeta.info.ModDate),
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
          };
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    
    
          if (signaturesMeta) {
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
            result["signatures"] = signaturesMeta.signatures;
    
            result["expired"] = signaturesMeta.expired;
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
          }
    
          return result;
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        } catch (error) {
    
          throw new GeneralError(error);
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        }
      };
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      insertQrCode = async (
        imgBytes: ArrayBuffer,
    
        url: string,
    
        coords: SealCoords,
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        scaleFactor: number,
        licenseKey: string,
    
        certPath: string | ArrayBuffer,
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        certTSAUrl: string
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      ): Promise<ArrayBuffer> => {
    
        let lib, buf;
        if (typeof window !== `undefined`) {
          lib = window.PDFNet;
          const CoreControls = window.CoreControls;
          CoreControls.setWorkerPath("webviewer/core");
        } else {
          const pdflib = await import("@pdftron/pdfnet-node");
          lib = pdflib.PDFNet;
        }
    
        //will this work ??
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        console.log(lib);
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        try {
          await lib.initialize(licenseKey);
        } catch (e) {
          console.log(e);
        }
    
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        try {
          buf = await TimestampAndEnableLTV(
            this.document,
            certPath,
            certTSAUrl,
            imgBytes,
    
            coords,
            lib
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
          );
        } catch (error) {
          console.log(error);
          throw new GeneralError("Could Not sign pdf");
        }
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    
    
        await lib.shutdown();
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        return buf;
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      };
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    }
    
    export default PDFparser;