UNPKG

mindee

Version:

Mindee Client Library for Node.js

55 lines (54 loc) 2.51 kB
import { MindeeError } from "../../../errors/index.js"; import { createPdfFromInputSource } from "../../../pdf/pdfOperation.js"; import { ExtractedMultiReceiptImage } from "../../../v1/extraction/index.js"; import { extractFromPage } from "../../../image/index.js"; import { loadOptionalDependency } from "../../../dependency/index.js"; let pdfLib = null; async function getPdfLib() { if (!pdfLib) { const pdfLibImport = await loadOptionalDependency("@cantoo/pdf-lib", "Text Embedding"); pdfLib = pdfLibImport.default || pdfLibImport; } return pdfLib; } /** * Given a page and a set of coordinates, extracts & assigns individual receipts to an ExtractedMultiReceiptImage * object. * * @param pdfPage PDF Page to extract from. * @param boundingBoxes A set of coordinates delimiting the position of each receipt. * @param pageId Id of the page the receipt is extracted from. Caution: this starts at 0, unlike the numbering in PDF * pages. */ async function extractReceiptsFromPage(pdfPage, boundingBoxes, pageId) { const manualUpscaleFactor = 300 / 72; const extractedReceiptsRaw = await extractFromPage(pdfPage, boundingBoxes, false, manualUpscaleFactor); const extractedReceipts = []; for (let i = 0; i < extractedReceiptsRaw.length; i++) { extractedReceipts.push(new ExtractedMultiReceiptImage(extractedReceiptsRaw[i], pageId, i)); } return extractedReceipts; } /** * Extracts individual receipts from multi-receipts documents. * * @param inputFile File to extract sub-receipts from. * @param inference Results of the inference. * @returns Individual extracted receipts as an array of ExtractedMultiReceiptImage. */ export async function extractReceipts(inputFile, inference) { const pdfLib = await getPdfLib(); const images = []; if (!inference.prediction.receipts) { throw new MindeeError("No possible receipts candidates found for MultiReceipts extraction."); } const pdfDoc = await createPdfFromInputSource(inputFile); for (let pageId = 0; pageId < pdfDoc.getPageCount(); pageId++) { const page = pdfDoc.getPage(pageId); page.setRotation(pdfLib.degrees(inference.pages[pageId].orientation?.value ?? 0)); const receiptPositions = inference.pages[pageId].prediction.receipts.map((receipt) => receipt.boundingBox); const extractedReceipts = await extractReceiptsFromPage(page, receiptPositions, pageId); images.push(...extractedReceipts); } return images; }