使用 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;"" >&nbsp;Hello&nbsp;</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"">&nbsp;Hello&nbsp;</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"">&nbsp;Hello&nbsp;</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,仅表格单元格支持边框。

您看到的行实际上是&lt;u&gt; 标签的默认底部边框,而您的text-decoration 代码实际上被&lt;u&gt; 标签的默认代码覆盖。如果您查看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 之后,您会看到您无法删除 &lt;u&gt; 标记上的下划线,因为它总是会重新打开。同样,您也不能取消粗体 &lt;strong&gt; 标签,取消斜体 &lt;em&gt; 或在 &lt;big&gt; 标签上显式设置字体大小(我忘了那实际上是标签!)除非你有父母容器的字体大小设置。

不幸的是,除了修改源代码之外,我不确定您正在寻找的内容是否可行。

【讨论】:

感谢克里斯的更新。我尝试使用不同的 HTML 标签,但问题仍然存在。例如  你好 ***,你好吗? 。有什么建议 ?我想我会接受你在***.com/questions/29260730/… 中提到的其他建议,我会相应地混合我的 HTML。 就像我说的,您只能更改表格单元格的边框样式,不能更改其他内容,因此 div 对您没有帮助。您需要将它与另一个混合(我什至忘记了我写的!)

以上是关于使用 iTextSharp 将 HTML 样式(点下划线)转换为 PDF的主要内容,如果未能解决你的问题,请参考以下文章

样式未使用ITextSharp在PDF中实现[复制]

在 ASP.NET 中将 HTML 转换为 PDF 时保持 CSS 样式[关闭]

html到pdf使用itextsharp如何设置<div>元素边框

C# html生成PDF遇到的问题,从iTextSharp到wkhtmltopdf

使用 ITextSharp 将 HTML 文件转换为 PDF 文件

使用 itextsharp 将图像 html 旁边的文本放置到 pdf