2017-02-26 42 views
0

我使用jsreportphantom pdf recipeASP.NET Core中呈現視圖爲pdf。該項目作爲App ServiceAzure中運行。這在我的本地機器上正常工作,但是當我發佈到Azure時,出現以下錯誤消息。ASP.NET Core上的Azure上的Phantom pdf

Exception: Call to Node module failed with error: ReferenceError: e is not defined at module.exports (D:\home\site\wwwroot\serviceCallDetailsPdf.js:18:26)

這裏是我的js文件,是在我的項目(同一目錄級別wwwroot文件,視圖,控制器等)的根。

module.exports = function (callback, html, htmlFooter) { 
    var jsreport = require('jsreport-core')(); 

    jsreport.init().then(function() { 
     return jsreport.render({ 
      template: { 
       content: html, 
       engine: 'jsrender', 
       recipe: 'phantom-pdf', 
       phantom: { 
        orientation: "landscape", 
        allowLocalFilesAccess: true, 
        footer: htmlFooter 
       } 
      } 
     }).then(function (resp) { 
      callback(/* error */ null, resp.content.toString()); 
     }); 
    }).catch(function (e) { 
     callback(/* error */ e, null); 
    }); 

    callback(/* error */ e, null); 
}; 

注意:最後一次回調通常不會在那裏。如果我刪除它,我得到的錯誤會在60000毫秒後超時Node.js模塊,當然它需要60秒才能顯示。

我不得不更新我的project.json文件,包括publishOptions*.jsnode_modules否則我會得到一個錯誤說Node.js不能罰我打電話的文件。我知道這不是正確的方法(應該使用Gulp來複制我需要的東西,但我只是想先讓它工作)。

我已將services.AddNodeServices();增加到ConfigureServices以及"Microsoft.AspNetCore.NodeServices": "1.1.0"增加到project.json

這裏是生成自動,我package.json文件:

{ 
    "name": "projectname", 
    "version": "1.0.0", 
    "description": "", 
    "main": "serviceCallDetailsPdf.js", 
    "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1" 
    }, 
    "author": "", 
    "license": "ISC", 
    "dependencies": { 
    "jsreport-core":"1.1.1", 
    "jsreport-jsrender": "1.0.1", 
    "jsreport-phantom-pdf": "1.3.1" 
    } 
} 

最後,這裏是我的Action

[HttpGet] 
public async Task<IActionResult> ServiceCallDetailsToPdf(int id) 
{ 
    var call = _repository.PullCallDetails(id, User.Identity.RegionId(), User.Identity.TimeZoneOffsetId()); 

    // Render view as string 
    var html = await _viewRenderService.RenderToStringAsync("Render/ServiceCallDetailsPdf", call); 
    html = html.Replace("<style></style>", @"<style>@font-face{font-family:'Open Sans';src:url({#asset OpenSans-Regular.ttf @encoding=dataURI});format('ttf');}*{font-family:'Open Sans';}h2{font-weight:300;line-height:1.1;}</style>"); 

    var htmlFooter = "<style>*{font-family:'Open Sans';text-align:center;}</style>" + "Page {#pageNum} of {#numPages}"; 

    // Invoke node job to create the pdf 
    var result = await _nodeServices.InvokeAsync<byte[]>("./serviceCallDetailsPdf", html, htmlFooter); 

    // Content disposition 'inline' will return the pdf to the browser and not download it 
    var contentDisposition = new ContentDispositionHeaderValue("inline"); 
    // Add file name to content disposition so if it is downloaded, it uses the correct file name 
    contentDisposition.SetHttpFileName("dispatch" + id.ToString() + ".pdf"); 
    Response.Headers[HeaderNames.ContentDisposition] = contentDisposition.ToString(); 

    return File(result, "application/pdf"); 
} 

是否有可能調試javascript文件被調用?我花了幾天和幾個小時試圖找出爲什麼這不起作用。任何幫助將不勝感激。


更新

我相信我發現這些鏈接我的答案:

https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox

PhantomJS as web job in Azure

這基本上意味着你不能在使用幻象PDF配方Azure應用服務。其他人可以確認嗎?如果是這種情況,是否有人知道可以在Azure應用服務中工作的html to pdf渲染器?

+0

你已經通過鏈接到的其他問題找到了答案(基本上這是該問題的重複)。您不能在Web應用程序中使用ActiveX/GDI /等。 –

回答

1

phantomjs和其他pdf渲染在默認Windows Server上運行的Azure App服務中不起作用。但是,您現在可以使用在jsreport很好地運行的Linux上運行的Azure App服務。

你只需要創建新的應用服務時,切換到Web應用程序在Linux上,並使用節點基於容器。然後,您可以使用Docker集線器將帶有jsreport的圖像下載到Web應用程序中。最簡單的是使用官方的jsreport圖像,但也很容易使用你自己的。

鏈接
Tutorial how run jsreport on Azure Web App on linux
jsreport official docker image

我知道我沒有回答如何真正在同一個應用程序的asp.net核心運行它。我目前不知道該怎麼做,但我建議你在不同的應用程序中運行asp.net應用程序和jsreport。您可以通過REST輕鬆調用jsreport渲染。這也可以改善您的架構設計。

相關問題