C# ASP.NET将HTML转换为Pdf将丢失HTML格式-非VC

C# ASP.NET将HTML转换为Pdf将丢失HTML格式-非VC,c#,asp.net,razor,C#,Asp.net,Razor,我试图将cshtml文件发布为PDF,但当PDF呈现时,所有html格式都丢失了。我认为问题可能是我需要像本例中那样将视图呈现为字符串,但我没有使用MVC,并且我不太了解该过程,无法确定如何从本例中推断。如何获得要渲染的视图,以便不丢失HTML格式 下面是代码的设置方式: public class PrintTemplate<T> : RazorEngine.Templating.TemplateBase<T> { public new T Model { get

我试图将cshtml文件发布为PDF,但当PDF呈现时,所有html格式都丢失了。我认为问题可能是我需要像本例中那样将视图呈现为字符串,但我没有使用MVC,并且我不太了解该过程,无法确定如何从本例中推断。如何获得要渲染的视图,以便不丢失HTML格式

下面是代码的设置方式:

public class PrintTemplate<T> : RazorEngine.Templating.TemplateBase<T>
{
    public new T Model { get; set; }

    public PrintTemplate()
    {
        //TODO: Add Constructor Logic
    }
}

public class ViewPage
{
    public string Body { get; set; }
}

public static class PrintPDFBO
{
    public static ViewPage PrintPDF(id)
    {
        var newPrint = new ViewPage();
        var pdf = GetDataForPDF(id);
        newPrint.Body += RazorEngine.Razor.Parse(PrintPDFUtil.GetPrintTemplate(id), pdf, id.ToString());
        newPrint.Body += "</body></html>";
        return newPrint;
    }
}

protected void btnPrintPDF_OnClick(object sender, EventArgs e)
{
    var content = new ViewPage();
    content = PrintPDFBO.PrintPDF(id);
    title = DateTime.Now + "My Title";
}

UPDATE: I've tried depositing the text from my view into a panel then outputting the panel but            
        the result is the same, no formatting
protected void PrintablePdf(ViewPage view, string title)
{
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", "attachment;fileName=" + title);
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    //StringBuilder sb = new StringBuilder(view.Body);
    divPrint.InnerHtml = view.Body.ToString();
    StringWriter sw = new StringWriter(sb);
    HtmlTextWriter hw = new HtmlTextWriter(sw);
    pnlPrint.RenderControl(hw);
    StringReader sr = new StringReader(sw.ToString());
    Document pdf = new Document(PageSize.A4, 50f, 50f, 50f, 50f);
    HTMLWorker htmlparser = new HTMLWorker(pdf);
    PdfWriter.GetInstance(pdf, Response.OutputStream);
    pdf.Open();
    htmlparser.Parse(sr);
    pdf.Close();
}
最终更新决议:


最后,我尝试使用CSHTML来保存PDf中的布局,但没有任何效果。最后,我不得不求助于使用ITextSharp的PdfPTable、PdfPCell和其他功能在codebehind中动态创建PDF来手动构建PDF。我对完成所需布局所需的嵌套表的数量并不感到兴奋,代码看起来非常复杂,但是我能够将某些部分减少为可重用的方法调用

我以前没有使用过iTextSharp,但在我在网上看到的例子中,他们没有使用你所有的作家。我怀疑其中一个正在剥离HTML

您可以尝试从StringBuilder到html解析器的更简单的路径吗

htmlparser.Parse(new StringReader(sb.ToString()));
这两个页面似乎有相同的问题,但表示他们找到了解决方案。除了StringReader的简化之外,它们的代码与您的代码类似

EDIT:您正在使用的类HtmlParser似乎已被弃用。建议使用XMLWorker

这里有一个来自中国的例子

另外,看看这篇文章,它讨论了加载css所需的特殊步骤,如果你打算使用它的话。

我以前没有使用过iTextSharp,但在我在网上看到的示例中,它们并没有使用您拥有的所有编剧。我怀疑其中一个正在剥离HTML

您可以尝试从StringBuilder到html解析器的更简单的路径吗

htmlparser.Parse(new StringReader(sb.ToString()));
这两个页面似乎有相同的问题,但表示他们找到了解决方案。除了StringReader的简化之外,它们的代码与您的代码类似

EDIT:您正在使用的类HtmlParser似乎已被弃用。建议使用XMLWorker

这里有一个来自中国的例子

另外,看看这篇文章,它讨论了加载css所需的特殊步骤,如果你打算使用它的话。
我在一个叫做


有一个免费版本,只需在nuget中签入即可。该链接有关于如何将html字符串转换为PDF的说明。它还可以传递URL并获取PDF。希望你能从中找到一些用处。

我在一个叫做

 using (var srHtml = new StringReader(ConvertedString))
            {
                //Parse the HTML

                hw.Parse(srHtml);

            }
有一个免费版本,只需在nuget中签入即可。该链接有关于如何将html字符串转换为PDF的说明。它还可以传递URL并获取PDF。希望你能从中找到一些用处

 using (var srHtml = new StringReader(ConvertedString))
            {
                //Parse the HTML

                hw.Parse(srHtml);

            }
这就是我的工作,StringBuilder的用户StirngReader instad


这对我来说很有用,StringBuilder的用户StirngReader instad

你说的html格式是什么意思?Parse将根据传递给它的模板的内容返回一个HTML格式的字符串。什么是它没有错误地提供输入和实际输出与预期输出。我已经更新了信息,包括cshtml和预期输出,谢谢。您使用哪个库生成PDF?我在页面上使用iTextSharp.text、iTextSharp.html和iTextSharp.PDF。html格式是什么意思?Parse将根据传递给它的模板的内容返回一个HTML格式的字符串。什么是它没有错误地提供输入和实际输出与预期输出。我已经更新了信息,包括cshtml和预期输出,谢谢。您使用哪个库生成PDF?我在页面上使用iTextSharp.text、iTextSharp.html和iTextSharp.PDF。我尝试了这里的建议;但是,结果是一样的,我得到了数据,但没有格式化。请参阅我如何更改它的更新示例。很抱歉问一个明显的问题,但是在更新的PrintablePdf中,您是否确认body参数包含HTML标记?你能传递一个更简单的html blurb来看看它是否也会被去掉吗?所以我看了一下,body参数只是有一个以标记开始和结束的html,不管我是将它作为字符串直接传递给解析器,还是将它传递给asp面板,然后进行渲染。因此,我尝试将其添加到body参数,使其格式如下:。。。但结果还是一样,我确实尝试了这里的建议;但是,结果是一样的,我得到了数据,但没有格式化。请参阅我如何更改它的更新示例。很抱歉问一个明显的问题,但是在更新的PrintablePdf中,您是否确认body参数包含HTML标记?你能传递一个更简单的html简介来看看它是否也会被删除吗?所以我看了看,body参数刚刚开始了html
无论我是将其作为字符串直接传递给解析器,还是将其传递给asp面板,都以标记结束。因此,我尝试将其添加到body参数,使其格式如下:。。。但是结果还是一样。我已经解析了文本并使用了字符串读取器,但是格式仍然丢失,谢谢。我已经解析了文本并使用了字符串读取器,但是格式仍然丢失,谢谢。
 using (var srHtml = new StringReader(ConvertedString))
            {
                //Parse the HTML

                hw.Parse(srHtml);

            }