Javet icon indicating copy to clipboard operation
Javet copied to clipboard

Is import.meta.url supported in node engine?

Open codingheg opened this issue 1 month ago • 6 comments

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 Image

pdf.mjs tries to load canvas which has DOMMatrix, ImageData and Path2D.

Image

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!

codingheg avatar Nov 17 '25 03:11 codingheg

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.

caoccao avatar Nov 17 '25 07:11 caoccao

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?

codingheg avatar Nov 18 '25 02:11 codingheg

It seems you want to load a native library. That's very hard. Please read the doc carefully.

caoccao avatar Nov 18 '25 18:11 caoccao

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?

codingheg avatar Nov 19 '25 01:11 codingheg

@napi-rs/canvas is a native lib.

caoccao avatar Nov 19 '25 07:11 caoccao

Thanks.

codingheg avatar Nov 21 '25 12:11 codingheg