mindee
Version:
Mindee Client Library for Node.js
55 lines (54 loc) • 2.51 kB
JavaScript
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;
}