我使用jsreport
和phantom pdf recipe
在ASP.NET Core
中呈現視圖爲pdf。該項目作爲App Service
在Azure
中運行。這在我的本地機器上正常工作,但是當我發佈到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
*.js
和node_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
這基本上意味着你不能在使用幻象PDF配方Azure應用服務。其他人可以確認嗎?如果是這種情況,是否有人知道可以在Azure應用服務中工作的html to pdf渲染器?
你已經通過鏈接到的其他問題找到了答案(基本上這是該問題的重複)。您不能在Web應用程序中使用ActiveX/GDI /等。 –