我对 2018 年的东西的看法。
我正在使用异步。我正在与 wkhtmltopdf 进行流式传输。我创建了一个新的 StreamWriter,因为 wkhtmltopdf 默认需要 utf-8,但在进程开始时它被设置为其他值。
我没有包含很多参数,因为这些参数因用户而异。您可以使用 additionalArgs 添加您需要的内容。
我删除了 p.WaitForExit(...) 因为我没有处理它是否失败并且它无论如何都会挂在await tStandardOutput
. 如果需要超时,那么您将不得不Wait(...)
使用取消令牌或超时调用不同的任务并相应地进行处理。
public async Task<byte[]> GeneratePdf(string html, string additionalArgs)
{
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = @"C:\Program Files\wkhtmltopdf\wkhtmltopdf.exe",
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
Arguments = "-q -n " + additionalArgs + " - -";
};
using (var p = Process.Start(psi))
using (var pdfSream = new MemoryStream())
using (var utf8Writer = new StreamWriter(p.StandardInput.BaseStream,
Encoding.UTF8))
{
await utf8Writer.WriteAsync(html);
utf8Writer.Close();
var tStdOut = p.StandardOutput.BaseStream.CopyToAsync(pdfSream);
var tStdError = p.StandardError.ReadToEndAsync();
await tStandardOutput;
string errors = await tStandardError;
if (!string.IsNullOrEmpty(errors)) { /* deal/log with errors */ }
return pdfSream.ToArray();
}
}
我没有包含在其中的东西,但如果你有图像、css 或其他 wkhtmltopdf 在呈现 html 页面时必须加载的东西,它们可能会很有用:
- 您可以使用 --cookie 传递身份验证 cookie
- 在 html 页面的标题中,您可以设置带有 href 指向服务器的基本标记,如果需要,wkhtmltopdf 将使用它