Я работаю над инструментом PDF, который конвертирует страницы в изображения base64. Однако при обработке большого файла (более тысячи страниц) я получаю эту ошибку:
RangeError: Value undefined out of range for undefined options property undefined
at Map.set (<anonymous>)
at AsyncHook.init (domain.js:68:15)
at PromiseWrap.emitInitNative (internal/async_hooks.js:142:43)
at Function.all (<anonymous>)
at next (/Users/grumbaut/Documents/repos/pub/packages/build/node_modules/pdfjs-dist/build/pdf.worker.js:31649:19)
at promiseBody (/Users/grumbaut/Documents/repos/pub/packages/build/node_modules/pdfjs-dist/build/pdf.worker.js:31937:15)
at /Users/grumbaut/Documents/repos/pub/packages/build/node_modules/pdfjs-dist/build/pdf.worker.js:31651:15
at processTicksAndRejections (internal/process/task_queues.js:97:5)
Я использую PDF. js для разделения PDF и обработки страницы. Метод render
, который я вызываю для каждой страницы, возвращает обещание. Интересно, является ли длина числа обещаний причиной вышеуказанной ошибки.
Я использую эту задачу как часть рабочего процесса Gulp . Первоначально у меня было разделение PDF на отдельные страницы и рендеринг как часть одной задачи, но я разделил его на две части, полагая, что наличие двух отдельных задач в серии позволит улучшить сборку мусора. Вот мой соответствующий код:
// Split the PDF
const { numPages } = pdf;
const convert = async (num) => pdf
.getPage(num)
.then((page) => {
const pageObject = {
contents: page,
pageNum: `${vinylPath}`,
origin: filename,
};
this.pdfPages.push(pageObject);
vinylPath += 1;
});
let promise = Promise.resolve();
for (let i = 1; i <= numPages; i += 1) {
promise = promise.then(() => convert(i));
}
return promise.then(() => {
cb();
});
// call the render method for each page
const renderPagesPromise = (pageObj) => new Promise((resolve, reject) => {
const { contents: page, origin, pageNum } = pageObj;
if (this.args.debug) {
this.log(
taskName,
`Converting page ${pageNum} of ${origin} to base64.`,
);
}
const viewport = page.getViewport({ scale: 1.5 });
const canvasFactory = new CanvasFactory();
const canvas = canvasFactory.create(viewport.width, viewport.height);
const renderContext = {
canvasContext: canvas.context,
viewport,
canvasFactory,
};
page
.render(renderContext)
.promise
.then(() => {
const contents = {
contents: canvas.canvas.toBuffer().toString('base64'),
};
streamLog(taskName, `Converted page ${pageNum} of ${origin} to base64.`);
base64.push({ ...pageObj, ...contents });
resolve();
});
});
const task = () => {
const doNext = () => {
if (!pdfPages.length) return;
const page = pdfPages.shift();
renderPagesPromise(page).then(doNext);
};
doNext();
};
Я немного озадачен тем, откуда возникла эта ошибка. Я чувствую, как будто где-то здесь есть утечка памяти, возможно, так как она определенно занимает много оперативной памяти, и мне нужно увеличить размер узла для ее запуска.