私はC#Webアプリケーションから呼び出すwkhtmltopdf.exeを使用してHTMLドキュメントをPDFとしてレンダリングしようとしています。WkHtmlToPDF - stdinとヘッダ/フッタの使用
HTML文書には、すべてのページで繰り返されるフッターとヘッダーの両方が必要です。これは、引数として--header-html <a path>
を指定して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));
しかし、もちろん、それだけで扱い、その文書ではなく、フッターの一部として。
私がフッターとヘッダーを動的にレンダリングしたい主な理由は(主に)別の問題によるものです。動的なヘッダとフッタを持つのは良いことですが、相対パス(例:C:\ templates \ images \ logo.png)が絶対パスであるため、 images/logo.png)は、stdinを使用してHTMLの文字列blobを渡すときには動作しませんので、実行時にRazorを通して絶対パスを挿入する必要があります。の90%を解決するでしょう
p.StartInfo.WorkingDirectory = @"C:\templates";
私はその問題を解決することができれば、:
この問題については、私は相対パスを一致させるために、プロセスの作業ディレクトリを設定しようとしたが、無駄にしました問題も同様です。
私は同じ問題を抱えていましたが、Wkhtmltopdfの脅威のヘッダー/フッターが(外部のパス/ URLを介して)別々になってしまったので、動的なデータをURLにフィードしたhtmlドキュメントを定義しました。私はいくつかのjavascriptでそれらを抽出しました。 – Alex