Я пытаюсь отобразить HTML-документ в формате PDF с помощью wkhtmltopdf.exe, который я вызываю из веб-приложения C#.
Документ HTML должен иметь как нижний колонтитул, так и верхний колонтитул, которые повторяются на каждой странице, что возможно с помощью wkhtmltopdf, указав --header-html <a path>
в качестве аргумента.
Однако нижний колонтитул визуализируется динамически из представления 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) не работают, когда вы используете стандартный ввод и просто передаете строку HTML, поэтому мне нужно вставить абсолютный путь через Razor во время выполнения.
Для этой проблемы я попытался установить рабочий каталог процесса в соответствии с относительными путями, но безрезультатно:
p.StartInfo.WorkingDirectory = @"C:\templates";
Если бы я мог решить эту проблему, это также решило бы 90% проблемы.