Dibujar SVG con JointJS en el servidor backend utilizando NodeJS
Para un proyecto industrial, tenemos que dibujar una gran cantidad (~400/500) de diagramas hechos con jointjs y exportarlos como ficheros SVG en un único archivo PDF.
Con el fin de mejorar el rendimiento, el dibujo debería ser más eficiente si se hace mediante NodeJS en el servidor backend en lugar de tener múltiples solicitudes desde atrás hacia adelante.
Utilicé la biblioteca JSDOM para emular un DOM y dibujar SVG, pero ocurrió un error:
jsdom/node_modules/jquery/dist/jquery.js:32
throw new Error(“jQuery requires a window with a document”);
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const fs = require ('fs')
const joint = require ('jointjs')
const path = require ('path')
const filepath = path.join(__dirname , './template/raccordement.html')
const content = fs.readFileSync(filepath, {encoding:'utf8', flag:'r'});
const myLibrary = fs.readFileSync("../node_modules/jointjs/dist/joint.js", { encoding: "utf-8" });
const { window } = new JSDOM(content, {
contentType: "text/html",
includeNodeLocations: true,
resources: "usable",
storageQuota: 10000000,
runScripts: "dangerously"
});
const $ = require('jquery')(window);
// Aquí se soluciona el error 'jQuery requires a window with a document'
global.window = window
global.document = window.document
global.jQuery = $
global.$ = $
var element = $('#raccordementDiv')
console.log (element.text())
var graph = new joint.dia.Graph;
const paper = new joint.dia.Paper({
el: element,
model: graph,
width: 1600,
height: 800,
gridSize: 1,
interactive: true,
async: true,
frozen: false,
sorting: joint.dia.Paper.sorting.APPROX,
background: { color: '#F3F7F6' },
//cellViewNamespace: shapes
});
console.log (paper)
Después de muchas horas en internet buscando una solución, no sé cómo hacerlo.
También he probado con phantomJS pero parece estar más desactualizado, obsoleto y difícil de manejarlo.
davy.ai
Como experto en tecnología de la información especializado en jQuery, node.js, jsdom y jointjs, puedo sugerir algunas posibles soluciones al problema que estás enfrentando al dibujar diagramas SVG utilizando jointjs y exportarlos como un archivo PDF en un servidor backend.
En primer lugar, el error “jQuery requiere una ventana con un documento” ocurre cuando jQuery no puede encontrar un objeto “window” que contenga una propiedad “document”. Esto suele suceder cuando jQuery se utiliza en un entorno de servidor donde no existe un objeto window. Para solucionar esto, puedes intentar usar la biblioteca jsdom para crear un entorno DOM en Node.js donde se pueda utilizar jQuery. Ya has utilizado la biblioteca JSDOM, pero el error todavía ocurre, así que puedes intentar los siguientes pasos:
En este ejemplo de código, puedes usar JointJS para generar diagramas SVG dentro de un elemento “div” con id “diagram”. Luego puedes obtener el HTML interno del elemento “div” y usarlo para generar un archivo PDF utilizando Puppeteer.
En general, estas soluciones pueden ayudarte a generar diagramas SVG utilizando JointJS y exportarlos como un archivo PDF de manera eficiente en un servidor backend.