使用 iTextSharp 将 HTML 样式(点下划线)转换为 PDF
Posted
技术标签:
【中文标题】使用 iTextSharp 将 HTML 样式(点下划线)转换为 PDF【英文标题】:Convert HTML style (dotted underline) to PDF using iTextSharp 【发布时间】:2015-10-01 19:31:33 【问题描述】:我正在尝试从 html 下方生成 PDF,即带有点下划线的文本。 (下面是示例实际 HTML 更大)
<u style="border-bottom: 1px dotted #000;text-decoration: none;"> Hello </u>
如How to convert HTML to PDF using iTextSharp 中所述。输出应该有一条虚线,我可以在 HTML 文件中看到,但是 iTextSharp 生成的 PDF 显示的是正常下划线而不是虚线下划线。这是我的完整方法
public void UsingXMLWorker()
Byte[] bytes;
//Create a stream that we can write to, in this case a MemoryStream
using (var ms = new MemoryStream())
using (var doc = new Document())
//Create a writer that's bound to our PDF abstraction and our stream
using (var writer = PdfWriter.GetInstance(doc, ms))
//Open the document for writing
doc.Open();
//sample HTML and CSS
var example_html = @"<u style=""border-bottom: 1px dotted #000;text-decoration: none;"" > Hello </u>";
using (var srHtml = new StringReader(example_html))
//Parse the HTML
iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml);
//var example_html = @"<u class=""dottedBorder""> Hello </u>";
//var example_css = @".dottedBorderborder-bottom: 1px dotted #000;text-decoration: none;font-size:38px;";
//using (var msCss = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_css)))
//
// using (var msHtml = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_html)))
//
// //Parse the HTML
// iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msHtml, msCss);
//
//
doc.Close();
bytes = ms.ToArray();
var testFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.pdf");
System.IO.File.WriteAllBytes(testFile, bytes);
我什至尝试了其他方法,例如下面的代码,但我仍然看到生成的 PDF 带有普通下划线,而不是虚线下划线。我在这里缺少什么?
var example_html = @"<u class=""dottedBorder""> Hello </u>";
var example_css = @".dottedBorderborder-bottom: 1px dotted #000;text-decoration: none;font-size:38px;";
using (var msCss = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_css)))
using (var msHtml = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(example_html)))
//Parse the HTML
iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msHtml, msCss);
【问题讨论】:
【参考方案1】:根据CSS conformance list,仅表格单元格支持边框。
您看到的行实际上是<u>
标签的默认底部边框,而您的text-decoration
代码实际上被<u>
标签的默认代码覆盖。如果您查看iTextSharp\tool\xml\css\StyleAttrCs-s-resolver.cs
中的ResolveStyles
方法,则为tagCss
设置键和值的顶部块(5.5.6 中大约170 个)正确地找到并设置了您的属性。然而,之后的下一个代码块对某些 HTML 标记进行了特殊处理,并在此基础上强制执行一些规则。
// inherit css from parent tags, as defined in provided CssInheritanceRules or if property = inherit
IDictionary<String, String> css = t.CSS;
if (t.Name != null)
if (t.Name.Equals(HTML.Tag.I) || t.Name.Equals(HTML.Tag.CITE)
|| t.Name.Equals(HTML.Tag.EM) || t.Name.Equals(HTML.Tag.VAR)
|| t.Name.Equals(HTML.Tag.DFN) || t.Name.Equals(HTML.Tag.ADDRESS))
tagCss[CSS.Property.FONT_STYLE] = CSS.Value.ITALIC;
else if (t.Name.Equals(HTML.Tag.B) || t.Name.Equals(HTML.Tag.STRONG))
tagCss[CSS.Property.FONT_WEIGHT] = CSS.Value.BOLD;
else if (t.Name.Equals(HTML.Tag.U) || t.Name.Equals(HTML.Tag.INS))
tagCss[CSS.Property.TEXT_DECORATION] = CSS.Value.UNDERLINE;
else if (t.Name.Equals(HTML.Tag.S) || t.Name.Equals(HTML.Tag.STRIKE)
|| t.Name.Equals(HTML.Tag.DEL))
tagCss[CSS.Property.TEXT_DECORATION] = CSS.Value.LINE_THROUGH;
else if (t.Name.Equals(HTML.Tag.BIG))
tagCss[CSS.Property.FONT_SIZE] = CSS.Value.LARGER;
else if (t.Name.Equals(HTML.Tag.SMALL))
tagCss[CSS.Property.FONT_SIZE] = CSS.Value.SMALLER;
由于此块发生在您的 CSS 之后,您会看到您无法删除 <u>
标记上的下划线,因为它总是会重新打开。同样,您也不能取消粗体 <strong>
标签,取消斜体 <em>
或在 <big>
标签上显式设置字体大小(我忘了那实际上是标签!)除非你有父母容器的字体大小设置。
不幸的是,除了修改源代码之外,我不确定您正在寻找的内容是否可行。
【讨论】:
感谢克里斯的更新。我尝试使用不同的 HTML 标签,但问题仍然存在。例如 你好 ***,你好吗? 。有什么建议 ?我想我会接受你在***.com/questions/29260730/… 中提到的其他建议,我会相应地混合我的 HTML。 就像我说的,您只能更改表格单元格的边框样式,不能更改其他内容,因此 div 对您没有帮助。您需要将它与另一个混合(我什至忘记了我写的!)以上是关于使用 iTextSharp 将 HTML 样式(点下划线)转换为 PDF的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET 中将 HTML 转换为 PDF 时保持 CSS 样式[关闭]
html到pdf使用itextsharp如何设置<div>元素边框
C# html生成PDF遇到的问题,从iTextSharp到wkhtmltopdf