1

我正在使用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_modulespublishOptionsNode.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

PhantomJS 作为 Azure 中的 Web 作业

这基本上意味着您不能在 Azure 应用服务中使用幻影 pdf 配方。其他人可以确认吗?如果是这种情况,是否有人知道将在 Azure 应用服务中工作的 html 到 pdf 渲染器?

4

1 回答 1

1

phantomjs 和其他 pdf 渲染在默认 Windows Server 上运行的 Azure App 服务中不起作用。但是,您现在可以使用在 jsreport 运行良好的 linux 上运行的 Azure App 服务。

在创建新的应用服务并使用基于节点的容器时,您只需要切换到 Linux 上的 Web 应用即可。然后,您可以使用 docker hub 将带有 jsreport 的图像直接下载到 Web 应用程序中。最简单的是使用官方的 jsreport 图像,但也很容易使用你自己的。

链接
教程如何在 Linux 上的 Azure Web App 上运行 jsreport
jsreport 官方 docker 镜像

我知道我没有回答如何在与 asp.net 核心相同的应用程序中实际运行它。我目前不知道该怎么做,但我建议您在单独的应用程序中运行 asp.net 应用程序和 jsreport。您可以通过 REST 轻松调用 jsreport 渲染。这也可以改善您的架构设计。

于 2017-02-27T18:50:46.883 回答