2016-01-12 73 views
1

爲了減少客戶端負載,我們正在嘗試在Node Express服務器上展開Paper.js層。我們有很多圖層來平整大量的圖像數據。而不是重寫我們的數據結構,我們想要結束包含柵格化(展平)圖層的新對象。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); 
}); 

.layer是已在客戶方提出本地Paper.js層。

我們打這條路時,收到此錯誤:

TypeError: pdf.pages[j].layer.activate is not a function

思考,也許我們並不需要擔心在服務器端激活層,我評論說出來,但得到了同樣的錯誤爲.rasterize線。 (看到兩行註釋「Blows up」。)

我是否需要以某種方式將我們從客戶端接收的圖層導入到項目中?我試圖做到這一點與行:

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

,但無濟於事。

如何修改此方法以成功處理服務器上的圖層?

+0

爲什麼不嘗試使用'forEach'而不是重複? – brandonscript

+0

@remus可能會使代碼更清潔,但您認爲它會解決手頭的問題嗎?如果是這樣如何? –

+0

我懷疑使用迭代器var會導致一些容易被忽略的混淆代碼。通過清理並使用forEach,您至少可以簡化一些事情,以便更好地排除故障。 – brandonscript

回答

1

的問題是,你是直接用線paper.project.layers.push(pdf.pages[j].layer);

不允許你直接操作文件的數據結構添加層到項目中。如果你想添加一個圖層到一個項目中,請使用以下內容(請注意,這沒有記錄,將隨着下一版本紙張而改變,但我認爲你不需要這樣做):

( paperscript)

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 group discussion

+0

使用Paper自己的exportJSON()方法將圖層作爲序列化的JSON對象進行傳輸。製作一個新的paper.Layer()並調用newLayer.importJSON(pdf.pages [i] .layer)似乎也不起作用。 –

+0

你會想要做project.activeLayer.importJSON(serializedLayer)其中serializedLayer是clientLayer.exportJSON()的輸出,activeLayer是空的。請參閱https://groups.google.com/forum/#!searchin/paperjs/importJSON/paperjs/Mw5inE0Tyko/nMRWHwi2kKsJ – bmacnaughton

+0

因此,每個pdf.pages [i] .layer'是一個單獨生成的圖層的JSON表示?像'foreach(paper.project.layers中的圖層){pdf.pages [i] .layer = layer.exportJSON()}'(赦免僞代碼)。 – bmacnaughton

相關問題