我在我的项目中使用 WkHtmlToXSharp 包装器库从 HTML 生成 PDF 文件。
我在不同的 PC 上多次使用这个库,突然,我遇到了以下问题:
System.AccessViolationException:试图读取或写入 protected 内存。这通常表明其他内存已损坏。 在 WkHtmlToXSharp.WkHtmlToPdfConverter.wkhtmltopdf_convert(IntPtr 转换器) 在 WkHtmlToXSharp.WkHtmlToPdfConverter.Convert(String inputHtml) 在 WkHtmlToXSharp.WkHtmlToPdfConverter.Convert() 在 WkHtmlToXSharp.MultiplexingConverter.b_8() --- 内部异常堆栈跟踪结束 --- 在 Sanford.Threading.DelegateQueue.EndInvoke(IAsyncResult 结果) 在 Sanford.Threading.DelegateQueue.Invoke(委托(delegate)方法,对象 [] 参数) 在 WkHtmlToXSharp.MultiplexingConverter.Convert()
这似乎是这个库的一个常见问题(我在网上找到了一些关于它的反馈——但是没有提供修复)。顺便说一句,就我而言,它有点随机发生。我在其他开发机器上没有遇到这个问题。我想知道是否有人有解决办法。我还想知道这是否是包装器库的问题,如果是 WkHtmlToPDF 库本身的话。
有什么建议吗?我也愿意使用另一个转换器,只要它是免费且稳定的,并且如果可能的话,不会产生新的进程。它必须在所有 Windows 版本中正常和稳定地工作,并在转换方面做得很好(要转换的 HTML 是固定的 - 包含一些图片和表格以及基本的 CSS)。
最佳答案
我建议另一种方法:直接使用 wkhtmltopdf.exe,构建您自己的包装器。如果您可以控制输入,那么它们就不是很复杂,然后您确切地知道如何更新它以及选项如何工作。我在直接使用 wkhtmltopdf 时从未遇到过这个问题(在 Win7、Win server 2008 r2、Ubuntu 和 CentOS 上)。不过,它们会为每次转换生成进程。
例如,查看 Derp class in another answer of mine关于 wkhtmltopdf。或者尝试类似下面未经测试的代码(您的真实代码会更复杂,这只是一个演示/POC)。
var pi = new ProcessStartInfo(@"c:\wkhtmltopdf\wkhtmltopdf.exe");
pi.CreateNoWindow = true;
pi.UseShellExecute = false;
pi.WorkingDirectory = @"c:\wkhtmltopdf\";
pi.Arguments = "http://www.google.com gogl.pdf";
using (var process = Process.Start(pi))
{
process.WaitForExit(99999);
Debug.WriteLine(process.ExitCode);
}
关于html - WkHtmlToXSharp - System.AccessViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10175666/