Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Paper.js服务器端可以';无法处理接收到的层_Javascript_Node.js_Canvas_Paperjs_Node Canvas - Fatal编程技术网

Javascript Paper.js服务器端可以';无法处理接收到的层

Javascript Paper.js服务器端可以';无法处理接收到的层,javascript,node.js,canvas,paperjs,node-canvas,Javascript,Node.js,Canvas,Paperjs,Node Canvas,为了减少客户端负载,我们正在尝试在Node Express服务器上展平Paper.js层。我们有很多层需要用大量的图像数据进行展平。我们不希望覆盖数据结构,而是希望最终得到包含光栅化(展平)层的新对象 我们有一条这样的快速路线: app.post('/flatten', function (request, response) { var pdfs = JSON.parse(request.body.pdfs); // Attempt to set up canvas on t

为了减少客户端负载,我们正在尝试在Node Express服务器上展平Paper.js层。我们有很多层需要用大量的图像数据进行展平。我们不希望覆盖数据结构,而是希望最终得到包含光栅化(展平)层的新对象

我们有一条这样的快速路线:

app.post('/flatten', function (request, response) {
    var pdfs = JSON.parse(request.body.pdfs);

    // Attempt to set up canvas on the server side to work with
    var canvas = new paper.Canvas(1000, 1000);
    paper.setup(canvas);
    paper.view.draw();

    for (var i = 0; i < pdfs.length; i++) {
        var pdf = pdfs[i];
        if (pdf !== null) {
            for (var j = 0; j < pdf.pages.length; j++) {
                if (pdf.pages[j].layer !== undefined) {
                    paper.project.layers.push(pdf.pages[j].layer); // Attempt to add to current project; necessary?
                    pdf.pages[j].layer.activate(); // Blows up
                    pdf.pages[j].layer.visible = true;
                    var layerAsRaster = pdf.pages[j].layer.rasterize(); // Blows up
                    layerAsRaster.visible = false;
                    var dataString = layerAsRaster.toDataURL();
                    pdfs[i].pages[j].pageImageData = dataString.split(',')[1];
                    pdf.pages[j].layer.visible = false;
                }
            }
        }
    }

    response.send(pdfs);
});
但是没有用


如何修改此方法以成功处理服务器端的层?

问题是,您正在使用paper.project.layers.push(pdf.pages[j].layer)行将层直接添加到项目中

不允许直接操作纸张的数据结构。如果您想在项目中添加图层,请使用以下方法(请注意,这没有文档记录,并且会随着下一版本的纸张而更改,但我认为您不需要这样做):

(纸稿)

(javascript)

目前尚不清楚
pdf.pages[i].layer
是如何在服务器端创建的,它是通过JSON导入的(在这种情况下,它可能已经插入到项目中),还是从另一个项目中删除的,因此可能存在其他复杂问题

我认为还有一个问题。似乎没有将
pdf.pages[i].layer
转换为服务器端层。所以关键问题是它是如何从客户端传输到服务器的

以下是对整个过程的尝试:

(客户端)

(服务器端)

layer
应该已经插入到项目中,并且应该包含
jsonLayer
中的所有项目,这是客户端上的层

以下是有关importJSON和exportJSON如何相互映射的讨论的链接:


为什么不尝试使用
forEach
进行迭代呢?@remus这可能会使代码更干净,但您认为它会解决眼前的问题吗?如果是这样的话怎么办?我怀疑迭代器变量的使用导致了一些被忽略的混乱代码。通过清理和使用forEach,您至少可以简化工作,以便更好地进行故障排除。您从客户端发送什么类型的数据?我猜您希望使用或导出图形。然后,您可以在服务器上导入它们。该层作为序列化JSON对象传输,使用Paper自己的exportJSON()方法。制作一篇新的论文.Layer()并调用newLayer.importJSON(pdf.pages[i].Layer])似乎也不起作用。您需要执行project.activeLayer.importJSON(serializedLayer),其中serializedLayer是clientLayer.exportJSON()的输出,而activeLayer是空的。因此,每个
pdf.pages[i].layer
是一个单独生成的层的JSON表示吗?类似于
foreach(paper.project.layers中的层){pdf.pages[i].layer=layer.exportJSON()}
(请原谅伪代码)。
paper.project.layers.push(pdf.pages[j].layer);
project.addChild(layer);
paper.project.addChild(layer);
jsonLayer = paper.project.activeLayer.exportJSON();

// send jsonLayer to server using some method
// get jsonLayer from client

layer = new paper.Layer();
layer.importJSON(jsonLayer);