在我的ASP.NET应用程序(.NET Framework 4.7)中,我使用OpenHtmlToPdf
根据网站上的页面创建PDF。
它在本地工作,但不在服务器生产中:我出现以下错误:
异常类型:System.ComponentModel.Win32Exception异常消息:访问被拒绝
堆栈跟踪:位于System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfostartInfo)位于System.Diagnostics.Process.Start()处System.Diagnostics.Process.Start(ProcessStartInfo startInfo)位于OpenHtmlToPdf.HtmlToPdfConverterProcess.Convert(ConversionSourceconversionSource)位于OpenHtmlToPdf.Pdf.DocumentBuilder.ReadContentUsingTemporaryFile(String临时文件名)
我认为问题与wkhtmltopdf
有关,因为OpenHtmlToPdf使用此库来生成PDF。代码非常简单。
var pdf = Pdf.From(html)
.WithGlobalSetting("orientation", "Landscape")
.WithObjectSetting("web.defaultEncoding", "utf-8")
.Content();
return File(pdf, System.Net.Mime.MediaTypeNames.Application.Octet, "Reference.pdf");
然后,如何生成PDF?
OpenHTMLToPDF使用Path.GetTempPath()和Guid.NewGuid()创建一个临时文件。确保您正在运行的进程具有足够的特权来写入Path.GetTempPath();]返回的路径。
供参考,这里是负责创建临时文件名并将其写入的源代码。
//inside TemporaryPdf class public static string TemporaryFilePath() { return Path.Combine(Path.GetTempPath(), "OpenHtmlToPdf", TemporaryPdf.TemporaryFilename()); } private static string TemporaryFilename() { return Guid.NewGuid().ToString("N") + ".pdf"; }
然后在调用Content时使用它>
// inside the Pdf class public byte[] Content() { return this.ReadContentUsingTemporaryFile(TemporaryPdf.TemporaryFilePath()); } private byte[] ReadContentUsingTemporaryFile(string temporaryFilename) { this._globalSettings["out"] = temporaryFilename; HtmlToPdfConverterProcess.ConvertToPdf(this._html, this._globalSettings, this._objectSettings); byte[] numArray = TemporaryPdf.ReadTemporaryFileContent(temporaryFilename); TemporaryPdf.DeleteTemporaryFile(temporaryFilename); return numArray; }
其余代码可在GitHub上找到:OpenHTMLToPDF