0

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

4

2 回答 2

0

问题在于用于样式表的路径。HTML 不能识别 '~' 字符的任何特殊含义。请参阅RFC3986 第 2.3 节

在 Linux 中,'~' 有一个特殊的含义,它被翻译为主目录,但对于 HTML,它只是另一个字符。我建议您使用Path.GetFullPath("~")获取主目录的完整路径,然后改用它。

更新:

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

所以代码应该是这样的:

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");

希望这将解决问题。

于 2021-01-07T10:27:09.797 回答
0

这对我有用:您可以在 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);
于 2021-01-08T12:02:30.027 回答