我在项目中使用WkHtmlToXSharp包装器库从HTML生成PDF文件。
我在不同的PC上多次使用这个库,突然间,我遇到了以下问题:
System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。 在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(委托方法,对象[] args) 在WkHtmlToXSharp.MultiplexingConverter.Convert()
这似乎是这个库的常见问题(我在网上发现了一些关于它的反馈 - 但是没有提供修复)。顺便说一句,在我的情况下,它有点随机发生。我没有在其他开发机器中遇到这个问题。我想知道是否有人有解决方法。如果使用WkHtmlToPDF库本身,我也想知道这是否是包装器库的问题。
有什么建议吗?我也愿意使用另一个转换器,只要它是免费且稳定的,并且如果可能的话,不会产生新的过程。它必须在所有Windows版本中正常稳定地运行,并且转换得很好(要转换的HTML是固定的 - 包含一些图片和表格以及基本的CSS)。
答案 0 :(得分:3)
我建议另一种方法:直接使用wkhtmltopdf.exe,构建自己的包装器。如果您可以控制输入,那么它们并不是很复杂,然后您就知道如何更新它以及选项如何工作。我直接使用wkhtmltopdf时遇到过这个问题(在Win7,Win server 2008 r2,Ubuntu和CentOS上)。它们确实为每次转换产生了过程。
有关示例,请查看有关wkhtmltopdf的Derp class in another answer of mine。或尝试类似下面未经测试的代码(您的真实代码将更复杂,这只是一个演示/ 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);
}