NReco.PdfGenerator 1.1.7在托管环境中不起作用

时间:2015-08-26 18:52:27

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

我花了几个小时来创建一套由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的错误仍然是一样的......

2 个答案:

答案 0 :(得分:0)

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

  • PdfGenerator适用于Azure Web角色/辅助角色/通常的VM。
  • 由于GDI WinAPI限制阻止WkHtmlToPdf工作,因此不支持Azure网站。

我想这也可能适用于我的情况。我不是在Azure中运行,而是在一个&#34;云服务&#34;环境,因此它们可能具有相同的GDI WinAPI限制。

这真的很难过。这个想法很棒:在网络和客户端上都有相同的报告。但在这种情况下它没有用。

答案 1 :(得分:0)

我们有类似的错误说:无法生成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