From c81ad1b5d5f8bfacfc54ccf2af9a5b28c6546a32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C8=98tefan=20Patachi?= Date: Thu, 1 Aug 2024 12:02:04 +0200 Subject: [PATCH] updated PDF extractor --- client/src/lib/PDFReceiptDocument.ts | 42 +++++++++++++++++++ client/src/lib/receiptPDFExtractor.ts | 47 ---------------------- client/src/views/BallotTrackingLanding.vue | 16 ++++---- 3 files changed, 50 insertions(+), 55 deletions(-) create mode 100644 client/src/lib/PDFReceiptDocument.ts delete mode 100644 client/src/lib/receiptPDFExtractor.ts diff --git a/client/src/lib/PDFReceiptDocument.ts b/client/src/lib/PDFReceiptDocument.ts new file mode 100644 index 00000000..901b62d7 --- /dev/null +++ b/client/src/lib/PDFReceiptDocument.ts @@ -0,0 +1,42 @@ +import {PDFDocument, PDFName, PDFParser} from "pdf-lib"; + +export class PDFReceiptDocument extends PDFDocument{ + static async loadReceipt(file: File) { + const ignoreEncryption = false + const updateMetadata = false + + return new Promise((resolve, reject) => { + // FileReader api + const reader = new FileReader(); + reader.readAsArrayBuffer(file); + reader.onload = async () => { + try { + const bytes = new Uint8Array(reader.result); + const context = await PDFParser.forBytesWithOptions(bytes).parseDocument(); + const pdfReceiptDoc = new PDFReceiptDocument(context, ignoreEncryption, updateMetadata); + resolve(pdfReceiptDoc) + } catch (err) { + reject(err.message) + return + } + } + reader.onerror = () => { + reject("Could not load receipt file") + } + }) + } + + public getReceipt(): string | undefined { + const receiptName = PDFName.of('Receipt') + const receipt = this.getInfoDict().lookup(receiptName); + if (!receipt) return undefined; + return receipt.decodeText(); + } + + public getTrackingCode(): string | undefined { + const trackingCodeName = PDFName.of('TrackingCode') + const trackingCode = this.getInfoDict().lookup(trackingCodeName); + if (!trackingCode) return undefined; + return trackingCode.decodeText(); + } +} diff --git a/client/src/lib/receiptPDFExtractor.ts b/client/src/lib/receiptPDFExtractor.ts deleted file mode 100644 index 745ee4b3..00000000 --- a/client/src/lib/receiptPDFExtractor.ts +++ /dev/null @@ -1,47 +0,0 @@ -import {PDFDocument, PDFName} from "pdf-lib"; - -export class ReceiptPDFExtractor { - private readonly file: File - public receipt: string - public trackingCode: string - - constructor(file: File) { - this.file = file - } - - public async extract() { - return new Promise((resolve, reject) => { - // FileReader api - const reader = new FileReader(); - reader.readAsArrayBuffer(this.file); - reader.onload = async () => { - let pdfDoc - try { - pdfDoc = await PDFDocument.load(reader.result, {updateMetadata: false}) - } catch (err) { - reject(err.message) - return - } - - const receiptName = PDFName.of('Receipt') - const receipt = pdfDoc.getInfoDict().lookup(receiptName) - - const trackingCodeName = PDFName.of('TrackingCode') - const trackingCode = pdfDoc.getInfoDict().lookup(trackingCodeName) - - if (receipt == null || trackingCode == null) { - reject("Invalid receipt file") - return - } - - this.receipt = receipt.decodeText() - this.trackingCode = trackingCode.decodeText() - - resolve() - } - reader.onerror = () => { - reject("Could not load receipt file") - } - }) - } -} diff --git a/client/src/views/BallotTrackingLanding.vue b/client/src/views/BallotTrackingLanding.vue index 36d7be8a..e32913fc 100644 --- a/client/src/views/BallotTrackingLanding.vue +++ b/client/src/views/BallotTrackingLanding.vue @@ -9,7 +9,7 @@ import Error from "../components/Error.vue"; import ContentLayout from "../components/ContentLayout.vue"; import MainIcon from "../components/MainIcon.vue"; import { useRoute } from "vue-router"; -import {ReceiptPDFExtractor} from "../lib/receiptPDFExtractor"; +import {PDFReceiptDocument} from "@/lib/PDFReceiptDocument"; const verificationStore = useVerificationStore(); const configStore = useConfigStore(); @@ -34,15 +34,15 @@ const parseReceipt = async (event: Event) => { const file = fileInput.files?.[0]; if (file) { - const receiptExtractor = new ReceiptPDFExtractor(file) - await receiptExtractor.extract().catch((reason) => { - console.error(reason) - }) + const pdfReceiptDoc = await PDFReceiptDocument.loadReceipt(file) - console.log("receipt: ", receiptExtractor.receipt) - console.log("tracking code: ", receiptExtractor.trackingCode) + const receipt = pdfReceiptDoc.getReceipt() + console.log("receipt: " + receipt) - const receiptValid = verificationStore.isReceiptValid(receiptExtractor.receipt, receiptExtractor.trackingCode) + const trackingCode = pdfReceiptDoc.getTrackingCode() + console.log("tracking code: " + trackingCode) + + const receiptValid = verificationStore.isReceiptValid(receipt, trackingCode) console.log("valid receipt: ", receiptValid) } }