2018年のものでこれを取り上げます。
私は非同期を使用しています。wkhtmltopdf との間でストリーミングしています。wkhtmltopdf はデフォルトで utf-8 を想定しているため、新しい StreamWriter を作成しましたが、プロセスの開始時に別の値に設定されています。
引数はユーザーごとに異なるため、多くの引数は含めませんでした。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();
}
}
そこには含まれていませんが、HTMLページをレンダリングするときにwkhtmltopdfがロードする必要がある画像、css、またはその他のものがある場合に役立ちます。
- --cookie を使用して認証 Cookie を渡すことができます
- HTMLページのヘッダーで、サーバーを指すhrefを使用してベースタグを設定すると、必要に応じてwkhtmltopdfがそれを使用します