From faddc65211a6b3409acf72fd4bb48f66c3132a8a Mon Sep 17 00:00:00 2001 From: Piali Choudhury Date: Tue, 4 Feb 2025 17:03:49 -0800 Subject: [PATCH] ongoing changes --- ts/examples/docuProc/package.json | 4 +- ts/examples/docuProc/src/docuProc.ts | 277 ++++++++++++++++++++++++++- ts/examples/docuProc/src/main.ts | 9 +- ts/pnpm-lock.yaml | 171 +++++++++++++---- 4 files changed, 417 insertions(+), 44 deletions(-) diff --git a/ts/examples/docuProc/package.json b/ts/examples/docuProc/package.json index 9144c416..e5694a5f 100644 --- a/ts/examples/docuProc/package.json +++ b/ts/examples/docuProc/package.json @@ -23,6 +23,7 @@ }, "dependencies": { "aiclient": "workspace:*", + "canvas": "^3.1.0", "chalk": "^5.3.0", "code-processor": "workspace:*", "dotenv": "^16.3.1", @@ -30,14 +31,13 @@ "interactive-app": "workspace:*", "knowledge-processor": "workspace:*", "memory-providers": "workspace:*", - "pdf-parse": "1.1.1", + "pdfjs-dist": "^4.10.38", "typeagent": "workspace:*", "typechat": "^0.1.1", "typescript": "^5.4.2" }, "devDependencies": { "@types/node": "^18.18.7", - "@types/pdf-parse": "^1.1.4", "copyfiles": "^2.4.1", "rimraf": "^5.0.5" }, diff --git a/ts/examples/docuProc/src/docuProc.ts b/ts/examples/docuProc/src/docuProc.ts index eac24f81..44bd97ec 100644 --- a/ts/examples/docuProc/src/docuProc.ts +++ b/ts/examples/docuProc/src/docuProc.ts @@ -7,6 +7,8 @@ import { fetchWithRetry } from "aiclient"; import path from "path"; import fs from "fs"; import { fileURLToPath } from "url"; +import { getDocument, OPS } from "pdfjs-dist/legacy/build/pdf.mjs"; +import { createCanvas } from "canvas"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -29,6 +31,13 @@ interface ArxivPaper { journal_ref?: string; } +interface PdfChunk { + page: number; + chunkIndex: number; + text: string; + imageRefs?: string[]; +} + export async function fetchArxivPapers( query: ArxivQuery, ): Promise { @@ -51,7 +60,7 @@ export async function fetchArxivPapers( const queryParams = new URLSearchParams({ search_query: `${searchPrefix}${query.searchTerm}`, start: String(query.start ?? 0), - max_results: String(query.maxResults ?? 5), + max_results: String(query.maxResults ?? 3), sortBy: query.sortBy ?? "relevance", sortOrder: query.sortOrder ?? "descending", }); @@ -121,6 +130,17 @@ export function printArxivPaperParsedData(papers: ArxivPaper[]) { }); } +export async function createFolderIfNotExists( + folderPath: string, +): Promise { + try { + await fs.promises.mkdir(folderPath, { recursive: true }); + console.log(`Folder '${folderPath}' is ready.`); + } catch (error) { + console.error("Error creating folder:", error); + } +} + export function getValidFilename(paperId: string): string { return paperId.replace(/\//g, "__"); } @@ -134,7 +154,9 @@ function getPdfUrlFromId(id: string): { paperId: string; downloadUrl: string } { return { paperId: `${pid}`, downloadUrl: `https://arxiv.org/pdf/${pid}` }; } -export async function downloadArxivPaper(paper: ArxivPaper) { +export async function downloadArxivPaper( + paper: ArxivPaper, +): Promise { const arxivInfo = getPdfUrlFromId(paper.id); const outputDir = path.join(__dirname, "papers"); @@ -168,6 +190,255 @@ export async function downloadArxivPaper(paper: ArxivPaper) { return filePath; } catch (error) { console.error("Error downloading paper:", error); - return null; + return undefined; + } +} + +export async function extractTextChunksFromPdf( + pdfPath: string, + chunkSize: number = 4096, +): Promise { + try { + let outputDir = path.join(__dirname, "papers"); + const folderName = path.parse(pdfPath).name; + + outputDir = path.join(outputDir, folderName); + const pagesDir = path.join(outputDir, "pages"); + + createFolderIfNotExists(folderName); + createFolderIfNotExists(pagesDir); + + const data = new Uint8Array(fs.readFileSync(pdfPath)); + const loadingTask = getDocument({ data }); + const pdfDocument = await loadingTask.promise; + + let chunkIndex = 0; + for (let pageNum = 1; pageNum <= pdfDocument.numPages; pageNum++) { + const page = await pdfDocument.getPage(pageNum); + const textContent = await page.getTextContent(); + //const operatorList = await page.getOperatorList(); + + let currentText = ""; + const imageRefs: string[] = []; + + // Chunk text + for (const item of textContent.items) { + if ("str" in item) { + currentText += item.str + " "; + + if (currentText.length >= chunkSize) { + // Save the current chunk as a JSON file + const chunk: PdfChunk = { + page: pageNum, + chunkIndex, + text: currentText, + imageRefs: imageRefs, + }; + + const chunkFilename = `p_${pageNum}_c_${chunkIndex}.json`; + fs.writeFileSync( + path.join(pagesDir, chunkFilename), + JSON.stringify(chunk, null, 2), + ); + chunkIndex++; + currentText = ""; + } + } + } + + // If any leftover text remains, store it as the last chunk + if (currentText.length > 0) { + const chunk: PdfChunk = { + page: pageNum, + chunkIndex, + text: currentText, + imageRefs, + }; + const chunkFilename = `p_${pageNum}_c_${chunkIndex}.json`; + fs.writeFileSync( + path.join(pagesDir, chunkFilename), + JSON.stringify(chunk, null, 2), + ); + } + } + } catch (error) { + console.error("Error extracting text and images:", error); } } + +export async function extractTextAndImages( + pdfPath: string, + chunkSize: number = 4096, +) { + try { + let outputDir = path.join(__dirname, "papers"); + const folderName = path.parse(pdfPath).name; + outputDir = path.join(outputDir, folderName); + + // Ensure folder exists + if (!fs.existsSync(outputDir)) + fs.mkdirSync(outputDir, { recursive: true }); + if (!fs.existsSync(path.join(outputDir, "images"))) + fs.mkdirSync(path.join(outputDir, "images")); + + const data = new Uint8Array(fs.readFileSync(pdfPath)); + const loadingTask = getDocument({ data }); + const pdfDocument = await loadingTask.promise; + + console.log("PDF loaded"); + let chunks: PdfChunk[] = []; + let currentText = ""; + let chunkIndex = 0; + + // Process each page of the PDF + for (let pageNum = 1; pageNum <= pdfDocument.numPages; pageNum++) { + const page = await pdfDocument.getPage(pageNum); + const textContent = await page.getTextContent(); + const operatorList = await page.getOperatorList(); + const imageRefs: string[] = []; + + // Extract text + for (const item of textContent.items) { + if ("str" in item) { + currentText += item.str + " "; + if (currentText.length >= chunkSize) { + chunks.push({ + text: currentText, + page: pageNum, + chunkIndex, + imageRefs, + }); + currentText = ""; + chunkIndex++; + } + } + } + + extractImagesFromPage(operatorList, page, pageNum, outputDir); + } + + if (currentText.length > 0) { + chunks.push({ + text: currentText, + page: pdfDocument.numPages, + chunkIndex, + imageRefs: [], + }); + } + + return chunks; + } catch (error) { + console.error("Error extracting text and images:", error); + return []; + } +} + +export async function extractImagesFromPage( + operatorList: any, + page: any, + pageNum: number, + outputDir: string, +): Promise { + const imageRefs: string[] = []; + const viewport = page.getViewport({ scale: 1.0 }); + const scaleFactor = viewport.width / page.getViewport({ scale: 1.0 }).width; + + for (let i = 0; i < operatorList.fnArray.length; i++) { + if (operatorList.fnArray[i] === OPS.paintImageXObject) { + const imageName = operatorList.argsArray[i][0]; + + try { + const image = await new Promise((resolve, reject) => { + page.objs.get(imageName, (img: any) => { + if (img) resolve(img); + else reject(new Error(`Image ${imageName} not ready`)); + }); + }); + + if (image) { + const { width, height, data } = image; + + const scaledWidth = width * scaleFactor; + const scaledHeight = height * scaleFactor; + + const canvas = createCanvas(scaledWidth, scaledHeight); + const ctx = canvas.getContext("2d"); + + const imageData = ctx.createImageData( + scaledWidth, + scaledHeight, + ); + imageData.data.set(new Uint8ClampedArray(data)); + ctx.putImageData(imageData, 0, 0); + + // Save as PNG + const imageFilename = `image_p${pageNum}_${i}.png`; + const imagePath = path.join( + outputDir, + "images", + imageFilename, + ); + fs.writeFileSync(imagePath, canvas.toBuffer("image/png")); + + imageRefs.push(imageFilename); + } + } catch (err: any) { + console.warn( + `Skipping unresolved image ${imageName} on page ${pageNum}: ${err.message}`, + ); + } + } + } + + return imageRefs; +} + +export async function extractImagesFromPageV1( + operatorList: any, + page: any, + pageNum: number, + outputDir: string, +): Promise { + const imageRefs: string[] = []; + + for (let i = 0; i < operatorList.fnArray.length; i++) { + if (operatorList.fnArray[i] === OPS.paintImageXObject) { + const imageName = operatorList.argsArray[i][0]; + + try { + const image = await new Promise((resolve, reject) => { + page.objs.get(imageName, (img: any) => { + if (img) resolve(img); + else reject(new Error(`Image ${imageName} not ready`)); + }); + }); + + if (image) { + const { width, height, data } = image; + const canvas = createCanvas(width, height); + const ctx = canvas.getContext("2d"); + + const imageData = ctx.createImageData(width, height); + imageData.data.set(new Uint8ClampedArray(data)); + ctx.putImageData(imageData, 0, 0); + + const imageFilename = `image_p${pageNum}_${i}.png`; + const imagePath = path.join( + outputDir, + "images", + imageFilename, + ); + fs.writeFileSync(imagePath, canvas.toBuffer("image/png")); + + imageRefs.push(imageFilename); + } + } catch (err: any) { + console.warn( + `Skipping unresolved image ${imageName} on page ${pageNum}: ${err.message}`, + ); + } + } + } + + return imageRefs; +} diff --git a/ts/examples/docuProc/src/main.ts b/ts/examples/docuProc/src/main.ts index 4843e93a..926b5fc5 100644 --- a/ts/examples/docuProc/src/main.ts +++ b/ts/examples/docuProc/src/main.ts @@ -5,6 +5,7 @@ import dotenv from "dotenv"; import { downloadArxivPaper, fetchArxivPapers, + extractTextChunksFromPdf, printArxivPaperParsedData, } from "./docuProc.js"; @@ -15,7 +16,7 @@ console.log("Lets start processing your documents ..."); const papers: any[] | undefined = await fetchArxivPapers({ searchTerm: "transformer", searchField: "title", - maxResults: 3, + maxResults: 1, }); if (papers !== undefined && papers.length > 0) { console.log(`Found ${papers.length} papers`); @@ -25,7 +26,11 @@ if (papers !== undefined && papers.length > 0) { printArxivPaperParsedData(papers); papers.forEach(async (paper) => { try { - await downloadArxivPaper(paper); + const pdfFilePath: string | undefined = + await downloadArxivPaper(paper); + if (pdfFilePath !== undefined) { + await extractTextChunksFromPdf(pdfFilePath); + } } catch (error) { console.error("Error downloading paper:", error); } diff --git a/ts/pnpm-lock.yaml b/ts/pnpm-lock.yaml index c87c7157..db745abb 100644 --- a/ts/pnpm-lock.yaml +++ b/ts/pnpm-lock.yaml @@ -153,6 +153,9 @@ importers: aiclient: specifier: workspace:* version: link:../../packages/aiclient + canvas: + specifier: ^3.1.0 + version: 3.1.0 chalk: specifier: ^5.3.0 version: 5.3.0 @@ -174,9 +177,9 @@ importers: memory-providers: specifier: workspace:* version: link:../memoryProviders - pdf-parse: - specifier: 1.1.1 - version: 1.1.1 + pdfjs-dist: + specifier: ^4.10.38 + version: 4.10.38 typeagent: specifier: workspace:* version: link:../../packages/typeagent @@ -190,9 +193,6 @@ importers: '@types/node': specifier: ^18.18.7 version: 18.18.7 - '@types/pdf-parse': - specifier: ^1.1.4 - version: 1.1.4 copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -3640,6 +3640,70 @@ packages: resolution: {integrity: sha512-Z+CZ3QaosfFaTqvhQsIktyGrjFjSC0Fa4EMph4mqKnWhmyoGICsV/8QK+8HpXut6zV7zwfWwqDmEjtk1Qf6EgQ==} engines: {node: '>=14.0.0'} + '@napi-rs/canvas-android-arm64@0.1.66': + resolution: {integrity: sha512-77Yq9yaUYN90zCovYOpw7LhidJiswU9wLIWWBGF6iiEJyQdt6tkiXpGRZpOMJVO70afkcdc4T7532cxMIBhk0Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/canvas-darwin-arm64@0.1.66': + resolution: {integrity: sha512-cz3aJ06b8BZGtwRxKTiE0OVUlB17MH8j+BnE4A5+wD9aD1guCCqECsz+k7tpXdAdTAYKRIz2pq6ZuiJ76NyUbQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/canvas-darwin-x64@0.1.66': + resolution: {integrity: sha512-szIWqJgFm2OTyGzM+hSiJOaOtjI73VYRC2KN30zZTt7i1+0sgpm5exK5ltDBPOmCdnLt7SbUfpInLj8VvxYlKA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.66': + resolution: {integrity: sha512-h/TZJFc6JLvp8FwbA5mu+yXiblN0iKqshU7xzd6L+ks5uNYgjS7XWLkNiyPQkMaXQgVczOJfZy7r4NSPK3V8Hg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/canvas-linux-arm64-gnu@0.1.66': + resolution: {integrity: sha512-RGFUdBdi0Xmf+TfwZcB89Ap6hDYh4nzyJhXhNJIgve6ELrIPFhf7sDHvUHxjgW0YzczGoo+ophyCm03cJggu+w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-arm64-musl@0.1.66': + resolution: {integrity: sha512-2cFViDIZ0xQlAHyJmyym+rj3p04V16vgAiz64sCAfwOOiW6e19agv1HQWHUsro3G2lF3PaHGAnp0WRPXGqLOfg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.66': + resolution: {integrity: sha512-Vm5ZWS2RDPeBpnfx83eJpZfJT07xl0jqp8d83PklKqiDNa3BmDZZ/uuI40/ICgejGLymXXYo5N21b7oAxhRTSA==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/canvas-linux-x64-gnu@0.1.66': + resolution: {integrity: sha512-/ptGBhErNBCgWff3khtuEjhiiYWf70oWvBPRj8y5EMB0nLYpve7RxxFnavVvxN49kJ0MQHRIwgfyd47RSOOKPw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-linux-x64-musl@0.1.66': + resolution: {integrity: sha512-XunvXisTkIG+bpq6BcXmsUstoLX3RLS6N9Uz9Pg9RpWIMeM6ObR5shr3NgpGRJq93769I1hS4mJW0DX2Au3WBw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/canvas-win32-x64-msvc@0.1.66': + resolution: {integrity: sha512-3n34watNFqpwACDA+pt4jfQD6zR8PzfK86FBajdsgDVVZhSp6ohgbbJv+eUrXM08VUtjxTq7+U4sWspTu9+4Ug==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/canvas@0.1.66': + resolution: {integrity: sha512-NE/eQKLbUS+LCbMHRa5HnR7cc1Q4ibg/qfLUN4Ukl3CC0lq6LfHE0YbvFm/l4i5RyyS+aUjL+8IuZDD9EH3amg==} + engines: {node: '>= 10'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -4345,9 +4409,6 @@ packages: '@types/node@20.8.9': resolution: {integrity: sha512-UzykFsT3FhHb1h7yD4CA4YhBHq545JC0YnEz41xkipN88eKQtL6rSgocL5tbAP6Ola9Izm/Aw4Ora8He4x0BHg==} - '@types/pdf-parse@1.1.4': - resolution: {integrity: sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg==} - '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} @@ -5030,6 +5091,10 @@ packages: caniuse-lite@1.0.30001692: resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==} + canvas@3.1.0: + resolution: {integrity: sha512-tTj3CqqukVJ9NgSahykNwtGda7V33VLObwrHfzT0vqJXu7J4d4C/7kQQW3fOEGDfZZoILPut5H00gOjyttPGyg==} + engines: {node: ^18.12.0 || >= 20.9.0} + cardinal@2.1.1: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} hasBin: true @@ -5526,14 +5591,6 @@ packages: supports-color: optional: true - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -7492,12 +7549,12 @@ packages: node-addon-api@4.3.0: resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-cleanup@2.1.2: resolution: {integrity: sha512-qN8v/s2PAJwGUtr1/hYTpNKlD6Y9rc4p8KSmJXyGdYGZsDGKXrGThikLFP9OCHFeLeEpQzPwiAtdIvBLqm//Hw==} - node-ensure@0.0.0: - resolution: {integrity: sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw==} - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -7838,9 +7895,9 @@ packages: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} - pdf-parse@1.1.1: - resolution: {integrity: sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A==} - engines: {node: '>=6.8.1'} + pdfjs-dist@4.10.38: + resolution: {integrity: sha512-/Y3fcFrXEAsMjJXeL9J8+ZG9U01LbuWaYypvDW2ycW1jL269L3js3DVBjDJ0Up9Np1uqDXsDrRihHANhZOlwdQ==} + engines: {node: '>=20'} peberminta@0.9.0: resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} @@ -10968,6 +11025,50 @@ snapshots: '@mozilla/readability@0.5.0': {} + '@napi-rs/canvas-android-arm64@0.1.66': + optional: true + + '@napi-rs/canvas-darwin-arm64@0.1.66': + optional: true + + '@napi-rs/canvas-darwin-x64@0.1.66': + optional: true + + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.66': + optional: true + + '@napi-rs/canvas-linux-arm64-gnu@0.1.66': + optional: true + + '@napi-rs/canvas-linux-arm64-musl@0.1.66': + optional: true + + '@napi-rs/canvas-linux-riscv64-gnu@0.1.66': + optional: true + + '@napi-rs/canvas-linux-x64-gnu@0.1.66': + optional: true + + '@napi-rs/canvas-linux-x64-musl@0.1.66': + optional: true + + '@napi-rs/canvas-win32-x64-msvc@0.1.66': + optional: true + + '@napi-rs/canvas@0.1.66': + optionalDependencies: + '@napi-rs/canvas-android-arm64': 0.1.66 + '@napi-rs/canvas-darwin-arm64': 0.1.66 + '@napi-rs/canvas-darwin-x64': 0.1.66 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.66 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.66 + '@napi-rs/canvas-linux-arm64-musl': 0.1.66 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.66 + '@napi-rs/canvas-linux-x64-gnu': 0.1.66 + '@napi-rs/canvas-linux-x64-musl': 0.1.66 + '@napi-rs/canvas-win32-x64-msvc': 0.1.66 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -12023,8 +12124,6 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/pdf-parse@1.1.4': {} - '@types/plist@3.0.5': dependencies: '@types/node': 18.18.7 @@ -12920,6 +13019,11 @@ snapshots: caniuse-lite@1.0.30001692: {} + canvas@3.1.0: + dependencies: + node-addon-api: 7.1.1 + prebuild-install: 7.1.2 + cardinal@2.1.1: dependencies: ansicolors: 0.3.2 @@ -13558,10 +13662,6 @@ snapshots: dependencies: ms: 2.0.0 - debug@3.2.7: - dependencies: - ms: 2.1.3 - debug@4.4.0(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -15924,9 +16024,9 @@ snapshots: node-addon-api@4.3.0: {} - node-cleanup@2.1.2: {} + node-addon-api@7.1.1: {} - node-ensure@0.0.0: {} + node-cleanup@2.1.2: {} node-fetch@2.7.0: dependencies: @@ -16224,12 +16324,9 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - pdf-parse@1.1.1: - dependencies: - debug: 3.2.7 - node-ensure: 0.0.0 - transitivePeerDependencies: - - supports-color + pdfjs-dist@4.10.38: + optionalDependencies: + '@napi-rs/canvas': 0.1.66 peberminta@0.9.0: {}