2011-12-09 75 views
1

我使用HTML富文本編輯器來幫助我建立了動態​​PDF報告模板,它的正常工作,只是它不改變字體 - 在HTML中字型無變化爲PDF生成面對。使用iTextSharp的

該編輯器使用字體標籤而不是CSS樣式,我歡迎任何以編程方式更改字體標籤使用的樣式,而不是等同的標籤。

HTML(是它的凌亂,它從一個所見即所得的編輯器):

<div>&nbsp; 
<br> 
    <div align="center"> 
    <font size="5"> 
     <b> 
     <br> 
      <div align="center"> 
      <font font-face="Times New Roman" size="5"> 
       <b>Example 
       <font size="6">Chamber 
       <font size="5"> 
       <font size="4">Website</font> 
       </font></font>Quotes</b> 
      </font> 
      <font face="Times New Roman"> 
       <br> 
       <font face="Times New Roman"> 
        <br>~ 
        <font face="Times New Roman" color="#0000FF"> 
        <b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
        <u>&nbsp;[!PlanName]&nbsp;</u></b> 
        </font> 
        <font face="Times New Roman"> 
        <br>~ 
        <font face="Times New Roman" color="#0000FF"> 
         <b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b> 
        </font> 
        <font face="Times New Roman" color="#0000FF"> 
         <b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

         <font color="#000000">Deductible&nbsp; 
         $[!PlanDeductible]:&nbsp;&nbsp;</font></b> 
        </font> 
        <font face="Times New Roman" color="#B0B0FF"> 
        [!PlanRate] 
        <br> 
         <font face="Times New Roman">/~/~</font> 
         <br> 
         <br> 
          <br> 
          <font face="Courier New" size="1"> 
          Copyright Example.com</font> 
          <br> 
           <br> 
           <font face="Arial">test</font> 
           <br></br> 
           </br> 
          </br> 
          </br> 
         </br> 
         </br> 
        </br></font></br> 
        </font></br> 
       </font> 
       </br> 
      </font> 
      </div> 
     </br> 
     </b> 
    </font> 
    </div> 
</br></div> 

C#:

public static byte[] ConvertHtmlToPdf(string html) 
{ 
    html = HtmlPostProcessor.Process(html); 
    byte[] fileData = null; 
    string tempPath = ConfigurationManager.AppSettings["TempDirectory"]; 
    string tempPDFFile = Path.Combine(tempPath, Guid.NewGuid() + ".pdf"); 
    Document document = new Document(PageSize.LETTER, 50, 50, 50, 50); 

    using (FileStream fs = new FileStream(tempPDFFile, FileMode.Create)) 
    { 
     PdfWriter.GetInstance(document, fs); 
     using (StringReader stringReader = new StringReader(html)) 
     { 
      List<IElement> parsedList = HTMLWorker.ParseToList(stringReader, null); 
      document.Open(); 
      foreach (IElement item in parsedList) 
      { 
       document.Add(item); 
      } 
      document.Close(); 
     } 
    } 

    FileStream generatedPDF = File.Open(tempPDFFile, FileMode.Open); 
    fileData = new byte[(int)generatedPDF.Length]; 
    int result = generatedPDF.Read(fileData, 0, (int)generatedPDF.Length); 

    generatedPDF.Close(); 

    File.Delete(tempPDFFile); 

    return fileData; 
} 

編輯

我一直在使用iTextSharp的版本5.1.1.0 。

回答

2

最簡單的蠻力方法是在之前調用FontFactory.RegisterDirectories()調用HTMLWorker.ParseToList()。但需要注意的 - 該方法嘗試在運行的系統上註冊/圖所有字體。

所以,如果你在ASP.NET運行這一點,例如,你可能想要把在Global.asax中調用。

編輯:使用FontFactory.RegisterDirectories()工作例如,你上面提供的HTML:

FontFactory.RegisterDirectories(); 
using (Document document = new Document()) { 
    PdfWriter.GetInstance(document, Response.OutputStream); 
    document.Open(); 
    List<IElement> objects = HTMLWorker.ParseToList(
    new StringReader(html), null); 
    foreach (IElement element in objects) { 
    document.Add(element); 
    } 
} 

剛剛替補Response.OutputStream與您所選擇的StreamResult PDF file from above

+0

有AW只註冊幾種字體?說8個網頁字體? – capn

+0

此外,插入線FontFactory.RegisterDirectories()HTMLWorker.ParseToList前右()並沒有這樣做,除了讓它慢的事情,但我會查看您鏈接到更多的明天那個文件。謝謝! – capn

+0

您使用的是哪個版本?我在你的例子中使用HTML測試5.1.3,它工作。 [結果PDF文件在這裏](http://goo.gl/Tv242)。在打開「Document」對象之前,您可能希望將調用插入'FontFactory.RegisterDirectories()',對不起。我會試着看看我能否拿出一個例子來在今天/明天晚些時候註冊一定數量的字體。 – kuujinbo

1

HTMLWorker已經過時了。您需要切換到新的XMLWorker課程。 但是,如果你想使用HTMLWorker,你可以定義一個全局樣式一樣好:

StyleSheet styles = new StyleSheet(); 
styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.FONTFAMILY, "tahoma"); 
//... 
//and then 
var parsedHtmlElements = HTMLWorker.ParseToList(data, styles); 
+0

我無法在iTextSharp庫中的任何位置找到XMLWorker,我只看到它在Java iText庫中引用。有沒有我失蹤的名稱空間? – capn

+0

你可以在這裏找到它:http://www.nuget.org/packages/itextsharp.xmlworker/ – VahidN