转换HTML样式(虚线下划线)到PDF使用iTextSharp

本文关键字:PDF 使用 iTextSharp 下划线 HTML 样式 虚线 转换 | 更新日期: 2023-09-27 18:02:29

我正试图从HTML下面生成PDF,即一个带点下划线的文本。(下面是示例实际HTML要大得多)

<u style="border-bottom: 1px dotted #000;text-decoration: none;"> Hello </u>

如如何使用iTextSharp将HTML转换为PDF中所述。输出应该有一条虚线,我可以在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 = @".dottedBorder{border-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 = @".dottedBorder{border-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);
                        }
                    }

转换HTML样式(虚线下划线)到PDF使用iTextSharp

根据CSS一致性列表,边框只支持在表格单元格上。

您所看到的行实际上是<u>标签的默认下边框,您的text-decoration代码实际上被<u>标签的默认代码覆盖。如果您观察iTextSharp'tool'xml'css'StyleAttrCSSResolver.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>标签的字体大小(我忘了它实际上是一个标签!),除非您有父容器的字体大小集。

所以不幸的是,没有修改源代码,我不确定你正在寻找的是可能的