【问题标题】:Convert HTML style (dotted underline) to PDF using iTextSharp使用 iTextSharp 将 HTML 样式(点下划线)转换为 PDF
【发布时间】: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 = @".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);
                        }
                    }

【问题讨论】:

    标签: c# html pdf itextsharp


    【解决方案1】:

    根据CSS conformance list,仅表格单元格支持边框。

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

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

    【讨论】:

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