2011-12-09 7 views
1

私はHTMLリッチテキストエディタを使って動的PDFレポート用のテンプレートを作成していますが、面。iTextSharpを使用したhtmlからpdfへの世代のフォントの変更はありません

このエディタではCSSスタイルの代わりにfontタグを使用していますので、代わりにスタイルを使用してフォントタグを同等のタグにプログラムで変更できます。

HTML(はいその汚い、そのWYSIWYGエディタから):

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

EDIT

私はiTextSharpのバージョン5.1.1.0を使用してきました。

答えて

2

最も単純な、ブルートフォースの方法は、 の前にを呼び出すことです。HTMLWorker.ParseToList()を呼び出します。ただし、このメソッドは、実行中のシステムにのフォントをすべて登録/マップしようとします。フォントを登録しようとします。

たとえば、ASP.NETでこれを実行している場合、おそらくglobal.asaxに呼び出しを入れたいと思うかもしれません。

EDIT:ワーキング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); 
    } 
} 

をちょうどあなたの好みのStreamResponse.OutputStreamを代用。 Result PDF file from above

+0

と連携AWがありますほんの数個のフォントを登録するのですか? 8つのWebフォントを教えてください。 – capn

+0

また、HTMLWorker.ParseToList()の直前にあるFontFactory.RegisterDirectories()の行を挿入するのは、遅くする以外のことはしませんでしたが、明日よりリンクしたドキュメントを見ていきます。ありがとう! – 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

関連する問題