外部样式表不适用于 HtmlTextWriter

问题描述

我正在尝试使用 DynamicPdf.HmtlConverter 库从 Html 字符串生成 Pdf。 为了生成 Html 字符串,我使用 System.Web.UI 中的 HtmlTextWriter 类。 我正在尝试按如下方式添加外部样式表:

StringBuilder sb = new StringBuilder();
sb.Append(@"<!DOCTYPE html>" + Environment.NewLine);
StringWriter stringWriter = new StringWriter();
using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter))
{  //adding head and link tag 
   writer.RenderBeginTag(HtmlTextWriterTag.Html);
   writer.RenderBeginTag(HtmlTextWriterTag.Head);
   writer.Write("<Meta charset=" + "\"UTF-8\">");
   //Add Link tag attributes
    writer.AddAttribute(HtmlTextWriterattribute.Rel,"stylesheet");
    writer.AddAttribute(HtmlTextWriterattribute.Href,@"~\Stylesheet1.css");  //style sheet reference 
writer.AddAttribute(HtmlTextWriterattribute.Type,"text/css");
writer.RenderBeginTag(HtmlTextWriterTag.Link);
writer.RenderEndTag(); // end of Link tag
writer.RenderEndTag(); // end of head tag
// Body tag 
writer.RenderBeginTag(HtmlTextWriterTag.Body)
writer.RenderEndTag(); // end of Body tag 
writer.RenderEndTag(); // end of Html tag 
}
sb.Append(stringWriter);

因此“sb”将具有 Html 字符串,该字符串将传递给 DynamicPdf 库方法生成 Pdf,如下所示:

ceTe.DynamicPDF.HtmlConverter.Converter.Convert(sb.ToString(),@"~\output3.pdf",null,options);

外部样式表对 Html 控件没有任何影响。

关于如何使用带有 HtmlTextWriter 和 DynamicPdf 库的外部样式表生成 Pdf 的任何建议..!!!

解决方法

的问题是与用于样式表的路径。 HTML并没有认识到“〜”字符的任何特殊含义。见RFC3986 Section:2.3

在Linux中,“〜”有特殊的意义,并转换到主目录但对于HTML它只是另一个字符。我建议你使用Path.GetFullPath("~")获得完整路径的主目录,然后使用来代替。

更新:

我主要是集中于HTML部分,但我注意到,ceTe.DynamicPDF.HtmlConverter.Converter.Convert()被设置为第三个参数null。它必须是在HTML字符串中使用的所有文件路径的基本路径。见DynamicPDF Reference

因此,代码看起来应该是这样的:

ceTe.DynamicPDF.HtmlConverter.Converter.Convert(sb.ToString(),@"~\output3.pdf",new Uri(@"file://C:\Users\Z0042ADE\source\repos\HtmlTextWriterDemo\HtmlTextWriterDemo\"),options);

然后,你可能不需要使用HTML字符串的任何路径。这可以是刚样式名:

writer.AddAttribute(HtmlTextWriterAttribute.Href,@"Stylesheet1.css");

希望这将解决问题。

,

这对我有用: 您可以在 HTML 源代码中指定外部 CSS,并使用 DynamicPdf 库将其用于转换而不会出现任何问题。您可以使用 URL 从网站获取 CSS,或者如果您使用 HTML 字符串作为转换的输入并希望使用外部 CSS,那么您需要指定基本路径来选择资源。请参阅有关 HTML 转换器基本标签的文档,网址为: [1]:https://www.dynamicpdf.com/docs/dotnet/html-converter-base-urls

请看下面的代码示例:

下面的 HTML 文本使用放置在 BasePath Uri 中指定的文件夹中的文件的外部样式。

Uri basepath = new Uri(@"C:\Temp\Resource\sytlesheet.css");
ceTe.DynamicPDF.HtmlConverter.Converter.Convert(htmlText,@"C:\Temp\MyHTmlPDF.pdf",basepath);