C# ASP.NET将HTML转换为Pdf将丢失HTML格式-非VC
我试图将cshtml文件发布为PDF,但当PDF呈现时,所有html格式都丢失了。我认为问题可能是我需要像本例中那样将视图呈现为字符串,但我没有使用MVC,并且我不太了解该过程,无法确定如何从本例中推断。如何获得要渲染的视图,以便不丢失HTML格式 下面是代码的设置方式: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
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);
}