2015-07-13 175 views
2

我試圖從下面的HTML生成PDF,即帶有虛線下劃線的文本。 (下面是樣品的實際HTML是大得多)使用iTextSharp將HTML樣式(虛線下劃線)轉換爲PDF

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

回答

0

根據CSS conformance list,只有表格單元格支持邊框。

您看到的這條線實際上是<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>標記的字體大小(我忘記了實際上是標記!)。

因此,不幸的是,修改源文件的時間不長,我不確定您正在尋找什麼是可能的。

+0

謝謝你的更新克里斯。我嘗試過使用不同的HTML標籤,但問題仍然存在。例如

 Hello stackoverflow how are you? 
。有什麼建議麼 ?我想我會和你在http://stackoverflow.com/questions/29260730/how-do-you-underline-text-with-dashedline-in-itext-pdf中提到的其他建議一起去,我會混合我的HTML 。 –

+0

就像我說的,你只能改變表格單元格上的邊框樣式,沒有別的,所以div不會幫你。你需要把它和另一個混合起來(我忘了我甚至寫過)! –

相關問題