Is import.meta.url supported in node engine?
I am trying to call pdfjs-dist in Javet program using node engine. But I ran into issues. I did some troubleshooting and what I got so far the issue was caused by import.meta.url having no value in pdfjs code. Is import.meta.url supported in node engine?
Below is the details of my programs:
In java test method: nodeRuntime.getExecutor(""" import { executeTask } from '../scripts/myextractpdfpages.js';
await executeTask();
""").setModule(true).executeVoid();
File: myextractpdfpages.js
import fs from "node:fs"; import { getDocument } from "pdfjs-dist/legacy/build/pdf.mjs";
// Some PDFs need external cmaps. const CMAP_URL = "./node_modules/pdfjs-dist/cmaps/"; const CMAP_PACKED = true;
// Loading file from file system into typed array. //const pdfPath = process.argv[2]; const pdfPath = '/home/heg/Documents/test/test.pdf'; const data = new Uint8Array(fs.readFileSync(pdfPath));
const executeTask = async () => {
// Load the PDF file.
const loadingTask = getDocument({
data,
cMapUrl: CMAP_URL,
cMapPacked: CMAP_PACKED,
});
try {
const pdfDocument = await loadingTask.promise;
console.log("# PDF document loaded.");
for (let pdfPage = 1; pdfPage <= pdfDocument.numPages; pdfPage++) {
// Get the first page.
const page = await pdfDocument.getPage(pdfPage);
// Extract the text content from the page
const textContent = await page.getTextContent();
// Concatenate and log the text items
//const extractedText = textContent.items.map((item) => item.str).join(" ");
const extractedText = textContent.items;
const outfilename = pdfPath + ".items.p" + pdfPage + ".json";
fs.writeFile(outfilename, JSON.stringify(extractedText, null, 2), (err) => {
if (err) {
console.error('Error writing file: ' + outfilename, err);
return;
}
console.log('File written successfully! ' + outfilename);
});
};
// console.log(extractedText);
} catch (reason) {
console.log(reason);
}
}
export { executeTask }
Program log
ESM pdfjs-dist/legacy/build/pdf.mjs is resolved successfully
Warning: Cannot access the require function: "TypeError [ERR_INVALID_ARG_VALUE]: The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received undefined".
Warning: Cannot access the require function: "TypeError [ERR_INVALID_ARG_VALUE]: The argument 'filename' must be a file UWarning: Cannot access the require function: "TypeError [ERR_INVALID_ARG_VALUE]: The argument 'filename' must be a file URL object, file URL string, or absolute path string. Received undefined".
Warning: Cannot polyfill DOMMatrix, rendering may be broken.
Warning: Cannot polyfill ImageData, rendering may be broken.
Warning: Cannot polyfill Path2D, rendering may be broken.
Nov 16, 2025 9:40:11 PM com.caoccao.javet.utils.JavetDefaultLogger warn
WARNING: 3 V8 object(s) not recycled, 0 weak, 2 module(s).
C:\home\heg\Documents\dev\repo\poc\javetnode-poc\node_modules\pdfjs-dist\legacy\build\pdf.mjs:16394
const SCALE_MATRIX = new DOMMatrix();
^
ReferenceError: DOMMatrix is not defined at C:\home\heg\Documents\dev\repo\poc\javetnode-poc\node_modules\pdfjs-dist\legacy\build\pdf.mjs:16394:22
Node.js v24.10.0
pdf.mjs file
pdf.mjs tries to load canvas which has DOMMatrix, ImageData and Path2D.
After adding some debug statement to pdf.mjs, it shows that import.meta.url is undefined.
Can you please check if I missed anything? Thanks!
In Javet, you can open many Node.js instances. In return, you lose some features only available in standalone Node.js.
E.g. Some meta info is not available. This is obvious because there is no Node.js command line that takes a script. You always let Node.js evaluate a string.
So, in your case, you have to polyfill those missing info.
I replaced import.meta.url with actual file url: const require = process.getBuiltinModule("module").createRequire('file:///C:/home/heg/Documents/dev/repo/poc/javetnode-poc/node_modules/pdfjs-dist/legacy/build/pdf.mjs' /import.meta.url/);
Now I get the following error messages:
Node-API symbol napi_create_object has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_function has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_function has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_function has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_function has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_function has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_function has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_function has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_object has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_object has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_object has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_object has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_object has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_object has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_int32 has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_function has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_function has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_define_class has not been loaded
Node-API symbol napi_create_reference has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_define_class has not been loaded
Node-API symbol napi_create_reference has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_define_class has not been loaded
Node-API symbol napi_create_reference has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_define_class has not been loaded
Node-API symbol napi_create_reference has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_define_class has not been loaded
Node-API symbol napi_create_reference has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_define_class has not been loaded
Node-API symbol napi_create_reference has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_define_class has not been loaded
Node-API symbol napi_create_reference has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_define_class has not been loaded
Node-API symbol napi_create_reference has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_define_class has not been loaded
Node-API symbol napi_create_reference has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_define_class has not been loaded
Node-API symbol napi_create_reference has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_define_class has not been loaded
Node-API symbol napi_create_reference has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_define_class has not been loaded
Node-API symbol napi_create_reference has not been loaded
Node-API symbol napi_set_named_property has not been loaded
Node-API symbol napi_create_function has not been loaded
Node-API symbol napi_create_string_utf8 has not been loaded
Node-API symbol napi_create_threadsafe_function has not been loaded
Node-API symbol napi_unref_threadsafe_function has not been loaded
Warning: Cannot load "@napi-rs/canvas" package: "TypeError: Cannot use 'in' operator to search for 'families' in undefined".
Warning: Cannot polyfill DOMMatrix, rendering may be broken.
Warning: Cannot polyfill ImageData, rendering may be broken.
Warning: Cannot polyfill Path2D, rendering may be broken.
Nov 17, 2025 9:12:46 PM com.caoccao.javet.utils.JavetDefaultLogger warn
WARNING: 3 V8 object(s) not recycled, 0 weak, 2 module(s).
C:\home\heg\Documents\dev\repo\poc\javetnode-poc\node_modules\pdfjs-dist\legacy\build\pdf.mjs:16397
const SCALE_MATRIX = new DOMMatrix();
^
ReferenceError: DOMMatrix is not defined
Can you provide some suggestions?
It seems you want to load a native library. That's very hard. Please read the doc carefully.
I do not want to load a native library. I am trying to use pdfjs-dist in Javet node engine. The library is node_modules/pdfjs-dist/legacy/build/pdf.mjs. Earlier it failed because DOMMatrix not define.
pdf.mjs tries to load canvas which calls createRequire(import.meta.url). However import.meta.url is not available in Javet:
if (isNodeJS) {
let canvas;
try {
const require = process.getBuiltinModule("module").createRequire(import.meta.url);
try {
canvas = require("@napi-rs/canvas");
} catch (ex) {
warn(Cannot load "@napi-rs/canvas" package: "${ex}".);
}
} catch (ex) {
warn(Cannot access the \require` function: "${ex}".); } if (!globalThis.DOMMatrix) { if (canvas?.DOMMatrix) { globalThis.DOMMatrix = canvas.DOMMatrix; } else { warn("Cannot polyfill DOMMatrix, rendering may be broken."); } } if (!globalThis.ImageData) { if (canvas?.ImageData) { globalThis.ImageData = canvas.ImageData; } else { warn("Cannot polyfill ImageData`, rendering may be broken.");
}
}
After I manually replaced import.meta.url with file url, Javet logs the "Node-API symbol napi_create_object has not been loaded" messages.
You mentioned to ployfill the missing information. Can you provide more details?
@napi-rs/canvas is a native lib.
Thanks.