Вопрос по pdf, html, wkhtmltopdf – WkHtmlToXSharp - System.AccessViolationException

4

Я использую библиотеку-оболочку WkHtmlToXSharp в своем проекте для создания PDF-файла из HTML.

Я много раз использовал эту библиотеку на разных компьютерах и неожиданно столкнулся со следующей проблемой:

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. at WkHtmlToXSharp.WkHtmlToPdfConverter.wkhtmltopdf_convert(IntPtr converter) at WkHtmlToXSharp.WkHtmlToPdfConverter.Convert(String inputHtml) at WkHtmlToXSharp.WkHtmlToPdfConverter.Convert() at WkHtmlToXSharp.MultiplexingConverter.b_8() --- End of inner exception stack trace --- at Sanford.Threading.DelegateQueue.EndInvoke(IAsyncResult result) at Sanford.Threading.DelegateQueue.Invoke(Delegate method, Object[] args) at WkHtmlToXSharp.MultiplexingConverter.Convert()

Похоже, что это общая проблема с этой библиотекой (в Интернете я нашел некоторые отзывы об этом, однако исправления не было предоставлено). Кстати, в моем случае это происходит несколько случайно. Я не испытывал эту проблему в других машинах разработчиков. Интересно, есть ли у кого-нибудь решение для этого? Мне также интересно, если это проблема с библиотекой оболочки, если с самой библиотекой WkHtmlToPDF.

Любое предложение? Я также открыт для использования другого конвертера, если он свободен и стабилен и, если возможно, без запуска нового процесса. Он должен работать должным образом и стабильно во всех версиях Windows и выполнять приличную работу по преобразованию (HTML-код для преобразования фиксирован - содержит несколько рисунков и таблиц и базовый CSS).

Ваш Ответ

1   ответ
3

Я бы предложил альтернативный маршрут: просто используйте wkhtmltopdf.exe напрямую, создав свою собственную оболочку. Они не очень сложны, если у вас есть контроль над вводом, а затем вы точно знаете, как его обновить и как работают опции. Я никогда не сталкивался с этой проблемой при непосредственном использовании wkhtmltopdf (на Win7, Win server 2008 r2, Ubuntu и CentOS). Они делают процесс порождения для каждого преобразования, хотя.

Для примера, проверьтеСумасшедший класс в другом моем ответе относительно 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);
}
@Nenotlep, пожалуйста, ответьте мне обратно на [email protected] Я опишу мою проблему по электронной почте.
На самом деле я так и сделал. Это было то, что я полагаю, что это был бы правильный ответ в любом случае, по крайней мере, для современного состояния WkHtmlToPdf / WkHtmlToXSharp Żubrówka
@ user3163213 Если у вас есть такая проблема, я бы построил систему массового обслуживания. Это означает, что если вы отправляете PDF-файлы пользователям напрямую через браузер, вам придется искать и альтернативным способом (прикрепить к электронной почте, отправить ссылку по электронной почте и т. Д.).
@Nenotlep, использовать wkhtmltopdf.exe абсолютно просто, но при большом количестве одновременных запросов моя система останавливается. Есть ли способ вызова этого выполнения в фоновом режиме?

Похожие вопросы