Я пытаюсь извлечь данные из файлов PDF и вернуть их. вот код на стороне сервера в astro
import * as pdfjsLib from "pdfjs-dist";
pdfjsLib.GlobalWorkerOptions.workerSrc = "../../node_modules/pdfjs-dist/build/pdf.worker.mjs";
export const contentExtractor = async (arrayBufferPDF: ArrayBuffer): Promise<string> => {
const pdf = (pdfjsLib).getDocument(arrayBufferPDF);
return pdf.promise.then(async (pdf) => {
let totalContent = ""
const maxPages = pdf._pdfInfo.numPages;
for (let pageNumber = 1; pageNumber <= maxPages; pageNumber++) {
const page = await pdf.getPage(pageNumber);
const pageContent = await page.getTextContent();
const content = pageContent.items.map((s: any) => s.str).join(" ")
totalContent = totalContent + content
}
return totalContent
})
}
и ошибка
12:44:40 [ERROR] Promise.withResolvers is not a function
Stack trace:
at /Users/some-user/Documents/Projects/Github/pdf-extractor/app/node_modules/pdfjs-dist/build/pdf.mjs:3026:32
[...] See full stack trace in the browser, or rerun with --verbose.
Я не понимаю, в чем проблема. Может ли кто-нибудь помочь мне с этим?
Используемая вами сборка PDF.js не поддерживает работу в Node.js (т. е. только в браузере). Ошибка возникает из-за вызова Promise.withResolvers, который не поддерживается Node.js.
кажется , рекомендуемый способ запуска его под Node.js — использовать устаревшую сборку (с использованием pdfjs-dist/legacy/build/pdf.js
).
Проблема связана с вашей версией Node.js. Метод Promise.withResolvers
доступен начиная с Node.js v22. Чтобы решить проблему, выполните следующие действия.
Обновите Node.js:
Если вы еще этого не сделали, обновите Node.js до последней версии. Для этой цели вы можете использовать Node Version Manager (nvm):
nvm install node
nvm use node
Либо загрузите и установите последнюю версию с сайта Node.js.
Проверьте версию Node.js:
Перезагрузите терминал и выполните следующую команду, чтобы подтвердить, что вы используете обновленную версию Node.js:
node -v
Это должно вывести новую версию (например, v22.x.x).
Перезапустите сервер разработки:
Если ваш сервер разработки работал, когда вы обновляли Node.js, перезапустите его, чтобы убедиться, что он использует новую версию:
npm run dev
Обеспечить совместимость проекта:
Убедитесь, что ваш проект и его зависимости совместимы с новой версией Node.js. Возможно, вам придется обновить пакеты:
npm install
Вот еще один ответ https://github.com/wojtekmaj/react-pdf/issues/1811#issuecomment-2157866061
// @ts-expect-error This does not exist outside of polyfill which this is doing
if (typeof Promise.withResolvers === 'undefined') {
if (window)
// @ts-expect-error This does not exist outside of polyfill which this is doing
window.Promise.withResolvers = function () {
let resolve, reject;
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
return { promise, resolve, reject };
};
}
// there is your `/legacy/build/pdf.worker.min.mjs` url
pdfjs.GlobalWorkerOptions.workerSrc = new URL(
'pdfjs-dist/legacy/build/pdf.worker.min.mjs',
import.meta.url
).toString();
// or you can use this
// pdfjs.GlobalWorkerOptions.workerSrc = "https://unpkg.com/[email protected]/legacy/build/pdf.worker.min.mjs"
Похоже, что NodeJS теперь поддерживает
promise.withResolvers
с выпуском версии v22.0 - Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…