【问题标题】:External Style Sheet not working with HtmlTextWriter外部样式表不适用于 HtmlTextWriter
【发布时间】:2025-12-19 00:05:02
【问题描述】:

我正在尝试使用 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 ..!!!

【问题讨论】:

    标签: c# asp.net .net htmltextwriter dynamicpdf


    【解决方案1】:

    问题在于样式表使用的路径。 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");
    

    希望这能解决问题。

    【讨论】:

    • Hello Ashutosh ,实际代码如下所示,我认为还可以。 writer.AddAttribute(HtmlTextWriterAttribute.Href, @"C:\Users\Z0042ADE\source\repos\HtmlTextWriterDemo\HtmlTextWriterDemo\Stylesheet1.css");
    • 尝试添加“file://”。像这样:@"file://C:\Users\Z0042ADE\source\repos\HtmlTextWriterDemo\HtmlTextWriterDemo\Stylesheet1.css");
    • 不,这没有帮助。还有什么我可以尝试的
    • 您使用的是哪个版本的 HtmlConverter?我记得在 v1.4 中修复了一个与类似问题相关的错误。还要确保应用程序以访问该路径的权限运行。
    • 版本 1.5.0 并且应用程序正在以访问路径的权限运行,但没有运气
    【解决方案2】:

    这对我有用: 您可以在 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);
    

    【讨论】: