4

我在我的项目中使用 WkHtmlToXSharp 包装库从 HTML 生成 PDF 文件。

我在不同的 PC 上多次使用这个库,突然间,我遇到了以下问题:

System.AccessViolationException:试图读取或写入受保护的内存。这通常表明其他内存已损坏。在 WkHtmlToXSharp.WkHtmlToPdfConverter.wkhtmltopdf_convert(IntPtr 转换器) 在 WkHtmlToXSharp.WkHtmlToPdfConverter。Convert(String inputHtml) at WkHtmlToXSharp.WkHtmlToPdfConverter.Convert() at WkHtmlToXSharp.MultiplexingConverter.b_8() --- 内部异常堆栈跟踪结束 --- 在 Sanford.Threading.DelegateQueue.EndInvoke(IAsyncResult 结果) 在 Sanford.Threading.DelegateQueue.Invoke(Delegate method, Object[] args) 在 WkHtmlToXSharp.MultiplexingConverter.Convert ()

这似乎是这个库的一个常见问题(我在网上找到了一些关于它的反馈 - 但是没有提供修复)。顺便说一句,就我而言,它的发生有点随机。我在其他开发机器上没有遇到这个问题。我想知道是否有人可以解决它。我还想知道这是否是包装库的问题,如果是 WkHtmlToPDF 库本身。

有什么建议吗?我也愿意使用另一个转换器,只要它是免费且稳定的,并且如果可能的话,不产生新进程。它必须在所有 Windows 版本中正常和稳定地工作,并且可以进行体面的转换(要转换的 HTML 是固定的 - 包含一些图片和表格以及基本的 CSS)。

4

1 回答 1

3

我建议另一种方法:直接使用 wkhtmltopdf.exe,构建自己的包装器。如果您可以控制输入并且您确切地知道如何更新它以及选项如何工作,那么它们并不是很复杂。直接使用 wkhtmltopdf(在 Win7、Win server 2008 r2、Ubuntu 和 CentOS 上)时,我从未遇到过这个问题。不过,它们确实会为每次转换生成过​​程。

例如,查看我关于 wkhtmltopdf 的另一个答案中的Derp 类。或者试试下面未经测试的代码(你的真实代码会更复杂,这只是一个演示/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);
}
于 2012-08-16T17:00:08.887 回答