2013-03-26 3 views
5

PDFテンプレートを入力するのにiTextSharpを使用しています。私が使っているデータはデータベースに保存されており、フォーマットはHTMLです。私の問題は、このテキストでAcroFieldをロードしたときに改行を行いますが、太字ではありません。でもイタリック体であるです。私はすでにHtmlWorkerを使用しようとしましたが、すべての例ではHTMLPDFに変換するために使用されていますが、AcroFieldをPDFテンプレートに設定しようとしています。どんな助けもありがとう。iTextSharpを使用してHTML書式のテキストでPDFテンプレートacrofieldを入力してください

+0

あなたは必ず助けたリッチテキストフィールドhttp://stackoverflow.com/a/4412527/231316 –

答えて

9

フォーラムやiTextsharpのソースコードを見て、私は解決策を見つけた。 AcrofieldにHTML形式のテキストを入力する代わりに、私はColumnTextを使用しました。私はhtmlテキストを解析し、IElementsを段落に読み込みます。その後、段落をColumnTextに追加します。次に、フィールドの座標を使用して、Acrofieldの位置の上にColumnTextを重ねました。

public void AddHTMLToContent(String htmlText,PdfContentByte contentBtye,IList<AcroFields.FieldPosition> pos) 
    { 
     Paragraph par = new Paragraph(); 
     ColumnText c1 = new ColumnText(contentBtye); 
     try 
     { 
      List<IElement> elements = HTMLWorker.ParseToList(new StringReader(htmlText),null); 
      foreach (IElement element in elements) 
      { 
       par.Add(element); 
      } 

      c1.AddElement(par); 
      c1.SetSimpleColumn(pos[0].position.Left, pos[0].position.Bottom, pos[0].position.Right, pos[0].position.Top); 
      c1.Go(); //very important!!! 
     } 
     catch (Exception ex) 
     { 

      throw; 
     } 
    } 

次は、この関数の呼び出し例です。

string htmlText ="<b>Hello</b><br /><i>World</i>"; 
IList<AcroFields.FieldPosition> pos = form.GetFieldPositions("Field1"); 
//Field1 is the name of the field in the PDF Template you are trying to fill/overlay 
AddHTMLToContent(htmlText, stamp.GetOverContent(pos[0].page), pos); 
//stamp is the PdfStamper in this example 

これを実行しているうちに実行したことの1つは、私のAcrofieldに定義済みのフォントサイズがあったということです。この関数はフィールドの上にColumnTextを設定するので、フォントの変更はその関数で行わなければなりません。ここでは、フォントサイズを変更する例です:

public void AddHTMLToContent(String htmlText,PdfContentByte contentBtye,IList<AcroFields.FieldPosition> pos) 
    { 
     Paragraph par = new Paragraph(); 
     ColumnText c1 = new ColumnText(contentBtye); 
     try 
     { 
      List<IElement> elements = HTMLWorker.ParseToList(new StringReader(htmlText),null); 
      foreach (IElement element in elements) 
      { 
       foreach (Chunk chunk in element.Chunks) 
       { 
        chunk.Font.Size = 14; 
       } 
      } 
      par.Add(elements[0]); 
      c1.AddElement(par); 
      c1.SetSimpleColumn(pos[0].position.Left, pos[0].position.Bottom, pos[0].position.Right, pos[0].position.Top); 
      c1.Go();//very important!!! 
     } 
     catch (Exception ex) 
     { 

      throw; 
     } 
    } 

私は、これは将来の誰かいくつかの時間とエネルギーを節約したいと考えています。

+0

を使用してについては、この記事を参照してください...このやや複雑なアプローチが働いていました。あなたの発見を投稿していただきありがとうございます! 'fields.SetFieldRichValue'は動作しません。私は今iTextSharp 5.4.2を使用しています。 –

0

私はここ数カ月の間にこのコードを微調整しなければなりませんでした。

public void Final(string text,string fieldName,string filename) 
    { 
     iTextSharp.text.pdf.PdfReader reader = null; 
     iTextSharp.text.pdf.PdfStamper stamp = null; 

     reader = new PdfReader(file path to template); 
     stamp = new PdfStamper(reader, new FileStream(path to new file, FileMode.CreateNew)); 

     AcroFields form = stamp.AcroFields; 

     //get the position of the field 
     IList<AcroFields.FieldPosition> pos = form.GetFieldPositions(fieldName); 
     //tell itextSharp to overlay this content 
     PdfContentByte contentBtye = stamp.GetOverContent(pos[0].page); 

     //create a new paragraph 
     Paragraph par = new Paragraph(); 
     //parse html 
     List<IElement> elements = HTMLWorker.ParseToList(new StringReader(text), null); 
     for (int k = 0; k < elements.Count; k++) 
     { 
      par.Add((IElement)elements[k]); 
     } 
     //create a ColumnText to hold the paragraph and set position to the position of     the field 
     ColumnText ct = new ColumnText(contentBtye); 
     ct.SetSimpleColumn(pos[0].position.Left, pos[0].position.Bottom, pos[0].position.Right, pos[0].position.Top); 
     ct.AddElement(par); 
     ct.Go(); 
     stamp.Close(); 
     reader.Close(); 

    } 
関連する問題