我在项目中使用 WkHtmlToXSharp 包装器库从 HTML 生成 PDF 文件。
我在不同的电脑上多次使用这个库,突然,我遇到了以下问题:
System.AccessViolationException:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
在 WkHtmlToXSharp.WkHtmlToPdfConverter.wkhtmltopdf_convert(IntPtr 转换器)
在 WkHtmlToXSharp.WkHtmlToPdfConverter。转换(字符串输入Html)
在 WkHtmlToXSharp.WkHtmlToPdfConverter.Convert()
在 WkHtmlToXSharp.MultiplexingConverter.b_8()
--- 内部异常堆栈跟踪结束 ---
在 Sanford.Threading.DelegateQueue.EndInvoke(IAsyncResult 结果)
在 Sanford.Threading.DelegateQueue.Invoke(委托方法,Object[] args)
在 WkHtmlToXSharp.MultiplexingConverter.Convert()
这似乎是这个库的一个常见问题(我在网上找到了一些关于它的反馈 - 但没有提供修复)。顺便说一句,就我而言,这有点随机发生。我在其他开发机器上没有遇到这个问题。我想知道是否有人有解决办法。我还想知道这是否是包装库的问题,如果是 WkHtmlToPDF 库本身的问题。
有什么建议吗?我也愿意使用另一个转换器,只要它是免费且稳定的,并且如果可能的话,不会产生新的进程。它必须在所有 Windows 版本中正常运行且稳定,并且转换效果良好(要转换的 HTML 是固定的 - 包含一些图片和表格以及基本 CSS)。
我建议另一种路线:直接使用 wkhtmltopdf.exe,构建您自己的包装器。如果您可以控制输入,然后您确切地知道如何更新它以及选项如何工作,那么它们并不是很复杂。我在直接使用 wkhtmltopdf 时从未遇到过这个问题(在 Win7、Win server 2008 r2、Ubuntu 和 CentOS 上)。不过,他们会为每次转换执行生成过程。
例如,请查看我的另一个答案中的 Derp 类关于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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)