1

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

所以我们有一个看起来像这样的 Express 路由:

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);
});

.layer是在客户端制作的原生 Paper.js 层。

当我们到达这条路线时,我们会收到这个错误:

TypeError: pdf.pages[j].layer.activate 不是函数

考虑到也许我们不需要担心在服务器端激活层,我将其注释掉,但该.rasterize行得到了相同的错误。(参见注释为“Blows up”的两行。)

我是否需要以某种方式将从客户端收到的图层导入项目中?我试图用这条线做到这一点:

paper.project.layers.push(pdf.pages[j].layer);

但无济于事。

如何修改此方法以成功使用服务器端的图层?

4

1 回答 1

1

问题是您直接将图层添加到项目中paper.project.layers.push(pdf.pages[j].layer);

您不能直接操作纸张的数据结构。如果您想向项目添加一个层,请使用以下内容(请注意,这没有记录在案,并且会随着下一个版本的论文而改变,但我认为您不需要这样做):

(纸质稿)

project.addChild(layer);

(javascript)

paper.project.addChild(layer);

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

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

这是整个过程的刺:

(客户端)

jsonLayer = paper.project.activeLayer.exportJSON();

// send jsonLayer to server using some method

(服务器端)

// get jsonLayer from client

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

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

这是关于 importJSON 和 exportJSON 如何相互映射的讨论的链接:

paperjs小组讨论

于 2016-01-13T17:01:25.527 回答