我正在使用jsreport
和 将phantom pdf recipe
视图呈现为 pdf 格式ASP.NET Core
。该项目Azure
作为App Service
. 这在我的本地机器上运行良好,但是当我发布到 时Azure
,我收到以下错误消息。
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
文件以包含,*.js
否则我会收到一条错误消息,说我正在调用的文件无法正常工作。我知道这不是正确的方法(应该使用 Gulp 只复制我需要的东西,但我只想让它先工作)。node_modules
publishOptions
Node.js
我已经添加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
这基本上意味着您不能在 Azure 应用服务中使用幻影 pdf 配方。其他人可以确认吗?如果是这种情况,是否有人知道将在 Azure 应用服务中工作的 html 到 pdf 渲染器?