Paper.js服务器端无法使用接收的图层

为了减less客户端的负载,我们正在尝试在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线相同的错误。 (见两行注释“吹起来”。)

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

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

但无济于事。

我怎样才能修改这个方法来成功地处理服务器端的图层?

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

您不能直接操作纸张的数据结构。 如果你想添加一个图层到一个项目中,请使用下面的内容(注意,这没有logging,并会随着下一个版本的文件而改变,但我不认为你需要这样做):

(paperscript)

 project.addChild(layer); 

(JavaScript的)

 paper.project.addChild(layer); 

目前还不清楚在服务器端如何创buildpdf.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小组讨论