【问题标题】:How to add dynamic header to generated PDF document如何在生成的 PDF 文档中添加动态标题
【发布时间】:2015-06-26 09:24:49
【问题描述】:

我正在使用TuesPechkin 从动态 Html 中获取 Pdfs。 正文很简单,因为它可以采用 Html 字符串,但页眉和页脚仅采用 Urls。 我将它们作为 html 存储在本地 atm,我可以将它们带入文档,但没有任何动态内容。

有没有办法使用 Razor 或类似的方法来带来这样的价值 -

var document = new HtmlToPdfDocument
{
    GlobalSettings = new GlobalSettings(),
    Objects = 
    {
        new ObjectSettings 
        { 
            HtmlText = "<p>Some Html</p>",
            Footer = new FooterSetting { PageUrl = "file://C:/file.cshtml?Name=name" }
        }
    }
};

Html 看起来像

<html>
    <p>Name: @Request["name"]</p>
</html>

该项目只是一个类库,所以我认为它缺少运行 razor 所需的某些方面?

提前感谢您的任何意见。

【问题讨论】:

    标签: c# .net pdf-generation wkhtmltopdf tuespechkin


    【解决方案1】:

    您可以尝试将剃刀代码呈现为字符串,然后将其保存为文件,最后将文件导出为 PDF。

    有时像这样:

    剃刀到字符串

    public string RenderRazorViewToString(string viewName, object model)
    {
        ViewData.Model = model;
        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
            viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
            return sw.GetStringBuilder().ToString();
        }
    }
    

    导出为 PDF

    public void MyPDFExport()
    {
        string url = @"d:\Foo.html";
        string html = RenderRazorViewToString("File", "myName");
        System.IO.File.WriteAllBytes(url, System.Text.Encoding.ASCII.GetBytes(html));
    
        var document = new HtmlToPdfDocument
        {
            GlobalSettings = new GlobalSettings(),
            Objects = 
            {
                new ObjectSettings 
                { 
                    HtmlText = "<p>Some Html</p>",
                    FooterSettings = new FooterSettings { HtmlUrl = url }
                }
            }
        };
        IConverter converter =
            new ThreadSafeConverter(
                new RemotingToolset<PdfToolset>(
                    new Win32EmbeddedDeployment(
                        new TempFolderDeployment())));
    
        byte[] result = converter.Convert(document);
    }
    

    查看 File.cshtml

    @model string
    
    <html>
        <p>Name: @Model</p>
    </html>
    

    【讨论】:

    • 您好,感谢您的回答。我们希望避免保存除 pdf 之外的任何物理内容(应该指定这一点)。最终选择设置一个网络服务器来运行剃须刀
    • @Tamzoid 我认为如果不将 html 文件(一旦呈现)保存在服务器上,您将无法做到这一点。将其保存在临时文件中然后在创建 pdf 后将其删除有什么问题?
    • 为什么需要保存 html 页面?我只是使用控制器和 viewbag,然后指定我想在 url 中显示的值。没有具体原因,我团队中的其他人似乎对此不满意
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多