【问题标题】:NReco.PdfGenerator 1.1.7 does not work in hosted environmentNReco.PdfGenerator 1.1.7 在托管环境中不起作用
【发布时间】:2015-08-26 18:52:26
【问题描述】:

我花费了一些时间来创建一组由 PdfCreator 生成的报告。我喜欢在 HTML 中定义内容,然后将其生成为可在 WPF 客户端和 MVC 站点中使用的 PDF 文件的想法。

它在本地运行良好。但是当将网站发布到托管环境时,PDF 生成突然崩溃了……为什么!!?

网页上的错误输出帮助不大:

(exit code: -1073741701)

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: NReco.PdfGenerator.WkHtmlToPdfException: (exit code: -1073741701)

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[WkHtmlToPdfException:  (exit code: -1073741701)]
   NReco.PdfGenerator.HtmlToPdfConverter.CheckExitCode(Int32 exitCode, String lastErrLine, String outputFilePath) +123
   NReco.PdfGenerator.HtmlToPdfConverter.GeneratePdfInternal(String[] htmlFiles, Byte[] inputBytes, String coverHtml, String outputPdfFilePath, Stream outputStream) +2481

[Exception: Cannot generate PDF:  (exit code: -1073741701)]
   NReco.PdfGenerator.HtmlToPdfConverter.GeneratePdfInternal(String[] htmlFiles, Byte[] inputBytes, String coverHtml, String outputPdfFilePath, Stream outputStream) +2819
   NReco.PdfGenerator.HtmlToPdfConverter.GeneratePdf(String htmlContent, String coverHtml, Stream output) +87
   NReco.PdfGenerator.HtmlToPdfConverter.GeneratePdf(String htmlContent, String coverHtml) +42
   SongService.Report.DomainServices.ReportCompiler.GeneratePdf(String templateName, T model) +704
   SongServiceWeb.Controllers.PresentationController.GetReport(Guid presentationId) +261
   lambda_method(Closure , ControllerBase , Object[] ) +122
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +156
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
   System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +22
   System.Web.Mvc.Async.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32
   System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +50
   System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +225
   System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +26
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +36
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +54
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +39
   System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +28
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +54
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +29
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +36
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +54
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +31
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9651796
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

这个问题有一个有趣的建议:NReco.PdfGenerator in ASP.NET stoped working on server

在 NReco.PdfGenerator 的版本历史中,它说 1.1.6 有一个依赖于 C++ 包的新部署。

来自 Nuget 的引用: v.1.1.6 更改:WkHtmlToPdf 工具升级到版本 0.12.2.1(2015 年 1 月 19 日发布)。注意:此版本的 wkhtmltopdf 需要用于 VS 2013 (x86) 的 Visual C++ Redistributable 包。 WkHtmlToPdf 工具升级到版本 0.12.2.1(2015 年 1 月 19 日发布)。注意:此版本的 wkhtmltopdf 需要用于 VS 2013 (x86) 的 Visual C++ Redistributable 包。

即使我的错误不同,我也尝试添加丢失的文件。我包括了 msvcp120.dll 和 msvcr120.dll 但没有区别。只是为了确保我也添加了 vccorlib120.dll 和 wkhtmltopdf.exe。还是没有区别。

我的下一个想法是我需要指出一个具有写权限的临时目录,可以在内部工作期间使用。但我在文档中没有找到任何参考。

编辑:

我在 HtmlToPdfConverter 上找到了一个名为 TempFilesPath 的属性。那看起来真的很有希望!于是我迅速创建了一个目录并设置了所需的写权限。

converter.TempFilesPath = HttpContext.Server.MapPath(@"~/_temp");

我已验证此目录可从主机上的代码读取和写入。但是来自 PdfCreator 的错误仍然是一样的......

【问题讨论】:

    标签: c++ model-view-controller wkhtmltopdf


    【解决方案1】:

    关于系统要求,我在这个页面上找到了一段 http://www.nrecosite.com/pdf_generator_net.aspx 说:

    • PdfGenerator 可与 Azure Web 角色/辅助角色/普通 VM 完美配合。
    • 不支持 Azure 网站,因为 GDI WinAPI 限制会阻止 WkHtmlToPdf 工作。

    我想这也可能适用于我的情况。我没有在 Azure 中运行,但仍然在“云服务”环境中,因此它们可能具有与 GDI WinAPI 相同的限制。

    这真是令人难过。这个想法很棒:Web 和客户端中的报告相同。但是在这种设置下它不起作用。

    【讨论】:

    • 只是一个更新,链接页面不再这么说。我希望这意味着他们修复了它。
    【解决方案2】:

    我们有类似的错误提示:无法生成 PDF:(退出代码:-1073741819)

    如果有人需要,我会将我们的解决方案放在这里。从控制台执行 wkhtmltopdf.exe 并检查错误。在我们的例子中,它说缺少一些 dll,例如 api-ms-win-core-localization-l1-2-0.dll、api-ms-win-core-timezone-l1-2-0.dll 等等。我不知道为什么这些 dll 不在服务器上。根据操作系统,我们在system32或sysWOW64文件夹下找到了正确的位置,并将这些dll复制到这些文件夹中,问题就解决了。

    例如如何解决 api-ms-win-core-timezone-l1-2-0.dll 的问题,下面的链接会有所帮助:https://www.youtube.com/watch?v=s5N0jmYyy34

    【讨论】:

    • 我想这是假设您对自己的服务器负责。在托管环境中,您可能不允许将文件添加到系统文件夹...
    猜你喜欢
    • 2014-01-25
    • 2011-10-10
    • 2023-01-22
    • 2014-03-31
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    相关资源
    最近更新 更多