C#Webアプリケーションから呼び出すwkhtmltopdf.exeを使用して、HTMLドキュメントをPDFとしてレンダリングしようとしています。
--header-html <a path>
HTMLドキュメントには、すべてのページで繰り返されるフッターとヘッダーの両方が必要です。これは、引数として指定することでwkhtmltopdfで可能です。
ただし、フッターはRazorビューから動的にレンダリングされるため、ディスク上の一時ファイルに保存してそのパスを使用する必要はありませんが、既にメモリにあるレンダリングされたHTMLを使用したいと思います。StandardInput
これは、次のようにストリームに書き込むことで、ドキュメント自体で可能です。
var wkhtml = ConfigurationManager.AppSettings["WkHtmlToPdfPath"];
var p = new Process();
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = wkhtml;
p.StartInfo.Arguments = "-q -n --disable-smart-shrinking - -";
p.Start();
var stdin = p.StandardInput;
stdin.AutoFlush = true;
stdin.Write(template);
stdin.Dispose();
ヘッダーとフッターのHTMLに対して同じことを行うこと、つまり一時ファイルに頼らずにインラインで渡すことは可能ですか?
私はもう試した:
stdin.Write(string.Format("--footer-html {0} ", footer));
しかしもちろん、それはフッターではなく、ドキュメントの一部として扱われます。
フッターとヘッダーも動的にレンダリングしたい主な理由は、(ほとんど)別の問題が原因です。動的なヘッダーとフッターがあると便利ですが、相対パス(例: images / logo.png)stdinを使用し、HTMLの文字列blobを渡すだけでは機能しないため、実行時にRazorを介して絶対パスを挿入する必要があります。
この問題では、相対パスと一致するようにプロセスの作業ディレクトリを設定しようとしましたが、役に立ちませんでした。
p.StartInfo.WorkingDirectory = @"C:\templates";
その問題を解決できれば、問題の90%も解決します。