【发布时间】: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