Skip to content
Snippets Groups Projects
pdfParser.ts 3.74 KiB
Newer Older
  • Learn to ignore specific revisions
  • Zdravko Iliev's avatar
    Zdravko Iliev committed
    // import { PDFName, PDFPage, PDFString, PDFDocument, PDFImage } from "pdf-lib";
    import { nopodofo as npdf } from "nopodofo";
    
    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 { pdf } from "./utils";
    
    
    type SealCoords = {
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      [key: string]: { x: string; y: string };
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    class PDFparser {
      readonly document;
      readonly config;
    
      constructor(document: Buffer) {
        this.document = document;
        this.config = config;
      }
    
    
      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,
    
        scaleFactor: number
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      ): Promise<ArrayBuffer> => {
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
        const test = await pdf(this.document);
    
        // const pdfDoc = await doc.load(
        //   this.document,
        //   { forUpdate: true },
        //   (e, data: any) => {
        //     const test = data.getPageCount();
    
        //     console.log({ test });
    
        //     const firest = data.getPage(1);
    
        //     console.log(firest);
        //   }
        // );
    
        // // const pdfDoc = await PDFDocument.load(this.document);
        // let img: PDFImage;
        // try {
        //   img = await pdfDoc.embedPng(imgBytes);
        // } catch (error) {
        //   console.log(error);
        // }
    
        // const scaled = img.scale(scaleFactor);
    
        // const pages = pdfDoc.getPageCount();
    
        // for (let index = 0; index < pages.length; index++) {
        //   const page = pages[index];
    
        //   const x =
        //     typeof coords[index + 1] !== "undefined"
        //       ? parseFloat(coords[index + 1].x)
        //       : null;
    
        //   const y =
        //     typeof coords[index + 1] !== "undefined"
        //       ? parseFloat(coords[index + 1].y)
        //       : null;
    
        //   if (x && y) {
        //     page.drawImage(img, {
        //       x,
        //       y,
        //       width: scaled.width,
        //       height: scaled.height,
        //     });
    
        //     const link = this.createPageLinkAnnotation(page, url, {
        //       imgXPos: x,
        //       imgYPos: y,
        //       imgWidth: scaled.width,
        //       imagHeight: scaled.height,
        //     });
    
        //     page.node.set(PDFName.of("Annots"), pdfDoc.context.obj([link]));
        //   }
        // }
    
        // const pdfBytes = await pdfDoc.save();
        return new ArrayBuffer(1);
        // return pdfBytes;
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
      };
    
    
      private createPageLinkAnnotation = (
        page: PDFPage,
        uri: string,
        { imgXPos, imgYPos, imgWidth, imagHeight }
      ) =>
        page.doc.context.register(
          page.doc.context.obj({
            Type: "Annot",
            Subtype: "Link",
            Rect: [imgXPos, imgYPos, imgXPos + imgWidth, imgYPos + imagHeight],
            A: {
              Type: "Action",
              S: "URI",
              URI: PDFString.of(uri),
            },
          })
        );
    
    Zdravko Iliev's avatar
    Zdravko Iliev committed
    }
    
    export default PDFparser;