【发布时间】:2012-10-16 07:07:35
【问题描述】:
我正在尝试使用从 C# Web 应用程序调用的 wkhtmltopdf.exe 将 HTML 文档呈现为 PDF。
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) 在您使用标准输入并仅传入 HTML 字符串 blob 时不起作用,因此我需要在运行时通过 Razor 插入绝对路径。
对于这个问题,我已经尝试设置进程的工作目录来匹配相对路径,但没有成功:
p.StartInfo.WorkingDirectory = @"C:\templates";
如果我能解决这个问题,那也能解决 90% 的问题。
【问题讨论】:
-
我遇到了同样的问题,但是由于 Wkhtmltopdf 威胁页眉/页脚分开(通过外部路径/url),我最终定义了一个 html 文档,我将动态数据输入到它的 url 中。然后我用一些javascript提取了那些。
标签: c# razor stdin wkhtmltopdf